From 6bb60cb36f6bc7ba6db135250e35cf70da80424b Mon Sep 17 00:00:00 2001 From: Peter Conijn Date: Wed, 22 Feb 2023 10:44:30 +0100 Subject: [PATCH 01/60] Minor fixes to pattern pages --- content/docs/patterns/facade-pattern/index.md | 3 +++ .../patterns/generic-method-pattern/index.md | 18 ++++++++----- .../patterns/template-method-pattern/index.md | 25 +++++++++---------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/content/docs/patterns/facade-pattern/index.md b/content/docs/patterns/facade-pattern/index.md index d9e44757..965a4adb 100644 --- a/content/docs/patterns/facade-pattern/index.md +++ b/content/docs/patterns/facade-pattern/index.md @@ -64,6 +64,9 @@ To achieve this, we are using [access modifiers](https://docs.microsoft.com/bs-c _The Facade_ ```AL +/// +/// Codeunit to extract image information. +/// codeunit 3971 Image { Access = Public; diff --git a/content/docs/patterns/generic-method-pattern/index.md b/content/docs/patterns/generic-method-pattern/index.md index f5ad9769..db880892 100644 --- a/content/docs/patterns/generic-method-pattern/index.md +++ b/content/docs/patterns/generic-method-pattern/index.md @@ -53,7 +53,8 @@ codeunit 53100 "WLD BlockCustomer Meth" var IsHandled: Boolean; begin - if not ConfirmBlockCustomer(HideDialog) then exit; + if not ConfirmBlockCustomer(HideDialog) then + exit; OnBeforeBlockCustomer(Cust, IsHandled); DoBlockCustomer(Cust, IsHandled); OnAfterBlockCustomer(Cust); @@ -77,7 +78,8 @@ codeunit 53100 "WLD BlockCustomer Meth" begin DefaultAnswer := true; - if HideDialog then exit(DefaultAnswer); + if HideDialog then + exit(DefaultAnswer); exit(ConfirmManagement.GetResponseOrDefault(ConfirmQst, DefaultAnswer)); end; @@ -85,7 +87,8 @@ codeunit 53100 "WLD BlockCustomer Meth" var AcknowledgeMsg: Label 'You successfully executed "BlockCustomer"'; begin - if not GuiAllowed or HideDialog then exit; + if not GuiAllowed or HideDialog then + exit; Message(AcknowledgeMsg); end; @@ -126,7 +129,8 @@ codeunit 53100 "WLD BlockCustomer Meth" var IsHandled: Boolean; begin - if not ConfirmBlockCustomer(HideDialog) then exit; + if not ConfirmBlockCustomer(HideDialog) then + exit; ... AcknowledgeBlockCustomer(HideDialog) end; @@ -140,7 +144,8 @@ codeunit 53100 "WLD BlockCustomer Meth" begin DefaultAnswer := true; - if HideDialog then exit(DefaultAnswer); + if HideDialog then + exit(DefaultAnswer); exit(ConfirmManagement.GetResponseOrDefault(ConfirmQst, DefaultAnswer)); end; @@ -148,7 +153,8 @@ codeunit 53100 "WLD BlockCustomer Meth" var AcknowledgeMsg: Label 'You successfully executed "BlockCustomer"'; begin - if not GuiAllowed or HideDialog then exit; + if not GuiAllowed or HideDialog then + exit; Message(AcknowledgeMsg); end; ... diff --git a/content/docs/patterns/template-method-pattern/index.md b/content/docs/patterns/template-method-pattern/index.md index 5465efec..81eab9c3 100644 --- a/content/docs/patterns/template-method-pattern/index.md +++ b/content/docs/patterns/template-method-pattern/index.md @@ -57,16 +57,15 @@ We start with the template ```al codeunit 50000 ExportTemplate { - procedure ExportData(export: Interface IDataExport) + procedure ExportData(Export: Interface IDataExport) begin - if not export.CheckData() then + if not Export.CheckData() then exit; - if export.GetLinesToExport() then begin + if Export.GetLinesToExport() then repeat - export.ExportLine(); - until not export.NextLine(); - end; - export.Finish(); + Export.ExportLine(); + until not Export.NextLine(); + Export.Finish(); end; } ``` @@ -132,13 +131,13 @@ codeunit 50002 ExportOrders { procedure ExportOrder(DocType: Enum "Sales Document Type"; No: Code[10]) var - export: Codeunit ExportTemplate; - exportImpl: Codeunit SalesHeaderExport; - exportInt: Interface IDataExport; + Export: Codeunit ExportTemplate; + ExportImpl: Codeunit SalesHeaderExport; + ExportInt: Interface IDataExport; begin - exportImpl.SetSalesHeader(DocType, No); - exportInt := exportImpl; - export.ExportData(exportInt); + ExportImpl.SetSalesHeader(DocType, No); + ExportInt := exportImpl; + Export.ExportData(exportInt); end; } ``` From 6f8b7b345124e46a9a5f0a094f55ae0b9a1797af Mon Sep 17 00:00:00 2001 From: Luuk Date: Tue, 6 Jun 2023 10:52:52 +0200 Subject: [PATCH 02/60] SetLoadFields --- .../docs/BestPractices/SetLoadFields/Index.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 content/docs/BestPractices/SetLoadFields/Index.md diff --git a/content/docs/BestPractices/SetLoadFields/Index.md b/content/docs/BestPractices/SetLoadFields/Index.md new file mode 100644 index 00000000..259ba178 --- /dev/null +++ b/content/docs/BestPractices/SetLoadFields/Index.md @@ -0,0 +1,44 @@ +--- +title: "SetLoadFields" +tags: ["AL","Readability"] +categories: ["Best Practice"] +--- + +See the documentation on learn.microsoft.com for more information about [SetLoadFields](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-setloadfields-method). + +For the performance of your code it is important that you use SetLoadFields as much as possible. + +If you want to retrieve a record from the database to check if the record is available the advice is to set an SetLoadFields on the primary key fields of the table so only those fields will be retrieved from the database. + +## Bad code + +```AL +if not Item.Get(ItemNo) then + exit(); +``` + +## Good code + +```AL +Item.SetLoadFields("No."); +if not Item.Get(ItemNo) then + exit(); +``` + +Place the SetLoadFields in the code before filtering the record (there is no need to record filterfields in the SetLoadFields). +## Bad code + +```AL +Item.Setrange("Third Party Item Exists", false); +Item.SetLoadFields("Item Category Code"); +Item.Get(ItemNo); +``` + +## Good code + +```AL +Item.SetLoadFields("Item Category Code"); +Item.Setrange("Third Party Item Exists", false); +Item.Get(ItemNo); +``` + From b317951d6386aaf6dbaa4f6122423cf25735d0af Mon Sep 17 00:00:00 2001 From: Luuk Date: Tue, 6 Jun 2023 10:58:57 +0200 Subject: [PATCH 03/60] SetLoadFields --- content/docs/BestPractices/SetLoadFields/Index.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/docs/BestPractices/SetLoadFields/Index.md b/content/docs/BestPractices/SetLoadFields/Index.md index 259ba178..11453790 100644 --- a/content/docs/BestPractices/SetLoadFields/Index.md +++ b/content/docs/BestPractices/SetLoadFields/Index.md @@ -8,7 +8,7 @@ See the documentation on learn.microsoft.com for more information about [SetLoad For the performance of your code it is important that you use SetLoadFields as much as possible. -If you want to retrieve a record from the database to check if the record is available the advice is to set an SetLoadFields on the primary key fields of the table so only those fields will be retrieved from the database. +If you want to retrieve a record from the database to check if the record is available the advice is to use SetLoadFields on the primary key fields of the table so only those fields will be retrieved from the database. ## Bad code @@ -25,11 +25,12 @@ if not Item.Get(ItemNo) then exit(); ``` -Place the SetLoadFields in the code before filtering the record (there is no need to record filterfields in the SetLoadFields). + +Place the SetLoadFields in the code before filtering the record (there is no need to record filter fields in the SetLoadFields because these will be retrieved automatically). ## Bad code ```AL -Item.Setrange("Third Party Item Exists", false); +Item.SetRange("Third Party Item Exists", false); Item.SetLoadFields("Item Category Code"); Item.Get(ItemNo); ``` @@ -38,7 +39,7 @@ Item.Get(ItemNo); ```AL Item.SetLoadFields("Item Category Code"); -Item.Setrange("Third Party Item Exists", false); +Item.SetRange("Third Party Item Exists", false); Item.Get(ItemNo); ``` From 6b3d740bbbced8d9ac79f50abe76b73ceb13a31a Mon Sep 17 00:00:00 2001 From: Luuk Date: Thu, 10 Aug 2023 10:38:28 +0200 Subject: [PATCH 04/60] #SetLoadFields --- content/docs/BestPractices/SetLoadFields/Index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/BestPractices/SetLoadFields/Index.md b/content/docs/BestPractices/SetLoadFields/Index.md index 11453790..465aea6f 100644 --- a/content/docs/BestPractices/SetLoadFields/Index.md +++ b/content/docs/BestPractices/SetLoadFields/Index.md @@ -8,7 +8,7 @@ See the documentation on learn.microsoft.com for more information about [SetLoad For the performance of your code it is important that you use SetLoadFields as much as possible. -If you want to retrieve a record from the database to check if the record is available the advice is to use SetLoadFields on the primary key fields of the table so only those fields will be retrieved from the database. +If you want to retrieve a record from the database to check if the record is available always use SetLoadFields on the primary key fields of the table so only those fields will be retrieved from the database. ## Bad code @@ -26,20 +26,20 @@ if not Item.Get(ItemNo) then ``` -Place the SetLoadFields in the code before filtering the record (there is no need to record filter fields in the SetLoadFields because these will be retrieved automatically). +Place the SetLoadFields in the code before the line of the Get (or find). (there is no need to record filter fields in the SetLoadFields because these will be retrieved automatically). ## Bad code ```AL -Item.SetRange("Third Party Item Exists", false); Item.SetLoadFields("Item Category Code"); +Item.SetRange("Third Party Item Exists", false); Item.Get(ItemNo); ``` ## Good code ```AL -Item.SetLoadFields("Item Category Code"); Item.SetRange("Third Party Item Exists", false); +Item.SetLoadFields("Item Category Code"); Item.Get(ItemNo); ``` From 892862e068b874a4577ba02b9034db4e96463971 Mon Sep 17 00:00:00 2001 From: Luuk Date: Fri, 22 Sep 2023 12:13:18 +0200 Subject: [PATCH 05/60] #SetLoadFIelds --- .../docs/BestPractices/SetLoadFields/Index.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/content/docs/BestPractices/SetLoadFields/Index.md b/content/docs/BestPractices/SetLoadFields/Index.md index 465aea6f..684b751d 100644 --- a/content/docs/BestPractices/SetLoadFields/Index.md +++ b/content/docs/BestPractices/SetLoadFields/Index.md @@ -43,3 +43,27 @@ Item.SetLoadFields("Item Category Code"); Item.Get(ItemNo); ``` +Place the SetLoadFields in the code before the case statement +## Bad code + +```AL +Item.SetLoadFields("Item Category Code"); +ItemCategoryCode := FindItemCategoryCode; + +case true of + Item.Get(ItemNo): + SetItemCategoryCode(Item, ItemCategoryCode); +end; +``` + +## Good code + +```AL +ItemCategoryCode := FindItemCategoryCode; +Item.SetLoadFields("Item Category Code"); + +case true of + Item.Get(ItemNo): + SetItemCategoryCode(Item, ItemCategoryCode); +end; +``` From 8befe1b704b0a0ad3748d9469281ad4331fbf934 Mon Sep 17 00:00:00 2001 From: Luuk Date: Fri, 22 Sep 2023 13:01:23 +0200 Subject: [PATCH 06/60] #SetLoadFields --- content/docs/BestPractices/SetLoadFields/Index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/BestPractices/SetLoadFields/Index.md b/content/docs/BestPractices/SetLoadFields/Index.md index 684b751d..e3aae546 100644 --- a/content/docs/BestPractices/SetLoadFields/Index.md +++ b/content/docs/BestPractices/SetLoadFields/Index.md @@ -32,7 +32,7 @@ Place the SetLoadFields in the code before the line of the Get (or find). (there ```AL Item.SetLoadFields("Item Category Code"); Item.SetRange("Third Party Item Exists", false); -Item.Get(ItemNo); +Item.FindFirst(); ``` ## Good code @@ -40,7 +40,7 @@ Item.Get(ItemNo); ```AL Item.SetRange("Third Party Item Exists", false); Item.SetLoadFields("Item Category Code"); -Item.Get(ItemNo); +Item.FindFirst(); ``` Place the SetLoadFields in the code before the case statement From 6338758838b338b425faf6bc08ba0a00dcb25bd8 Mon Sep 17 00:00:00 2001 From: Henrik Helgesen Date: Fri, 22 Sep 2023 08:01:31 -0700 Subject: [PATCH 07/60] Update to official Deployment Create hugo.yml --- .github/workflows/hugo.yml | 75 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 .github/workflows/hugo.yml diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml new file mode 100644 index 00000000..6daddb13 --- /dev/null +++ b/.github/workflows/hugo.yml @@ -0,0 +1,75 @@ +# Sample workflow for building and deploying a Hugo site to GitHub Pages +name: Deploy Hugo site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +# Default to bash +defaults: + run: + shell: bash + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.114.0 + steps: + - name: Install Hugo CLI + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Install Dart Sass + run: sudo snap install dart-sass + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Install Node.js dependencies + run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" + - name: Build with Hugo + env: + # For maximum backward compatibility with Hugo modules + HUGO_ENVIRONMENT: production + HUGO_ENV: production + run: | + hugo \ + --minify \ + --baseURL "${{ steps.pages.outputs.base_url }}/" + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + path: ./public + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 From f88022c7f49e67f1e505aa46af3a3b95809ce374 Mon Sep 17 00:00:00 2001 From: Henrik Helgesen Date: Fri, 22 Sep 2023 08:02:41 -0700 Subject: [PATCH 08/60] Update deployment method to Official hugo method Create hugo.yml --- .github/workflows/hugo.yml | 75 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 .github/workflows/hugo.yml diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml new file mode 100644 index 00000000..06d5654f --- /dev/null +++ b/.github/workflows/hugo.yml @@ -0,0 +1,75 @@ +# Sample workflow for building and deploying a Hugo site to GitHub Pages +name: Deploy Hugo site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +# Default to bash +defaults: + run: + shell: bash + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.118.2 + steps: + - name: Install Hugo CLI + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Install Dart Sass + run: sudo snap install dart-sass + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Install Node.js dependencies + run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" + - name: Build with Hugo + env: + # For maximum backward compatibility with Hugo modules + HUGO_ENVIRONMENT: production + HUGO_ENV: production + run: | + hugo \ + --minify \ + --baseURL "${{ steps.pages.outputs.base_url }}/" + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + path: ./public + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 From 87ec4304814f3134278e4ef40bf12fe800fc4a50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 09:06:50 +0000 Subject: [PATCH 09/60] Bump postcss from 8.4.6 to 8.4.31 Bumps [postcss](https://github.com/postcss/postcss) from 8.4.6 to 8.4.31. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.6...8.4.31) --- updated-dependencies: - dependency-name: postcss dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 54 ++++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3afc9d20..310b9309 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "devDependencies": { "autoprefixer": "^10.4.2", - "postcss": "^8.4.6", + "postcss": "^8.4.31", "postcss-cli": "^9.1.0" } }, @@ -518,10 +518,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -590,21 +596,31 @@ } }, "node_modules/postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "nanoid": "^3.2.0", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-cli": { @@ -1268,9 +1284,9 @@ } }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "node-releases": { @@ -1316,12 +1332,12 @@ "dev": true }, "postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "requires": { - "nanoid": "^3.2.0", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } diff --git a/package.json b/package.json index 1f75ad3a..382dd766 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "homepage": "https://github.com/google/docsy-example#readme", "devDependencies": { "autoprefixer": "^10.4.2", - "postcss": "^8.4.6", + "postcss": "^8.4.31", "postcss-cli": "^9.1.0" } } From 3353c5184cc03965958b3a7e9ec074a3a605f474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Vercaemst?= Date: Fri, 24 Nov 2023 15:16:38 +0100 Subject: [PATCH 10/60] Fix formatting issues and syntax errors in code --- .../docs/BestPractices/blank-lines/index.md | 4 ++-- .../patterns/data-migration-facade/index.md | 6 +++--- content/docs/patterns/command-queue/index.md | 18 +++++++++--------- .../patterns/event-bridge-pattern/index.md | 12 ++++++------ .../patterns/generic-method-pattern/index.md | 14 +++++++------- .../patterns/template-method-pattern/index.md | 10 +++++----- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/content/docs/BestPractices/blank-lines/index.md b/content/docs/BestPractices/blank-lines/index.md index 6c5a0303..7f1b8efe 100644 --- a/content/docs/BestPractices/blank-lines/index.md +++ b/content/docs/BestPractices/blank-lines/index.md @@ -17,7 +17,7 @@ Do not use blank lines: ### Bad code ```al -procedure MATRIX_OnDrillDown(MATRIX_ColumnOrdinal: Integer); +procedure MATRIX_OnDrillDown(MATRIX_ColumnOrdinal: Integer) begin SetupDrillDownCol(MATRIX_ColumnOrdinal); @@ -29,7 +29,7 @@ end; ### Good code ```al -procedure MATRIX_OnDrillDown(MATRIX_ColumnOrdinal: Integer); +procedure MATRIX_OnDrillDown(MATRIX_ColumnOrdinal: Integer) begin SetupDrillDownCol(MATRIX_ColumnOrdinal); DrillDown(false, ValueType); diff --git a/content/docs/NAVPatterns/patterns/data-migration-facade/index.md b/content/docs/NAVPatterns/patterns/data-migration-facade/index.md index 874f937b..e4e5aa4e 100644 --- a/content/docs/NAVPatterns/patterns/data-migration-facade/index.md +++ b/content/docs/NAVPatterns/patterns/data-migration-facade/index.md @@ -108,7 +108,7 @@ begin end; end; -procedure MigrateItemUnitOfMeasure(ItemDataMigrationFacade : Codeunit "Item Data Migration Facade"; ItemJson : Text); +procedure MigrateItemUnitOfMeasure(ItemDataMigrationFacade : Codeunit "Item Data Migration Facade"; ItemJson : Text) var MyUnitCodeStagingTable: Record "My Unit Code Staging Table"; DataMigrationStatusFacade: Codeunit "Data Migration Status Facade"; @@ -154,7 +154,7 @@ _Figure 3: Simplified sequence diagram of the data migration with staging tables Below is a simplified example showing how to create an item: ```al [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Data Migration Facade", 'OnMigrateItem', '', true, true)] -procedure OnMigrateItem(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId); +procedure OnMigrateItem(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId) var MyItemStagingTable : Record "My Item Staging Table"; begin @@ -186,7 +186,7 @@ Below is another example showing how to use additional events to set fields that ```al [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Data Migration Facade", 'OnMigrateItemUnitOfMeasure', '', true, true)] -procedure OnMigrateItemUnitOfMeasure(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId); +procedure OnMigrateItemUnitOfMeasure(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId) var MyItemStagingTable : Record "My Item Staging Table"; MyUnitCodeStagingTable : Record "My Unit Code Staging Table"; diff --git a/content/docs/patterns/command-queue/index.md b/content/docs/patterns/command-queue/index.md index 036d080f..a414765f 100644 --- a/content/docs/patterns/command-queue/index.md +++ b/content/docs/patterns/command-queue/index.md @@ -26,7 +26,7 @@ First the command interface, it only has one procedure to execute the command ```al interface ICommand { - procedure Execute(); + procedure Execute() } ``` @@ -52,7 +52,7 @@ codeunit 50100 "Queue" count += 1; end; - procedure Pop() value: Interface ICommand; + procedure Pop() value: Interface ICommand begin if count > 0 then begin value := first.GetValue(); @@ -78,22 +78,22 @@ codeunit 50100 "Queue" codeunit 50102 "QueueEntry" { - procedure SetValue(var v: Interface ICommand); + procedure SetValue(var v: Interface ICommand) begin value := v; end; - procedure GetValue(): Interface ICommand; + procedure GetValue(): Interface ICommand begin exit(value); end; - procedure GetNextEntry(): Codeunit QueueEntry; + procedure GetNextEntry(): Codeunit QueueEntry begin exit(NextEntry); end; - procedure SetNextEntry(var Entry: Codeunit QueueEntry); + procedure SetNextEntry(var Entry: Codeunit QueueEntry) begin NextEntry := Entry; end; @@ -136,7 +136,7 @@ codeunit 50104 "SalesOrderPostCommander" implements ICommand codeunit 50103 "MessageCommander" implements ICommand { - procedure SetText(value: Text); + procedure SetText(value: Text) begin t := value; end; @@ -185,7 +185,7 @@ codeunit 50105 PatchPostQueue // Filter Sales Orders here end; - local procedure AddMessageToQueue(message : Text); + local procedure AddMessageToQueue(message : Text) var t: Codeunit MessageCommander; object: Interface ICommand; @@ -195,7 +195,7 @@ codeunit 50105 PatchPostQueue queue.Push(object); end; - local procedure AddSalesOrderToQueue(No : Text); + local procedure AddSalesOrderToQueue(No : Text) var SaleOrderCommander: Codeunit SalesOrderPostCommander; object: Interface ICommand; diff --git a/content/docs/patterns/event-bridge-pattern/index.md b/content/docs/patterns/event-bridge-pattern/index.md index 7fde0683..e05deadc 100644 --- a/content/docs/patterns/event-bridge-pattern/index.md +++ b/content/docs/patterns/event-bridge-pattern/index.md @@ -20,8 +20,8 @@ Like in this example, we have an interface, to implement different ways for gett ```AL interface "IScale" { - procedure GetWeight(): Decimal; - procedure Tare(); + procedure GetWeight(): Decimal + procedure Tare() } ``` @@ -35,13 +35,13 @@ So, if we would implement it like this, it isn't really extensible, as a differe ```AL codeunit 50407 "Scale Wrong" implements IScale { - procedure GetWeight() Result: Decimal; + procedure GetWeight() Result: Decimal begin //TODO: Implement Bar GetWeight OnAfterGetWeight(Result); end; - procedure Tare(); + procedure Tare() begin //TODO: Implement Bar Tare OnAfterTare(); @@ -86,13 +86,13 @@ codeunit 50405 "Scale Bar" implements IScale var IScaleTriggers: Codeunit "IScale Triggers"; - procedure GetWeight() Result: Decimal; + procedure GetWeight() Result: Decimal begin //TODO: Implement Bar GetWeight IScaleTriggers.OnAfterGetWeight(Result); end; - procedure Tare(); + procedure Tare() begin //TODO: Implement Bar Tare IScaleTriggers.OnAfterTare(); diff --git a/content/docs/patterns/generic-method-pattern/index.md b/content/docs/patterns/generic-method-pattern/index.md index db880892..a16e2b64 100644 --- a/content/docs/patterns/generic-method-pattern/index.md +++ b/content/docs/patterns/generic-method-pattern/index.md @@ -61,7 +61,7 @@ codeunit 53100 "WLD BlockCustomer Meth" AcknowledgeBlockCustomer(HideDialog) end; - local procedure DoBlockCustomer(var Cust: Record Customer; IsHandled: Boolean); + local procedure DoBlockCustomer(var Cust: Record Customer; IsHandled: Boolean) begin if IsHandled then exit; @@ -93,12 +93,12 @@ codeunit 53100 "WLD BlockCustomer Meth" end; [IntegrationEvent(false, false)] - local procedure OnBeforeBlockCustomer(var Cust: Record Customer; var IsHandled: Boolean); + local procedure OnBeforeBlockCustomer(var Cust: Record Customer; var IsHandled: Boolean) begin end; [IntegrationEvent(false, false)] - local procedure OnAfterBlockCustomer(var Cust: Record Customer); + local procedure OnAfterBlockCustomer(var Cust: Record Customer) begin end; } @@ -181,12 +181,12 @@ codeunit 53100 "WLD BlockCustomer Meth" end; ... [IntegrationEvent(false, false)] - local procedure OnBeforeBlockCustomer(var Cust: Record Customer; var IsHandled: Boolean); + local procedure OnBeforeBlockCustomer(var Cust: Record Customer; var IsHandled: Boolean) begin end; [IntegrationEvent(false, false)] - local procedure OnAfterBlockCustomer(var Cust: Record Customer); + local procedure OnAfterBlockCustomer(var Cust: Record Customer) begin end; } @@ -200,7 +200,7 @@ The relevant part is: ```AL codeunit 53100 "WLD BlockCustomer Meth" { - internal procedure BlockCustomer(var Cust: Record Customer; HideDialog: Boolean); + internal procedure BlockCustomer(var Cust: Record Customer; HideDialog: Boolean) var IsHandled: Boolean; begin @@ -209,7 +209,7 @@ codeunit 53100 "WLD BlockCustomer Meth" ... end; - local procedure DoBlockCustomer(var Cust: Record Customer; IsHandled: Boolean); + local procedure DoBlockCustomer(var Cust: Record Customer; IsHandled: Boolean) begin if IsHandled then exit; diff --git a/content/docs/patterns/template-method-pattern/index.md b/content/docs/patterns/template-method-pattern/index.md index 81eab9c3..95570ecd 100644 --- a/content/docs/patterns/template-method-pattern/index.md +++ b/content/docs/patterns/template-method-pattern/index.md @@ -75,11 +75,11 @@ As the second part we need an interface for the export functions ```al interface IDataExport { - procedure CheckData(): Boolean; - procedure GetLinesToExport(): Boolean; - procedure ExportLine(); - procedure NextLine(): Boolean; - procedure Finish(); + procedure CheckData(): Boolean + procedure GetLinesToExport(): Boolean + procedure ExportLine() + procedure NextLine(): Boolean + procedure Finish() } ``` From 119b1df1c69e26f705a45ec87e00d101d52cf061 Mon Sep 17 00:00:00 2001 From: Luuk Date: Wed, 10 Jul 2024 15:59:55 +0200 Subject: [PATCH 11/60] First draft --- content/docs/patterns/error-handling/index.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 content/docs/patterns/error-handling/index.md diff --git a/content/docs/patterns/error-handling/index.md b/content/docs/patterns/error-handling/index.md new file mode 100644 index 00000000..c6156690 --- /dev/null +++ b/content/docs/patterns/error-handling/index.md @@ -0,0 +1,24 @@ ++++ +title = "Error Handling" +tags = ["AL"] +categories = ["Pattern"] ++++ + +_Created by Microsoft, Described by Luuk Busschers (Dysel)_ + +## Abstract + +The "Error Handling" system is used extensively to provide information to users about missing information in the system or other issues because of which the started process cannot be completed through Microsoft Dynamics 365 Business Central. + +## Description +Because of there is already a lot written about how to use the error handling the best in several scenario's in this page you will find a link to documentation on learn.microsoft.com and a link to a video about this subject on youtube. These links can be found in the list of references. + +The Microsoft Learn part is about collecting errors which means that the process you did start will not be interupted when one error is given, it will collect the errors in the process an you are able to show the user afterwards which errors where given in the process. + +The youtube video shows more about errors presented in such way that the user will be informed about how to solve the error. + +## List of references + +For usage of number series, there is more information available on: +- [Microsoft Learn: Error collections](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-error-collection/) +- [Youtube: Microsoft Presents: User friendly error handling in AL](https://www.youtube.com/watch?v=D8233xMjVog&list=PLI1l3dMI8xlDM9onioMWUyMSCiFs_mMWw&index=27) \ No newline at end of file From 273de376d6b24ec4ce0475169739fd34ad7b8608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 06:55:37 +0000 Subject: [PATCH 12/60] rename config.yoml to hugo.toml --- config.toml => hugo.toml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename config.toml => hugo.toml (100%) diff --git a/config.toml b/hugo.toml similarity index 100% rename from config.toml rename to hugo.toml From 25208930585604d6d0a9796c2a70b61aef5ff44d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 07:21:06 +0000 Subject: [PATCH 13/60] fix custom params on the language top level was deprecated --- hugo.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hugo.toml b/hugo.toml index dc3f1478..16267af5 100644 --- a/hugo.toml +++ b/hugo.toml @@ -72,11 +72,12 @@ id = "" [languages] [languages.en] -description = "Guidelines for when Developing AL for Microsoft Dynamics 365 Business Central" -languageName = "English" title = "alguidelines.dev - Business Central Design Patterns" -# Weight used for sorting. +languageName = "English" weight = 1 +[languages.en.params] +description = "Guidelines for when Developing AL for Microsoft Dynamics 365 Business Central" +# Weight used for sorting. # Everything below this are Site Params From 77c64d7670f24a8c1575efd7eba3e24df146c3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 07:23:20 +0000 Subject: [PATCH 14/60] update .devcontainers --- .devcontainer/Dockerfile | 25 +++++++----------- .devcontainer/devcontainer.json | 47 ++++++++++++++------------------- 2 files changed, 29 insertions(+), 43 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 9025e028..71a0ef70 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,16 +1,17 @@ -# Update the NODE_VERSION arg in docker-compose.yml to pick a Node version: 10, 12, 14 -ARG NODE_VERSION=14 -FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${NODE_VERSION} +# syntax=docker/dockerfile:1 +FROM mcr.microsoft.com/devcontainers/base:ubuntu-22.04 + +# ARG USER=vscode +# ARG DEBIAN_FRONTEND=noninteractive +# RUN usermod -s /usr/bin/zsh ${USER} # VARIANT can be either 'hugo' for the standard version or 'hugo_extended' for the extended version. -ARG VARIANT=hugo +ARG VARIANT=hugo_extended # VERSION can be either 'latest' or a specific version number ARG VERSION=latest # Download Hugo -RUN apt-get update && apt-get install -y ca-certificates openssl git curl && \ - rm -rf /var/lib/apt/lists/* && \ - case ${VERSION} in \ +RUN case ${VERSION} in \ latest) \ export VERSION=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') ;;\ esac && \ @@ -27,12 +28,4 @@ RUN apt-get update && apt-get install -y ca-certificates openssl git curl && \ mv hugo /usr/bin/hugo # Hugo dev server port -EXPOSE 1313 - -# [Optional] Uncomment this section to install additional OS packages you may want. -# -# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends - -# [Optional] Uncomment if you want to install more global node packages -# RUN sudo -u node npm install -g +EXPOSE 1313 \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ae6786f0..d97f3b77 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,41 +1,34 @@ // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: // https://github.com/microsoft/vscode-dev-containers/tree/v0.217.4/containers/hugo { - "name": "Hugo (Community)", + "name": "Hugo", "build": { - "dockerfile": "Dockerfile", - "args": { - // Update VARIANT to pick hugo variant. - // Example variants: hugo, hugo_extended - // Rebuild the container if it already exists to update. - "VARIANT": "hugo_extended", - // Update VERSION to pick a specific hugo version. - // Example versions: latest, 0.73.0, 0,71.1 - // Rebuild the container if it already exists to update. - "VERSION": "latest", - // Update NODE_VERSION to pick the Node.js version: 12, 14 - "NODE_VERSION": "14", + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "html.format.templating": true + }, + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "bungcip.better-toml", + "davidanson.vscode-markdownlint", + "GitHub.vscode-pull-request-github" + ] } }, - // Set *default* container specific settings.json values on container create. - "settings": { - "html.format.templating": true, - }, - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "bungcip.better-toml", - "davidanson.vscode-markdownlint", - "GitHub.vscode-pull-request-github" - ], // Use 'forwardPorts' to make a list of ports inside the container available locally. "forwardPorts": [ 1313 ], + "remoteUser": "vscode", // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "git submodule update --init --recursive --depth 1 && npm i", - // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. - "remoteUser": "node", + // "postCreateCommand": "" "features": { - "git": "os-provided" + "ghcr.io/devcontainers/features/git:1": {}, + "ghcr.io/devcontainers/features/go:1": {}, + "ghcr.io/devcontainers/features/hugo:1": {} } } \ No newline at end of file From 3df13226c3dc4d66d6bd59aa3698fd1903cc1f00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 07:30:03 +0000 Subject: [PATCH 15/60] hugo mod init github.com/microsoft/alguidelines --- go.mod | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 go.mod diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..652dbb20 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/microsoft/alguidelines + +go 1.23.0 From 234a95fb3f35d19865549f6a9e84b74189616e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 07:30:41 +0000 Subject: [PATCH 16/60] update hugo.toml theme && hugo mod graph --- go.mod | 2 ++ go.sum | 4 ++++ hugo.toml | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 go.sum diff --git a/go.mod b/go.mod index 652dbb20..c8b8727f 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/microsoft/alguidelines go 1.23.0 + +require github.com/google/docsy v0.10.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..78bc9349 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/FortAwesome/Font-Awesome v0.0.0-20240402185447-c0f460dca7f7/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= +github.com/google/docsy v0.10.0 h1:6tMDacPwAyRWNCfvsn/9qGOZDQ8b0aRzjRZvnZPY5dg= +github.com/google/docsy v0.10.0/go.mod h1:c0nIAqmRTOuJ01F85U/wJPQtc3Zj9N58Kea9bOT2AJc= +github.com/twbs/bootstrap v5.3.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= diff --git a/hugo.toml b/hugo.toml index 16267af5..90d4fee3 100644 --- a/hugo.toml +++ b/hugo.toml @@ -4,7 +4,7 @@ languageCode = 'en-us' title = 'AL Guidelines' # Hugo allows theme composition (and inheritance). The precedence is from left to right. -theme = ["docsy"] +theme = ["github.com/google/docsy"] # Will give values to .Lastmod etc. enableGitInfo = true From 70a0e69751b37c67fc652cbba3e2612a19856ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 07:31:53 +0000 Subject: [PATCH 17/60] Removed docsy git submodule --- .gitmodules | 3 --- themes/docsy | 1 - 2 files changed, 4 deletions(-) delete mode 160000 themes/docsy diff --git a/.gitmodules b/.gitmodules index b76244d3..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "themes/docsy"] - path = themes/docsy - url = https://github.com/google/docsy.git diff --git a/themes/docsy b/themes/docsy deleted file mode 160000 index 66818eb0..00000000 --- a/themes/docsy +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 66818eb0905c014f342432c5fc918fc4b1c04b57 From 6d868fb3c5a84bbb974422aad65b3ccd4f411e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 07:45:54 +0000 Subject: [PATCH 18/60] remove package.json files --- package-lock.json | 1540 --------------------------------------------- package.json | 24 - 2 files changed, 1564 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 310b9309..00000000 --- a/package-lock.json +++ /dev/null @@ -1,1540 +0,0 @@ -{ - "name": "tech-doc-hugo", - "version": "0.0.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "tech-doc-hugo", - "version": "0.0.1", - "license": "ISC", - "devDependencies": { - "autoprefixer": "^10.4.2", - "postcss": "^8.4.31", - "postcss-cli": "^9.1.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", - "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fraction.js": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", - "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "dev": true, - "dependencies": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-cli": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.1.0.tgz", - "integrity": "sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==", - "dev": true, - "dependencies": { - "chokidar": "^3.3.0", - "dependency-graph": "^0.11.0", - "fs-extra": "^10.0.0", - "get-stdin": "^9.0.0", - "globby": "^12.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^3.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^4.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "postcss": "index.js" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", - "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true, - "engines": { - "node": ">=12" - } - } - }, - "dependencies": { - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", - "dev": true, - "requires": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "electron-to-chromium": { - "version": "1.4.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", - "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fraction.js": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", - "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", - "dev": true - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "dev": true, - "requires": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-cli": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.1.0.tgz", - "integrity": "sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==", - "dev": true, - "requires": { - "chokidar": "^3.3.0", - "dependency-graph": "^0.11.0", - "fs-extra": "^10.0.0", - "get-stdin": "^9.0.0", - "globby": "^12.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^3.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^4.0.0", - "yargs": "^17.0.0" - } - }, - "postcss-load-config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", - "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", - "dev": true, - "requires": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" - } - }, - "postcss-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 382dd766..00000000 --- a/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "tech-doc-hugo", - "version": "0.0.1", - "description": "Hugo theme for technical documentation.", - "main": "none.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/google/docsy-example.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/google/docsy-example/issues" - }, - "homepage": "https://github.com/google/docsy-example#readme", - "devDependencies": { - "autoprefixer": "^10.4.2", - "postcss": "^8.4.31", - "postcss-cli": "^9.1.0" - } -} From 3b4f6ed968e758de046715462cd4e4a8ace99c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 07:46:01 +0000 Subject: [PATCH 19/60] remove .gitmodules --- .gitmodules | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29b..00000000 From 6807e6f56e8dac121d176d32f938e200c270c9bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 08:03:53 +0000 Subject: [PATCH 20/60] Revert "remove package.json files" This reverts commit 6d868fb3c5a84bbb974422aad65b3ccd4f411e87. --- package-lock.json | 1540 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 24 + 2 files changed, 1564 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..310b9309 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1540 @@ +{ + "name": "tech-doc-hugo", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "tech-doc-hugo", + "version": "0.0.1", + "license": "ISC", + "devDependencies": { + "autoprefixer": "^10.4.2", + "postcss": "^8.4.31", + "postcss-cli": "^9.1.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", + "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.71", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", + "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", + "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.1.0.tgz", + "integrity": "sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^10.0.0", + "get-stdin": "^9.0.0", + "globby": "^12.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^3.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^4.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", + "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.4", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true, + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "requires": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", + "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "electron-to-chromium": { + "version": "1.4.71", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", + "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fraction.js": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", + "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", + "dev": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-cli": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.1.0.tgz", + "integrity": "sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==", + "dev": true, + "requires": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^10.0.0", + "get-stdin": "^9.0.0", + "globby": "^12.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^3.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^4.0.0", + "yargs": "^17.0.0" + } + }, + "postcss-load-config": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", + "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", + "dev": true, + "requires": { + "lilconfig": "^2.0.4", + "yaml": "^1.10.2" + } + }, + "postcss-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..382dd766 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "tech-doc-hugo", + "version": "0.0.1", + "description": "Hugo theme for technical documentation.", + "main": "none.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/google/docsy-example.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/google/docsy-example/issues" + }, + "homepage": "https://github.com/google/docsy-example#readme", + "devDependencies": { + "autoprefixer": "^10.4.2", + "postcss": "^8.4.31", + "postcss-cli": "^9.1.0" + } +} From 6f79046b481c93ceaee76f00b9daa4730c02a8b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 08:18:33 +0000 Subject: [PATCH 21/60] add node to .devcontainer features --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d97f3b77..5988aa90 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -29,6 +29,7 @@ "features": { "ghcr.io/devcontainers/features/git:1": {}, "ghcr.io/devcontainers/features/go:1": {}, - "ghcr.io/devcontainers/features/hugo:1": {} + "ghcr.io/devcontainers/features/hugo:1": {}, + "ghcr.io/devcontainers/features/node:1": {} } } \ No newline at end of file From 1955b65f4fdfafd37fd6a714124f129a5efd00a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 08:23:25 +0000 Subject: [PATCH 22/60] update package-lock.json --- package-lock.json | 621 +--------------------------------------------- 1 file changed, 1 insertion(+), 620 deletions(-) diff --git a/package-lock.json b/package-lock.json index 310b9309..f066b6e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "tech-doc-hugo", "version": "0.0.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -341,20 +341,6 @@ "node": ">=12" } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -931,610 +917,5 @@ "node": ">=12" } } - }, - "dependencies": { - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", - "dev": true, - "requires": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "electron-to-chromium": { - "version": "1.4.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", - "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fraction.js": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", - "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", - "dev": true - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "dev": true, - "requires": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-cli": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.1.0.tgz", - "integrity": "sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==", - "dev": true, - "requires": { - "chokidar": "^3.3.0", - "dependency-graph": "^0.11.0", - "fs-extra": "^10.0.0", - "get-stdin": "^9.0.0", - "globby": "^12.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^3.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^4.0.0", - "yargs": "^17.0.0" - } - }, - "postcss-load-config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", - "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", - "dev": true, - "requires": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" - } - }, - "postcss-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true - } } } From d4d8d0f15e54eb61b829a6fdfb056383b56e40d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 08:26:36 +0000 Subject: [PATCH 23/60] update workflows --- .github/workflows/hugo.yml | 4 +--- .github/workflows/regen-gh-pages.yml | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index 06d5654f..db43f9f2 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -31,7 +31,7 @@ jobs: build: runs-on: ubuntu-latest env: - HUGO_VERSION: 0.118.2 + HUGO_VERSION: 0.133.1 steps: - name: Install Hugo CLI run: | @@ -41,8 +41,6 @@ jobs: run: sudo snap install dart-sass - name: Checkout uses: actions/checkout@v3 - with: - submodules: recursive - name: Setup Pages id: pages uses: actions/configure-pages@v3 diff --git a/.github/workflows/regen-gh-pages.yml b/.github/workflows/regen-gh-pages.yml index 36ff7fa8..95b667b0 100644 --- a/.github/workflows/regen-gh-pages.yml +++ b/.github/workflows/regen-gh-pages.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v2 with: - node-version: '14' + node-version: '20' - name: Cache dependencies uses: actions/cache@v1 From 1edf28aba7bad14454bcf7938628eafcde6c2ba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 08:33:14 +0000 Subject: [PATCH 24/60] fix footer_about_disabled deprecated --- hugo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo.toml b/hugo.toml index 90d4fee3..3236dfa3 100644 --- a/hugo.toml +++ b/hugo.toml @@ -150,8 +150,8 @@ url = '/blog/serverless-next.js-example-blog-with-fission/' [params.ui] # Set to true to disable breadcrumb navigation. breadcrumb_disable = false -# Set to true to disable the About link in the site footer -footer_about_disable = false +# Set to true to show an About link in the site footer +footer_about_enable = true # Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top navbar navbar_logo = true # Set to true if you don't want the top navbar to be translucent when over a `block/cover`, like on the homepage. From bc536ab298a5d4f55506b8833c14cd744829f546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 08:37:10 +0000 Subject: [PATCH 25/60] cleanup .devcontainers --- .devcontainer/Dockerfile | 6 +----- .devcontainer/devcontainer.json | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 71a0ef70..b5d6dfb3 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,10 +1,6 @@ # syntax=docker/dockerfile:1 FROM mcr.microsoft.com/devcontainers/base:ubuntu-22.04 -# ARG USER=vscode -# ARG DEBIAN_FRONTEND=noninteractive -# RUN usermod -s /usr/bin/zsh ${USER} - # VARIANT can be either 'hugo' for the standard version or 'hugo_extended' for the extended version. ARG VARIANT=hugo_extended # VERSION can be either 'latest' or a specific version number @@ -28,4 +24,4 @@ RUN case ${VERSION} in \ mv hugo /usr/bin/hugo # Hugo dev server port -EXPOSE 1313 \ No newline at end of file +EXPOSE 1313 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5988aa90..12d6163f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -32,4 +32,4 @@ "ghcr.io/devcontainers/features/hugo:1": {}, "ghcr.io/devcontainers/features/node:1": {} } -} \ No newline at end of file +} From 102dc948776c0fe4efd311e55dddfac19bb94526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Sun, 1 Sep 2024 12:29:57 +0200 Subject: [PATCH 26/60] rearrange comment --- hugo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugo.toml b/hugo.toml index 3236dfa3..0163dbbc 100644 --- a/hugo.toml +++ b/hugo.toml @@ -74,10 +74,10 @@ id = "" [languages.en] title = "alguidelines.dev - Business Central Design Patterns" languageName = "English" +# Weight used for sorting. weight = 1 [languages.en.params] description = "Guidelines for when Developing AL for Microsoft Dynamics 365 Business Central" -# Weight used for sorting. # Everything below this are Site Params From 911cf76c4627710122e297566f7ce5e2bf729aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Wed, 4 Sep 2024 05:09:15 +0000 Subject: [PATCH 27/60] remove workflow relic --- .github/workflows/regen-gh-pages.yml | 49 ---------------------------- 1 file changed, 49 deletions(-) delete mode 100644 .github/workflows/regen-gh-pages.yml diff --git a/.github/workflows/regen-gh-pages.yml b/.github/workflows/regen-gh-pages.yml deleted file mode 100644 index 95b667b0..00000000 --- a/.github/workflows/regen-gh-pages.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: hugo CI - -on: - push: - branches: - - main # Set a branch name to trigger deployment - pull_request: - -jobs: - deploy: - runs-on: ubuntu-20.04 - concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive # Fetch Hugo themes (true OR recursive) - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - - name: Setup Hugo - uses: peaceiris/actions-hugo@v2 - with: - hugo-version: 'latest' - extended: true # Use extended Hugo - - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '20' - - - name: Cache dependencies - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - name: Prepare postcss-cli - run: npm ci - - - name: Build - run: hugo --minify - - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.ref == 'refs/heads/main' }} - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./public From 8ba7e0dd6128c408f98cabfa0e4a9ce84c10279c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Wed, 4 Sep 2024 05:36:45 +0000 Subject: [PATCH 28/60] remove clone step --- README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/README.md b/README.md index 3e15c226..e41ff2b1 100644 --- a/README.md +++ b/README.md @@ -40,14 +40,7 @@ contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additio ### Setup -1. Clone and setup -```sh -# Clone all submodules -git submodule update --init --recursive --depth 1 -# Install NPM dependencies -npm install -``` -2. Run Hugo server +**Run Hugo server** ``` $ hugo server Web Server is available at http://localhost:1313/ (bind address 127.0.0.1) From 783975bf4c1080ae72dd64923870d75c037680e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 23:19:21 +0000 Subject: [PATCH 29/60] Bump braces from 3.0.2 to 3.0.3 Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f066b6e1..87e17e5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -135,12 +135,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -303,9 +303,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -341,6 +341,20 @@ "node": ">=12" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", From ec423a04281d931ac0f74d5c3ff0914daffbcf6f Mon Sep 17 00:00:00 2001 From: Luuk Date: Wed, 11 Sep 2024 09:41:19 +0200 Subject: [PATCH 30/60] Fixed copy-paste mistake in reference text. --- content/docs/patterns/error-handling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/patterns/error-handling/index.md b/content/docs/patterns/error-handling/index.md index c6156690..ecd3635a 100644 --- a/content/docs/patterns/error-handling/index.md +++ b/content/docs/patterns/error-handling/index.md @@ -19,6 +19,6 @@ The youtube video shows more about errors presented in such way that the user wi ## List of references -For usage of number series, there is more information available on: +For error handling, there is more information available on: - [Microsoft Learn: Error collections](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-error-collection/) - [Youtube: Microsoft Presents: User friendly error handling in AL](https://www.youtube.com/watch?v=D8233xMjVog&list=PLI1l3dMI8xlDM9onioMWUyMSCiFs_mMWw&index=27) \ No newline at end of file From 6b3f522a162bce4b5d08caa6848677115ffc0520 Mon Sep 17 00:00:00 2001 From: Dmitry Katson Date: Thu, 26 Jun 2025 14:58:03 +0700 Subject: [PATCH 31/60] Vibe Coding for AL coding rules - Added new rules files for Vibe Coding, including guidelines on AL code style, naming conventions, performance optimization, error handling, event-driven development, and testing. - Updated existing links --- content/_index.md | 10 +- content/docs/vibe-coding/README.md | 102 ++++++++ content/docs/vibe-coding/_index.md | 100 ++++++++ content/docs/vibe-coding/al-code-style.md | 167 +++++++++++++ content/docs/vibe-coding/al-error-handling.md | 167 +++++++++++++ content/docs/vibe-coding/al-events.md | 120 ++++++++++ .../docs/vibe-coding/al-guidelines-rules.md | 58 +++++ .../docs/vibe-coding/al-naming-conventions.md | 133 +++++++++++ content/docs/vibe-coding/al-performance.md | 225 ++++++++++++++++++ content/docs/vibe-coding/al-testing.md | 195 +++++++++++++++ 10 files changed, 1272 insertions(+), 5 deletions(-) create mode 100644 content/docs/vibe-coding/README.md create mode 100644 content/docs/vibe-coding/_index.md create mode 100644 content/docs/vibe-coding/al-code-style.md create mode 100644 content/docs/vibe-coding/al-error-handling.md create mode 100644 content/docs/vibe-coding/al-events.md create mode 100644 content/docs/vibe-coding/al-guidelines-rules.md create mode 100644 content/docs/vibe-coding/al-naming-conventions.md create mode 100644 content/docs/vibe-coding/al-performance.md create mode 100644 content/docs/vibe-coding/al-testing.md diff --git a/content/_index.md b/content/_index.md index a6b96dd9..776ca694 100644 --- a/content/_index.md +++ b/content/_index.md @@ -123,16 +123,16 @@ images: ["images/og-image-fission.png"]
- PATTERN + NEW

- No. Series + Vibe Coding for AL

- The “Number Series” system is used extensively to provide numbers to master records, documents, and other transactions through Microsoft Dynamics 365 Business Central. + AI-optimized coding rules and guidelines designed to enhance the AL developer experience in modern AI-powered IDEs like VS Code and Cursor.

- - + +
diff --git a/content/docs/vibe-coding/README.md b/content/docs/vibe-coding/README.md new file mode 100644 index 00000000..48ce0477 --- /dev/null +++ b/content/docs/vibe-coding/README.md @@ -0,0 +1,102 @@ +# Vibe Coding Rules - Contribution Guide + +This directory contains AI-optimized coding rules for AL development. Each rule set is organized into markdown files that can be easily consumed by AI coding assistants. + +## Directory Structure + +``` +vibe-coding/ +├── _index.md # Main landing page +├── README.md # This file - contribution guide +├── al-guidelines-rules.md # Complete rules file with references to all categories +├── al-code-style.md # Code style, formatting, and documentation rules +├── al-naming-conventions.md # File naming, object naming, and variable naming +├── al-performance.md # Performance optimization and query guidelines +├── al-error-handling.md # Error handling patterns and troubleshooting +├── al-events.md # Event-driven development and extensibility +├── al-testing.md # AL-Go workspace structure and testing guidelines +``` + +## How to Add New Rules + +### 1. Choose the Right Category +Select the appropriate category for your rules, or create a new category if needed. + +### 2. Follow the Standard Format +Each rule file should follow this structure: + +```markdown +--- +title: "AL [Category Name] Rules" +description: > + Brief description of the rule category for AL development +globs: ["*.al", "*.json"] # File types this rule applies to +alwaysApply: true|false # Whether to always apply these rules +--- + +# AL [Category Name] Rules + +Brief introduction to the category and its importance in AL development. + +## Rule 1: [Descriptive Title] + +### Intent +What this rule aims to achieve, including implementation details and guidance for AI assistants. + +### Examples + +```al +// Good example +[code example] +``` + +You can also add a bad example to show what to avoid, but this is optional. +```al +// Bad example (avoid) +[code example] +``` + +## Rule 2: [Next Rule] +[Continue with same format...] +``` + +### 3. Update the Index +After adding new rule files: +- Update `al-guidelines-rules.md` to include `@your-new-file.md` reference +- Update `_index.md` to include links to new categories +- Ensure all cross-references are updated + +### 4. Test Your Rules +Before submitting, test your rules with AI assistants to ensure they: +- Are clearly understood by AI agents +- Produce the expected code patterns +- Don't conflict with existing rules + +## Contribution Workflow + +1. **Fork** the alguidelines repository +2. **Create** your rule files in the appropriate category +3. **Test** the rules with your preferred AI assistant +4. **Submit** a pull request with: + - Clear description of the rules added + - Examples of how the rules improve code quality + - Any testing results with AI assistants (optional) + +## Best Practices for Rule Writing + +### Make Rules AI-Friendly +- Use clear, unambiguous language specific to AL development +- Provide specific AL code examples with proper syntax +- Include both positive and negative examples, when applicable +- Structure content consistently + +## Questions? + +If you have questions about contributing rules, please: +- Open a discussion in the GitHub repository +- Join the Business Central community Discord +- Contact the initiative maintainers + +--- + +*This README is part of the Vibe Coding for AL initiative - enhancing AL development through AI-optimized guidelines.* \ No newline at end of file diff --git a/content/docs/vibe-coding/_index.md b/content/docs/vibe-coding/_index.md new file mode 100644 index 00000000..b002939d --- /dev/null +++ b/content/docs/vibe-coding/_index.md @@ -0,0 +1,100 @@ +--- +title: "Vibe Coding for AL" +tags: ["AL", "Vibe Coding"] +categories: ["Vibe Coding"] +description: > + AI-optimized coding rules and guidelines for AL development +--- + +_Created by the Business Central Community, Enhanced for AI-powered AL Development_ + +# Vibe Coding for AL + +Welcome to the **Vibe Coding for AL** initiative! This section contains AI-optimized coding rules and guidelines specifically designed to enhance the AL developer experience in modern AI-powered IDEs like VS Code and Cursor. + +## What is Vibe Coding? + +Vibe Coding represents a new approach to coding guidelines that are specifically formatted and structured to work seamlessly with AI coding assistants. These rules are designed to: + +- **Enhance AI Understanding**: Provide clear, structured guidelines that AI agents can easily parse and apply +- **Improve Code Quality**: Maintain high standards while leveraging AI assistance +- **Standardize Practices**: Create consistent coding patterns across the AL development community +- **Boost Productivity**: Help developers write better code faster with AI assistance + +## Key Features + +### 📋 **Structured Rule Format** +All rules are provided in markdown format with clear structure that AI agents can easily understand and apply during development. + +### 🔄 **Community-Driven** +Built and maintained by the AL community, including MVPs and the Microsoft product team. + +### 🛠️ **IDE Integration** +Future AL extension support will allow generating local rules files directly in VS Code and Cursor. + +### 🤖 **AI-Ready** +Designed as a foundation for AL-focused AI tools and Model Context Protocols (MCPs). + +## How to Use + +1. **Browse the Rules**: Explore the various rule categories below +2. **Copy for Your Project**: Use these rules as templates for your own coding standards +3. **Contribute**: Submit your own rule variations via pull requests +4. **Stay Updated**: Watch for AL extension integration coming soon + +## Rule Categories + +The Vibe Coding rules are organized into logical categories to make them easy to find and implement: + +- **[Complete AL Guidelines Rules](al-guidelines-rules/)** - Comprehensive rules file with references to other rules +- **[AL Code Style & Formatting](al-code-style/)** - Indentation, folder organization, and code documentation +- **[AL Naming Conventions](al-naming-conventions/)** - File naming, object naming, and variable naming patterns +- **[AL Performance Optimization](al-performance/)** - Query optimization, temporary tables, and performance analysis +- **[AL Error Handling & Troubleshooting](al-error-handling/)** - Try/catch patterns, debugging, and telemetry integration +- **[AL Event-Driven Development](al-events/)** - Event subscribers, integration events, and extensibility patterns +- **[AL Testing & Project Structure](al-testing/)** - AL-Go workspace structure, test generation, and project organization + +## Getting Started + +To get started with Vibe Coding for AL: + +1. Review the rule categories that apply to your development needs +2. Adapt the rules to your specific project requirements +3. Configure your AI assistant to use these guidelines +4. Share your experiences and contribute improvements back to the community + +## Future Roadmap + +### Phase 1: Foundation ✅ +- Host rules in AL Guidelines repository +- Community contribution process +- Initial rule sets from key contributors + +### Phase 2: Integration 🔄 +- AL extension support for local rules generation +- Enhanced AI agent compatibility +- MCP server integration + +### Phase 3: Expansion 🚀 +- Convert legacy C/AL patterns where applicable +- Generate new AL-specific patterns +- Establish as central trust source for AL AI agents + +## Contributing + +This initiative thrives on community contributions! Here's how you can help: + +- **Submit Rule Sets**: Share your proven coding rules via pull requests +- **Improve Existing Rules**: Suggest enhancements to current guidelines +- **Test & Validate**: Try the rules in your projects and provide feedback +- **Share Examples**: Contribute real-world examples of rule applications + +## Community & Support + +- **GitHub Repository**: [Microsoft AL Guidelines](https://github.com/microsoft/alguidelines) +- **Discussions**: Join conversations about Vibe Coding rules +- **Issues**: Report problems or suggest new features + +--- + +*The Vibe Coding for AL initiative is a collaborative effort between the Business Central community and Microsoft, aimed at revolutionizing how we write AL code in the age of AI.* \ No newline at end of file diff --git a/content/docs/vibe-coding/al-code-style.md b/content/docs/vibe-coding/al-code-style.md new file mode 100644 index 00000000..6e1aea24 --- /dev/null +++ b/content/docs/vibe-coding/al-code-style.md @@ -0,0 +1,167 @@ +--- +title: "AL Code Style & Formatting Rules" +description: > + AL Code structure, formatting, and folder organization guidelines for AL development +globs: ["*.al"] +alwaysApply: true +--- + +# AL Code Style & Formatting Rules + +These rules ensure consistent code structure and organization across AL projects, making code more maintainable and AI-assistant friendly. + +## Style guidelines for AL code + - Always use camelCase for variable and function names. + - Use PascalCase for object names (e.g., tables, pages, reports). + - Maintain a consistent indentation style (2 spaces preferred). + +## Commonly used methods and patterns + - Temporary tables for performance optimization + - Use of events for extensibility + +## Rule 1: Consistent Indentation and Formatting + +### Intent +Maintain consistent code formatting to improve readability and enable better AI understanding of code structure. Use 2-space indentation consistently throughout your project and maintain consistent formatting within functions and procedures. + +### Examples + +```al +// Good example +procedure CalculateDiscount(Amount: Decimal; DiscountPct: Decimal): Decimal +begin + if DiscountPct > 0 then + exit(Amount * DiscountPct / 100); + + exit(0); +end; +``` + +## Rule 2: Feature-Based Folder Organization + +### Intent +Organize code by business features rather than object types to improve maintainability and logical grouping. Use feature-based organization with `src/feature/subfeature/` structure and place shared components in `Common` or `Shared` folders. + +### Examples + +``` +// Good example - Feature-based organization +src/ +├── NoSeries/ +│ ├── NoSeries.Table.al +│ ├── NoSeries.Page.al +│ └── NoSeriesSetup.Codeunit.al +├── Sales/ +│ ├── Invoice/ +│ │ ├── SalesInvoice.Page.al +│ │ └── SalesInvoicePosting.Codeunit.al +│ └── Order/ +│ └── SalesOrder.Page.al +└── Common/ + ├── Helpers/ + │ └── DateHelper.Codeunit.al + └── Interfaces/ + └── IPostable.Interface.al +``` + +``` +// Bad example (avoid object-type segregation) +src/ +├── Tables/ +│ ├── NoSeries.Table.al +│ └── SalesHeader.Table.al +├── Pages/ +│ ├── NoSeries.Page.al +│ └── SalesInvoice.Page.al +└── Codeunits/ + ├── NoSeriesSetup.Codeunit.al + └── SalesInvoicePosting.Codeunit.al +``` + +## Rule 3: Code Documentation and Comments + +### Intent +Provide clear documentation for global functions using XML documentation comments. Code should be self-documenting through clear naming, but global functions in codeunits require proper documentation for API clarity. + +### Examples + +```al +// Good example - XML documentation for global functions +codeunit 50100 "Base64 Convert" +{ + /// + /// Converts the value of the input string to its equivalent string representation that is encoded with base-64 digits. + /// + /// The string to convert. + /// The string representation, in base-64, of the input string. + procedure ToBase64(String: Text): Text + begin + exit(Base64ConvertImpl.ToBase64(String)); + end; + + /// + /// Validates discount percentage against business rules. + /// + /// The discount percentage to validate. + procedure ValidateDiscountPercentage(DiscountPct: Decimal) + begin + if DiscountPct > 50 then + Error('Discount cannot exceed 50% due to company policy'); + + if DiscountPct < 0 then + Error('Discount percentage cannot be negative'); + end; +} +``` + +```al +// Bad example (avoid inline comments for obvious operations) +procedure ValidateDiscountPercentage(DiscountPct: Decimal) +begin + // Check if discount is greater than 50 + if DiscountPct > 50 then + Error('Discount cannot exceed 50%'); + + // Check if discount is less than 0 + if DiscountPct < 0 then + Error('Discount percentage cannot be negative'); +end; +``` + +## Rule 4: Modular and Reusable Code Structure + +### Intent +Keep code modular and reusable to enhance maintainability and reduce duplication. Write small, focused procedures that do one thing well and use interfaces and patterns where appropriate. + +### Examples + +```al +// Good example - Modular approach +procedure PostDocument(var DocumentHeader: Record "Sales Header") +begin + ValidateDocument(DocumentHeader); + CalculateTotals(DocumentHeader); + CreateLedgerEntries(DocumentHeader); + UpdateStatus(DocumentHeader); +end; + +local procedure ValidateDocument(var DocumentHeader: Record "Sales Header") +begin + if DocumentHeader."No." = '' then + Error('Document number cannot be empty'); +end; + +local procedure CalculateTotals(var DocumentHeader: Record "Sales Header") +begin + DocumentHeader.CalcFields(Amount); +end; +``` + +```al +// Bad example (avoid monolithic procedures) +procedure PostDocument(var DocumentHeader: Record "Sales Header") +begin + // All validation, calculation, and posting logic in one procedure + // ... 200+ lines of mixed concerns +end; +``` \ No newline at end of file diff --git a/content/docs/vibe-coding/al-error-handling.md b/content/docs/vibe-coding/al-error-handling.md new file mode 100644 index 00000000..dcc84411 --- /dev/null +++ b/content/docs/vibe-coding/al-error-handling.md @@ -0,0 +1,167 @@ +--- +title: "AL Error Handling & Troubleshooting Rules" +description: > + AL Error handling patterns, debugging techniques, and troubleshooting guidelines for AL development +globs: ["*.al"] +alwaysApply: false +--- + +# AL Error Handling & Troubleshooting Rules + +Robust error handling and effective troubleshooting practices are essential for maintaining reliable Business Central applications. + +## Rule 1: Use TryFunctions for Error Handling + +### Intent +Implement proper error handling using TryFunctions to manage exceptions gracefully and provide meaningful user feedback. Use TryFunctions for error handling in scenarios where rollback is required, implement proper exception handling for external service calls, provide meaningful error messages to users, and log errors appropriately for debugging purposes. When generating code that might fail (external calls, data operations, calculations), implement appropriate TryFunction error handling and provide clear error messages. + +### Examples + +```al +// Good example - TryFunction with proper error handling and error labels +procedure ProcessPayment(Amount: Decimal): Boolean +var + PaymentService: Codeunit "Payment Service"; + ErrorText: Text; + PaymentProcessingFailedLbl: Label 'Payment processing failed: %1', Comment = '%1 = Error message'; + PaymentProcessingFailedTelemetryLbl: Label 'Payment processing failed', Locked = true; +begin + if not TryProcessPaymentInternal(Amount) then begin + ErrorText := GetLastErrorText(); + LogError(PaymentProcessingFailedTelemetryLbl, ErrorText); + Message(PaymentProcessingFailedLbl, ErrorText); + exit(false); + end; + + exit(true); +end; + +[TryFunction] +local procedure TryProcessPaymentInternal(Amount: Decimal) +var + PaymentService: Codeunit "Payment Service"; +begin + PaymentService.ProcessPayment(Amount); +end; +``` + +```al +// Bad example (avoid hardcoded error messages and unhandled errors) +procedure ProcessPayment(Amount: Decimal) +var + PaymentService: Codeunit "Payment Service"; +begin + // No error handling - will cause unhandled exceptions + // Also avoid hardcoded messages like this: + // Message('Payment could not be processed'); + PaymentService.ProcessPayment(Amount); +end; +``` + +## Rule 2: Use Error Labels for All Messages + +### Intent +All error messages, warnings, and user messages must use label variables instead of hardcoded text. This ensures proper localization support and maintainability. Define labels with appropriate comments for translators and use Locked = true for technical messages that should not be translated. + +### Examples + +```al +// Good example - Using error labels +procedure ValidateBusinessLogic(SalesHeader: Record "Sales Header") +var + Customer: Record Customer; + CustomerNotFoundErr: Label 'Customer %1 does not exist for sales document %2.', Comment = '%1 = Customer No., %2 = Sales Header No.'; + CustomerBlockedErr: Label 'Customer %1 is blocked (%2). Cannot process sales document %3.', Comment = '%1 = Customer No., %2 = Blocked reason, %3 = Sales Header No.'; + EmptyHeaderNoErr: Label 'Sales header number cannot be empty.'; +begin + if SalesHeader."No." = '' then + Error(EmptyHeaderNoErr); + + if not Customer.Get(SalesHeader."Sell-to Customer No.") then + Error(CustomerNotFoundErr, SalesHeader."Sell-to Customer No.", SalesHeader."No."); + + if Customer.Blocked <> Customer.Blocked::" " then + Error(CustomerBlockedErr, Customer."No.", Customer.Blocked, SalesHeader."No."); +end; +``` + +```al +// Bad example (avoid hardcoded error messages) +procedure ValidateBusinessLogic(SalesHeader: Record "Sales Header") +var + Customer: Record Customer; +begin + if not Customer.Get(SalesHeader."Sell-to Customer No.") then + Error('Customer not found'); // Hardcoded - avoid this + + if Customer.Blocked <> Customer.Blocked::" " then + Error('Customer blocked'); // Hardcoded - avoid this +end; +``` + +## Rule 3: Code Compilation and Correctness Priority + +### Intent +Generated AL code should prioritize correctness over immediate compilation. Code can fail to compile if AI suggests base functions or events that don't exist, or if variables in event subscriptions are incorrect. When this happens, leave space for manual fixes rather than changing the intended behavior. If you're confident the logic should work as suggested but there are naming or parameter issues, leave it for user correction rather than altering the business logic. + +### Examples + +```al +// Good example - Correct logic even if function names need verification +procedure HandleCustomerModification(var Customer: Record Customer) +var + CustomerValidation: Codeunit "Customer Validation"; // May need verification +begin + // Correct business logic - even if codeunit name needs adjustment + if not CustomerValidation.ValidateCustomerData(Customer) then + Error(ValidationFailedErr); + + Customer.Modify(true); +end; +``` + +```al +// Good example - Event subscription with correct intent +[EventSubscriber(ObjectType::Table, Database::Customer, OnAfterModifyEvent, '', false, false)] +local procedure OnAfterCustomerModify(var Rec: Record Customer; var xRec: Record Customer; RunTrigger: Boolean) +var + CustomerChangeLog: Codeunit "Customer Change Log"; // Function may need verification +begin + // Correct logic - even if codeunit or method names need adjustment + CustomerChangeLog.LogCustomerChange(Rec, xRec); +end; +``` + +## Rule 4: Custom Telemetry Implementation + +### Intent +Add custom telemetry for tracking business-critical operations, but only when explicitly requested by the user. Use Session.LogMessage for custom telemetry with appropriate verbosity levels and data classification. Include relevant custom dimensions for context and use proper telemetry scope for extension publishers. + +### Examples + +```al +// Good example - Custom telemetry (only when user explicitly requests it) +procedure PostSalesDocument(var SalesHeader: Record "Sales Header") +var + TelemetryCustomDimensions: Dictionary of [Text, Text]; + SalesDocPostedMsg: Label 'Sales document posted successfully', Locked = true; + SalesDocPostFailedMsg: Label 'Sales document posting failed', Locked = true; +begin + // Add context for telemetry + TelemetryCustomDimensions.Add('DocumentType', Format(SalesHeader."Document Type")); + TelemetryCustomDimensions.Add('CustomerNo', SalesHeader."Sell-to Customer No."); + + if TryPostSalesDocument(SalesHeader) then begin + // Log successful operation + Session.LogMessage('SAL001', SalesDocPostedMsg, + Verbosity::Normal, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, TelemetryCustomDimensions); + end else begin + // Log failed operation with error details + TelemetryCustomDimensions.Add('ErrorText', GetLastErrorText()); + Session.LogMessage('SAL002', SalesDocPostFailedMsg, + Verbosity::Error, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, TelemetryCustomDimensions); + end; +end; +``` \ No newline at end of file diff --git a/content/docs/vibe-coding/al-events.md b/content/docs/vibe-coding/al-events.md new file mode 100644 index 00000000..20afabfc --- /dev/null +++ b/content/docs/vibe-coding/al-events.md @@ -0,0 +1,120 @@ +--- +title: "Event-Driven Development Rules" +description: > + Guidelines for implementing event-driven patterns and extensibility in AL development +globs: ["*.al"] +alwaysApply: false +--- + +# Event-Driven Development Rules + +Event-driven development is fundamental to creating extensible and maintainable Business Central applications that follow the platform's architecture principles. + +## Rule 1: Use Events for Extensibility + +### Intent +Implement proper event patterns to enable extensibility without modifying base application code. Subscribe to relevant Business Central events (OnBeforeInsert, OnAfterModify, etc.), create integration events in your code for future extensibility, use extension objects or events for all changes to standard application objects. When implementing business logic, prioritize event subscribers and suggest appropriate event subscription patterns and integration event creation. + +### Examples + +```al +// Good example - Event subscriber implementation with Handler suffix +codeunit 50100 "Sales Document Events Handler" +{ + [EventSubscriber(ObjectType::Table, Database::"Sales Header", OnBeforeInsert, '', false, false)] + local procedure OnBeforeInsertSalesHeader(var Rec: Record "Sales Header"; RunTrigger: Boolean) + begin + // Custom validation logic + ValidateCustomFields(Rec); + end; +} +``` + +## Rule 2: Add Integration Events for Extensibility + +### Intent +Use integration events to provide better extensibility points and clearer API contracts for other developers. Create integration events at logical business process points, document integration event parameters and expected behavior, provide meaningful event names that describe the business context, and implement handled patterns to allow subscribers to control execution flow. When designing extensible code, suggest integration events at appropriate business logic points with clear documentation and meaningful names. + +### Examples + +```al +// Good example - Integration events with handled pattern +codeunit 50101 "Customer Management" +{ + procedure CreateCustomer(var Customer: Record Customer): Boolean + var + IsHandled: Boolean; + begin + OnBeforeCreateCustomer(Customer, IsHandled); + if IsHandled then + exit(true); + + if not Customer.Insert(true) then + exit(false); + + OnAfterCreateCustomer(Customer); + exit(true); + end; + + [IntegrationEvent(false, false)] + procedure OnBeforeCreateCustomer(var Customer: Record Customer; var IsHandled: Boolean) + begin + // Allow extensions to modify customer data before creation + // Set IsHandled to true to skip default processing + end; + + [IntegrationEvent(false, false)] + procedure OnAfterCreateCustomer(var Customer: Record Customer) + begin + // Allow extensions to perform additional actions after customer creation + end; +} +``` + +```al +// Extension subscribing to integration events with Handler suffix +codeunit 50102 "Customer Validation Handler" +{ + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Customer Management", OnBeforeCreateCustomer, '', false, false)] + local procedure ValidateCustomerOnBeforeCreate(var Customer: Record Customer; var IsHandled: Boolean) + begin + // Custom validation logic + ValidateCustomerCreditLimit(Customer); + + // Optionally handle the event to skip default processing + if ShouldSkipDefaultProcessing(Customer) then + IsHandled := true; + end; +} +``` + +## Rule 3: Event Parameter Best Practices + +### Intent +Design event parameters that provide sufficient context while maintaining performance and usability. Pass record variables by reference when possible, include relevant context parameters, use meaningful parameter names, consider performance implications of parameter passing, and implement handled patterns where appropriate. When creating events, ensure parameters provide sufficient context for subscribers while maintaining good performance and use descriptive parameter names that clearly indicate their purpose. + +### Examples + +```al +// Good example - Well-designed event parameters with handled pattern +codeunit 50103 "Document Posting Events" +{ + [IntegrationEvent(false, false)] + procedure OnBeforePostDocument(var DocumentHeader: Record "Sales Header"; var DocumentLines: Record "Sales Line"; PostingDate: Date; var IsHandled: Boolean) + begin + // Comprehensive context for document posting + // - Document header and lines for full context + // - Posting date for temporal context + // - IsHandled flag for control flow + end; + + [IntegrationEvent(false, false)] + procedure OnAfterPostDocument(DocumentHeader: Record "Sales Header"; PostedDocumentNo: Code[20]; PostingResult: Boolean) + begin + // Results context after posting + // - Original document for reference + // - Posted document number for tracking + // - Success/failure indication + end; +} +``` \ No newline at end of file diff --git a/content/docs/vibe-coding/al-guidelines-rules.md b/content/docs/vibe-coding/al-guidelines-rules.md new file mode 100644 index 00000000..e01462bd --- /dev/null +++ b/content/docs/vibe-coding/al-guidelines-rules.md @@ -0,0 +1,58 @@ +--- +description: AL Guidelines - Comprehensive AI-optimized coding rules for Microsoft Dynamics 365 Business Central development +globs: ["*.al", "*.json", "app.json", "launch.json"] +alwaysApply: true +--- + +# AL Guidelines - Vibe Coding Rules + +You are an AI assistant designed to aid in AL development, particularly for Microsoft Dynamics 365 Business Central. Your role is to assist developers in writing efficient, maintainable code following established patterns and best practices. + +## Core Principles + +- Follow event-driven programming model; never modify standard application objects +- Use clear, meaningful names and maintain consistent code structure +- Prioritize performance optimization and proper error handling +- Focus on main application implementation by default +- Only generate test code when explicitly requested +- Maintain proper AL-Go workspace structure separation + +## Rule Categories + +The following rule sets provide comprehensive guidance for AL development: + +@al-code-style.md + +@al-naming-conventions.md + +@al-performance.md + +@al-error-handling.md + +@al-events.md + +@al-testing.md + +## Key Guidelines Summary + +- **File Naming**: Use `..al` pattern consistently +- **Code Style**: Use 2-space indentation and camelCase for variables, PascalCase for objects +- **Folder Structure**: Organize by feature (`src/feature/subfeature/`) not by object type +- **Performance**: Filter data early, use temporary tables, avoid unnecessary loops +- **Events**: Prefer integration events over direct modifications for extensibility +- **Testing**: Separate App and Test projects, generate tests only when requested +- **Error Handling**: Use TryFunctions, provide meaningful error messages, implement telemetry + +## AL-Go Workspace Structure + +When working in AL-Go environments: +- **App project**: Contains all application logic (tables, pages, codeunits, reports) +- **Test project**: Contains all test code and references App project as dependency +- **Never mix**: Application code stays in App, test code stays in Test project + +## AI Response Behavior + +- Provide concise, actionable advice with specific AL method references +- Always explain the reasoning behind recommendations +- Reference Business Central architecture patterns and established best practices +- Focus on practical implementation guidance that can be immediately applied \ No newline at end of file diff --git a/content/docs/vibe-coding/al-naming-conventions.md b/content/docs/vibe-coding/al-naming-conventions.md new file mode 100644 index 00000000..0de377f6 --- /dev/null +++ b/content/docs/vibe-coding/al-naming-conventions.md @@ -0,0 +1,133 @@ +--- +title: "Naming Conventions Rules" +description: > + Comprehensive naming conventions for AL files, objects, variables, and functions +globs: ["*.al"] +alwaysApply: true +--- + +# Naming Conventions Rules + +Consistent naming conventions improve code readability, maintainability, and help AI assistants understand code structure and intent. + +## Rule 1: Object Naming Conventions + +### Intent +Use consistent naming patterns for all AL objects to improve discoverability and maintain professional standards. Use PascalCase for object names (tables, pages, reports, codeunits) and meaningful, descriptive names that clearly indicate the object's purpose. Object names must not exceed 30 characters total, with a maximum of 26 characters for the name itself to reserve space for prefixes/affixes (3 characters + 1 space). + +### Examples + +```al +// Good examples (within 26 character limit) +table 50100 "Customer Ledger Entry" // 20 chars +page 50101 "Sales Invoice" // 13 chars +codeunit 50102 "Sales Invoice Posting" // 21 chars +report 50103 "Customer Statement" // 18 chars +``` + +```al +// Bad examples (avoid abbreviations, unclear names, or length violations) +table 50100 "CustLE" // Too abbreviated +page 50101 "SalesInv" // Too abbreviated +table 50104 "Very Long Customer Ledger Entry" // 32 chars - exceeds limit +codeunit 50102 "SIPoster" // Unclear abbreviation +``` + +## Rule 2: File Naming Conventions + +### Intent +Establish consistent file naming patterns that clearly identify object types and facilitate organized development. Use pattern `..al` and maintain consistency across all file names. Ensure file names are descriptive and match the AL object name within the files. + +### Examples + +```al +// Good examples +NoSeries.Page.al +NoSeries.Table.al +NoSeriesErrorsImpl.Codeunit.al +NoSeriesSetup.Codeunit.al +CustomerCard.Page.al +SalesHeader.Table.al +PostSalesInvoice.Codeunit.al +ItemLedgerEntry.Report.al +InventorySetup.PageExt.al +SalesHeader.TableExt.al + +// For implementations and interfaces +INoSeries.Interface.al +NoSeriesImpl.Codeunit.al + +// For test files +NoSeriesTests.Codeunit.al +SalesPostingTests.Codeunit.al +``` + +## Rule 3: Variable and Function Naming + +### Intent +Use consistent naming conventions for variables and functions to improve code readability. Use camelCase for variable and function names, descriptive names that clearly indicate purpose, and avoid abbreviations unless they are well-known business terms. Use consistent parameter naming in procedures. + +### Examples + +```al +// Good examples - Variables +var + customerLedgerEntry: Record "Cust. Ledger Entry"; + totalAmount: Decimal; + discountPercentage: Decimal; + isValidTransaction: Boolean; +``` + +```al +// Good examples - Functions +procedure calculateCustomerBalance(customerNo: Code[20]): Decimal +procedure validateSalesDocument(var salesHeader: Record "Sales Header") +procedure updateInventoryQuantity(itemNo: Code[20]; quantity: Decimal) +``` + +## Rule 4: Parameter Naming in Event Subscribers + +### Intent +Use meaningful parameter names in event subscribers to improve code clarity and maintainability. Use descriptive parameter names that clearly indicate their purpose, follow Business Central conventions for common parameter types, and maintain consistency across similar event subscribers. Avoid unclear generic names like "Rec" - use specific descriptive names. + +### Examples + +```al +// Good example - Descriptive parameter names +[EventSubscriber(ObjectType::Table, Database::"Sales Header", OnBeforeInsert, '', false, false)] +local procedure AddDefaultValuesOnBeforeInsertSalesHeader(var SalesHeader: Record "Sales Header"; RunTrigger: Boolean) +begin + // Event handling logic +end; + +[EventSubscriber(ObjectType::Table, Database::Customer, OnBeforeModify, '', false, false)] +local procedure CheckBalanceOnBeforeModifyCustomer(var Customer: Record Customer; var xCustomer: Record Customer) +begin + // Event handling logic +end; +``` + +## Rule 5: Interface and Implementation Naming + +### Intent +Clearly distinguish between interfaces and their implementations using consistent naming patterns. Prefix interfaces with "I" (e.g., `INoSeries`), use "Impl" suffix for implementation codeunits, and keep interface and implementation names closely related. Ensure names stay within the 26-character limit. + +### Examples + +```al +// Good examples (within character limits) +// Interface file: ICustomerService.Interface.al +interface ICustomerService +{ + procedure GetCustomerBalance(CustomerNo: Code[20]): Decimal; +} + +// Implementation file: CustomerServiceImpl.Codeunit.al +codeunit 50100 "Customer Service Impl" implements ICustomerService +{ + procedure GetCustomerBalance(CustomerNo: Code[20]): Decimal + begin + // Implementation logic + end; +} +``` \ No newline at end of file diff --git a/content/docs/vibe-coding/al-performance.md b/content/docs/vibe-coding/al-performance.md new file mode 100644 index 00000000..e9d9c156 --- /dev/null +++ b/content/docs/vibe-coding/al-performance.md @@ -0,0 +1,225 @@ +--- +title: "AL Performance Optimization Rules" +description: > + Performance optimization guidelines and best practices for AL development +globs: ["*.al"] +alwaysApply: true +--- + +# AL Performance Optimization Rules + +These rules focus on writing performant AL code that scales well and provides optimal user experience in Business Central environments. + +## AL Performance Guidelines Summary +- Always analyze performance impact when adding new features +- Optimize queries by filtering data as early as possible +- Avoid unnecessary loops; use set-based operations when possible +- Use SetLoadFields to minimize data retrieval +- Use temporary tables, dictionaries, or lists for temporary data storage + +## Rule 1: Early Data Filtering and Query Optimization + +### Intent +Optimize queries by filtering data as early as possible to reduce data transfer and processing overhead. Apply filters before processing records, use appropriate table keys and sorting, minimize the amount of data retrieved from the database, and use SetRange and SetFilter methods effectively. + +### Examples + +```al +// Good example - Early filtering +procedure GetCustomersByCity(CityFilter: Text): Integer +var + Customer: Record Customer; +begin + Customer.SetRange(City, CityFilter); + Customer.SetRange(Blocked, Customer.Blocked::" "); + if Customer.FindSet() then + repeat + // Process only filtered customers + until Customer.Next() = 0; + + exit(Customer.Count); +end; +``` + +```al +// Bad example (avoid processing all records) +procedure GetCustomersByCity(CityFilter: Text): Integer +var + Customer: Record Customer; + Count: Integer; +begin + if Customer.FindSet() then + repeat + // Processing all customers then filtering + if (Customer.City = CityFilter) and (Customer.Blocked = Customer.Blocked::" ") then + Count += 1; + until Customer.Next() = 0; + + exit(Count); +end; +``` + +## Rule 2: Use SetLoadFields for Optimal Data Retrieval + +### Intent +Use SetLoadFields to minimize data retrieval from the database by loading only the fields you need. Place SetLoadFields before the Get or Find operation, and include only the fields that will be used in your code. + +### Examples + +```al +// Good example - SetLoadFields with filtering +Item.SetRange("Third Party Item Exists", false); +Item.SetLoadFields("Item Category Code"); +Item.FindFirst(); +``` + +```al +// Bad example (avoid SetLoadFields after filtering) +Item.SetLoadFields("Item Category Code"); +Item.SetRange("Third Party Item Exists", false); +Item.FindFirst(); +``` + +## Rule 3: Use Temporary Tables, Dictionaries, and Lists for Performance + +### Intent +Leverage temporary tables, dictionaries, and lists to improve performance in read-heavy scenarios and complex data processing. Use temporary tables for structured record data, dictionaries for key-value pairs, and lists for simple collections that are only temporarily needed. + +### Examples + +```al +// Good example - Using temporary tables for structured data +procedure ProcessSalesData(var TempSalesLine: Record "Sales Line" temporary) +var + SalesLine: Record "Sales Line"; +begin + // Load data into temporary table once + if SalesLine.FindSet() then + repeat + TempSalesLine := SalesLine; + TempSalesLine.Insert(); + until SalesLine.Next() = 0; + + // Process temporary data multiple times without database hits + ProcessDiscounts(TempSalesLine); + CalculateTotals(TempSalesLine); + ValidateInventory(TempSalesLine); +end; +``` + +```al +// Good example - Using dictionaries for key-value temporary data +procedure CacheCustomerData() +var + Customer: Record Customer; + CustomerCache: Dictionary of [Code[20], Text]; +begin + if Customer.FindSet() then + repeat + CustomerCache.Add(Customer."No.", Customer.Name); + until Customer.Next() = 0; + + // Use cached data for lookups + ProcessOrdersWithCache(CustomerCache); +end; +``` + +```al +// Good example - Using lists for simple collections +procedure GetBlockedCustomers(): List of [Code[20]] +var + Customer: Record Customer; + BlockedCustomers: List of [Code[20]]; +begin + Customer.SetRange(Blocked, Customer.Blocked::All); + if Customer.FindSet() then + repeat + BlockedCustomers.Add(Customer."No."); + until Customer.Next() = 0; + + exit(BlockedCustomers); +end; +``` + +## Rule 4: Avoid Unnecessary Loops - Use Set-Based Operations + +### Intent +Minimize looping operations and favor set-based approaches when possible to improve performance. Use built-in aggregation methods (CalcSums, CalcFields), leverage SQL-based operations through AL, avoid nested loops when possible, and use batch operations for multiple record updates. + +### Examples + +```al +// Good example - Set-based operation +procedure GetTotalSalesAmount(CustomerNo: Code[20]): Decimal +var + CustLedgerEntry: Record "Cust. Ledger Entry"; +begin + CustLedgerEntry.SetRange("Customer No.", CustomerNo); + CustLedgerEntry.CalcSums(Amount); + exit(CustLedgerEntry.Amount); +end; +``` + +```al +// Bad example (avoid manual loops for aggregation) +procedure GetTotalSalesAmount(CustomerNo: Code[20]): Decimal +var + CustLedgerEntry: Record "Cust. Ledger Entry"; + TotalAmount: Decimal; +begin + CustLedgerEntry.SetRange("Customer No.", CustomerNo); + if CustLedgerEntry.FindSet() then + repeat + TotalAmount += CustLedgerEntry.Amount; + until CustLedgerEntry.Next() = 0; + + exit(TotalAmount); +end; +``` + +## Rule 5: Performance Impact Analysis + +### Intent +Always analyze and consider performance impact when adding new features or modifying existing code. While the AL compiler does not have direct access to performance profilers, you should implement performance-optimal code patterns from the start and consider scalability implications of code changes. + +### Examples + +```al +// Good example - Performance-conscious implementation +procedure UpdatePricesForItems(var Item: Record Item) +var + ItemCount: Integer; +begin + // Check data volume before processing + ItemCount := Item.Count(); + + if ItemCount > 1000 then begin + // Use batch processing for large datasets + UpdatePricesInBatches(Item); + end else begin + // Direct processing for smaller datasets + UpdatePricesDirectly(Item); + end; +end; +``` + +```al +// Good example - Batched modifications to minimize database writes +procedure UpdateCustomerStatistics(CustomerNo: Code[20]) +var + Customer: Record Customer; + TotalBalance: Decimal; + LastPaymentDate: Date; +begin + // Calculate all values first + CalculateCustomerTotals(CustomerNo, TotalBalance, LastPaymentDate); + + // Single database write with all changes + Customer.SetLoadFields("Balance (LCY)", "Last Payment Date"); + if Customer.Get(CustomerNo) then begin + Customer."Balance (LCY)" := TotalBalance; + Customer."Last Payment Date" := LastPaymentDate; + Customer.Modify(true); + end; +end; +``` \ No newline at end of file diff --git a/content/docs/vibe-coding/al-testing.md b/content/docs/vibe-coding/al-testing.md new file mode 100644 index 00000000..68bc9370 --- /dev/null +++ b/content/docs/vibe-coding/al-testing.md @@ -0,0 +1,195 @@ +--- +title: "AL Testing & Project Structure Rules" +description: > + AL-Go workspace structure, test generation guidelines, and project organization rules +globs: ["*.al", "app.json"] +alwaysApply: false +--- + +# AL Testing & Project Structure Rules + +These rules ensure proper project organization, test implementation, and workspace structure in AL-Go based development environments. + +## Rule 1: AL-Go Workspace Structure Guidelines + +### Intent +Establish clear separation between application code and test code in AL-Go workspace environments. + +- App project contains Tables, Pages, Codeunits, Reports, APIs, Enums, etc. +- Test project contains Test Codeunits, Test Pages, Mock objects, Test data. +- Each project has its own app.json with appropriate dependencies. +- Test project references the App project as a dependency. +- Use App project ONLY for main application implementation, use Test project ONLY for test implementation, never include test files in the main App folder, and never include application logic in the Test folder. +- When working in AL-Go workspace, always place files in the correct project based on their purpose. + +### Examples + +``` +// Good example - Proper AL-Go workspace structure +Repository/ +├── .AL-Go/ +├── .github/ +├── App/ +│ ├── src/ +│ │ ├── Setup/ +│ │ ├── Feature1/ +│ │ ├── Feature2/ +│ │ ├── APIs/ +│ ├── app.json +│ └── launch.json +├── Test/ +│ ├── src/ +│ │ ├── SetupTests/ +│ │ ├── Feature1Tests/ +│ │ ├── Feature2Tests/ +│ │ ├── IntegrationTests/ +│ ├── app.json +│ └── launch.json +└── al.code-workspace +``` + +## Rule 2: Test Generation Guidelines + +### Intent +Control when and how test code is generated to maintain focus on main application implementation. + +- DO NOT automatically generate test code unless explicitly requested +- Focus on main application implementation by default +- When user asks for implementation create only the main application objects +- Only generate test files when user specifically requests "Create tests for...", "Generate unit tests...", "Add test coverage...", or "Write tests..." +- If tests are requested, place them in the Test project following the folder structure where test files should mirror the App project structure but in the Test project +- Unless the user explicitly requests tests, focus only on main application implementation + +## Rule 3: Project Dependencies Configuration + +### Intent +Establish correct dependency relationships between App and Test projects. + +- App project app.json should NOT reference Test project +- Test project app.json MUST reference App project as dependency +- Test project should include testing frameworks (e.g., "Any", "Library Assert"), and each project maintains its own dependencies. +- When configuring project dependencies, ensure Test project references App project but never the reverse and include appropriate testing frameworks in Test project. + +### Examples + +```json +// Good example - Test project app.json +{ + "dependencies": [ + { + "id": "your-app-id", + "name": "Your App Name", + "publisher": "Your Publisher", + "version": "1.0.0.0" + }, + { + "id": "dd0be2ea-f733-4d65-bb34-a28f4624fb14", + "name": "Library Assert", + "publisher": "Microsoft", + "version": "20.0.0.0" + } + ] +} +``` + +## Rule 4: Unit Testing Best Practices + +### Intent +Write comprehensive unit tests that ensure reliability of business logic. + +- Write unit tests for all business logic +- Follow given/when/then structure for test naming +- Use Assert statements for validating critical conditions +- Create test data factories for consistent test setup +- Always try to use standard library codeunits to create data and post documents +- When creating tests, use descriptive names that follow given/when/then pattern and include comprehensive assertions to validate expected behavior. + +### Examples + +```al +// Good example - Well-structured unit test with standard library codeunits +codeunit 50200 "Customer Management Tests" +{ + Subtype = Test; + + var + Assert: Codeunit Assert; + LibrarySales: Codeunit "Library - Sales"; + LibraryInventory: Codeunit "Library - Inventory"; + LibraryRandom: Codeunit "Library - Random"; + LibraryERM: Codeunit "Library - ERM"; + + [Test] + procedure GivenValidCustomer_WhenCreatingCustomer_ThenCustomerIsCreated() + var + Customer: Record Customer; + CustomerManagement: Codeunit "Customer Management"; + CustomerNo: Code[20]; + begin + // Given - Valid customer data using library + LibrarySales.CreateCustomer(Customer); + Customer."Credit Limit (LCY)" := LibraryRandom.RandDec(10000, 2); + + // When - Creating customer + CustomerNo := CustomerManagement.CreateCustomer(Customer); + + // Then - Customer is created successfully + Assert.IsTrue(Customer.Get(CustomerNo), 'Customer should be created'); + Assert.AreEqual(Customer.Name, Customer.Name, 'Customer name should match'); + end; + + [Test] + procedure GivenSalesOrder_WhenPostingOrder_ThenInvoiceIsCreated() + var + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + Item: Record Item; + PostedInvoiceNo: Code[20]; + begin + // Given - Sales order with library-created data + LibraryInventory.CreateItem(Item); + LibrarySales.CreateSalesHeader(SalesHeader, SalesHeader."Document Type"::Order, ''); + LibrarySales.CreateSalesLine(SalesLine, SalesHeader, SalesLine.Type::Item, Item."No.", LibraryRandom.RandInt(10)); + + // When - Posting sales order + PostedInvoiceNo := LibrarySales.PostSalesDocument(SalesHeader, true, true); + + // Then - Posted invoice exists + Assert.AreNotEqual('', PostedInvoiceNo, 'Posted invoice should be created'); + end; +} +``` + +## Rule 5: Feature-Based Test Organization + +### Intent +Organize test files to mirror the application structure while maintaining clear separation. + +- Test files should mirror App project structure in Test project +- Use same feature-based organization for tests +- Place shared test utilities in Common folder +- Maintain consistent naming patterns +- When creating test files, mirror the feature organization of the App project but place all tests in the Test project structure + +### Examples + +``` +// Good example - Mirrored test structure +App/src/ +├── NoSeries/ +│ ├── NoSeries.Table.al +│ └── NoSeries.Page.al +└── Sales/ + └── Invoice/ + └── SalesInvoice.Page.al + +Test/src/ +├── NoSeries/ +│ └── NoSeriesTests.Codeunit.al +├── Sales/ +│ └── Invoice/ +│ └── SalesInvoiceTests.Codeunit.al +└── Common/ + └── TestHelpers/ + └── TestDataFactory.Codeunit.al +``` \ No newline at end of file From 2a805b20dcb5845565230453af43c0a12e69c6a3 Mon Sep 17 00:00:00 2001 From: Dmitry Katson Date: Wed, 30 Jul 2025 22:08:25 +0800 Subject: [PATCH 32/60] Update AL coding guidelines to use PascalCase for variable and function names - Corrected naming conventions in the AL code style documentation to specify PascalCase instead of camelCase for variables and functions. - Adjusted examples throughout the documentation to reflect the updated naming conventions. - Enhanced clarity in performance guidelines by renaming procedures for better understanding. --- content/docs/vibe-coding/al-code-style.md | 4 ++-- content/docs/vibe-coding/al-events.md | 4 ++-- content/docs/vibe-coding/al-guidelines-rules.md | 2 +- .../docs/vibe-coding/al-naming-conventions.md | 16 ++++++++-------- content/docs/vibe-coding/al-performance.md | 4 ++-- content/docs/vibe-coding/al-testing.md | 1 - 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/content/docs/vibe-coding/al-code-style.md b/content/docs/vibe-coding/al-code-style.md index 6e1aea24..a8f429ef 100644 --- a/content/docs/vibe-coding/al-code-style.md +++ b/content/docs/vibe-coding/al-code-style.md @@ -11,7 +11,7 @@ alwaysApply: true These rules ensure consistent code structure and organization across AL projects, making code more maintainable and AI-assistant friendly. ## Style guidelines for AL code - - Always use camelCase for variable and function names. + - Always use PascalCase for variable and function names. - Use PascalCase for object names (e.g., tables, pages, reports). - Maintain a consistent indentation style (2 spaces preferred). @@ -22,7 +22,7 @@ These rules ensure consistent code structure and organization across AL projects ## Rule 1: Consistent Indentation and Formatting ### Intent -Maintain consistent code formatting to improve readability and enable better AI understanding of code structure. Use 2-space indentation consistently throughout your project and maintain consistent formatting within functions and procedures. +Maintain consistent code formatting to improve readability and enable better AI understanding of code structure. Use indentation with two spaces consistently throughout your project and maintain consistent formatting within functions and procedures. ### Examples diff --git a/content/docs/vibe-coding/al-events.md b/content/docs/vibe-coding/al-events.md index 20afabfc..8eab527c 100644 --- a/content/docs/vibe-coding/al-events.md +++ b/content/docs/vibe-coding/al-events.md @@ -22,10 +22,10 @@ Implement proper event patterns to enable extensibility without modifying base a codeunit 50100 "Sales Document Events Handler" { [EventSubscriber(ObjectType::Table, Database::"Sales Header", OnBeforeInsert, '', false, false)] - local procedure OnBeforeInsertSalesHeader(var Rec: Record "Sales Header"; RunTrigger: Boolean) + local procedure OnBeforeInsertSalesHeader(var SalesHeader: Record "Sales Header"; RunTrigger: Boolean) begin // Custom validation logic - ValidateCustomFields(Rec); + ValidateCustomFields(SalesHeader); end; } ``` diff --git a/content/docs/vibe-coding/al-guidelines-rules.md b/content/docs/vibe-coding/al-guidelines-rules.md index e01462bd..f0caf625 100644 --- a/content/docs/vibe-coding/al-guidelines-rules.md +++ b/content/docs/vibe-coding/al-guidelines-rules.md @@ -36,7 +36,7 @@ The following rule sets provide comprehensive guidance for AL development: ## Key Guidelines Summary - **File Naming**: Use `..al` pattern consistently -- **Code Style**: Use 2-space indentation and camelCase for variables, PascalCase for objects +- **Code Style**: Use two space indentation and PascalCase for variables, PascalCase for objects - **Folder Structure**: Organize by feature (`src/feature/subfeature/`) not by object type - **Performance**: Filter data early, use temporary tables, avoid unnecessary loops - **Events**: Prefer integration events over direct modifications for extensibility diff --git a/content/docs/vibe-coding/al-naming-conventions.md b/content/docs/vibe-coding/al-naming-conventions.md index 0de377f6..f5bed480 100644 --- a/content/docs/vibe-coding/al-naming-conventions.md +++ b/content/docs/vibe-coding/al-naming-conventions.md @@ -65,24 +65,24 @@ SalesPostingTests.Codeunit.al ## Rule 3: Variable and Function Naming ### Intent -Use consistent naming conventions for variables and functions to improve code readability. Use camelCase for variable and function names, descriptive names that clearly indicate purpose, and avoid abbreviations unless they are well-known business terms. Use consistent parameter naming in procedures. +Use consistent naming conventions for variables and functions to improve code readability. Use PascalCase for variable and function names, descriptive names that clearly indicate purpose, and avoid abbreviations unless they are well-known business terms. Use consistent parameter naming in procedures. ### Examples ```al // Good examples - Variables var - customerLedgerEntry: Record "Cust. Ledger Entry"; - totalAmount: Decimal; - discountPercentage: Decimal; - isValidTransaction: Boolean; + CustomerLedgerEntry: Record "Cust. Ledger Entry"; + TotalAmount: Decimal; + DiscountPercentage: Decimal; + IsValidTransaction: Boolean; ``` ```al // Good examples - Functions -procedure calculateCustomerBalance(customerNo: Code[20]): Decimal -procedure validateSalesDocument(var salesHeader: Record "Sales Header") -procedure updateInventoryQuantity(itemNo: Code[20]; quantity: Decimal) +procedure CalculateCustomerBalance(CustomerNo: Code[20]): Decimal +procedure ValidateSalesDocument(var SalesHeader: Record "Sales Header") +procedure UpdateInventoryQuantity(ItemNo: Code[20]; Quantity: Decimal) ``` ## Rule 4: Parameter Naming in Event Subscribers diff --git a/content/docs/vibe-coding/al-performance.md b/content/docs/vibe-coding/al-performance.md index e9d9c156..9e4aa7aa 100644 --- a/content/docs/vibe-coding/al-performance.md +++ b/content/docs/vibe-coding/al-performance.md @@ -26,7 +26,7 @@ Optimize queries by filtering data as early as possible to reduce data transfer ```al // Good example - Early filtering -procedure GetCustomersByCity(CityFilter: Text): Integer +procedure GetNumberOfCustomersByCity(CityFilter: Text): Integer var Customer: Record Customer; begin @@ -43,7 +43,7 @@ end; ```al // Bad example (avoid processing all records) -procedure GetCustomersByCity(CityFilter: Text): Integer +procedure GetNumberOfCustomersByCity(CityFilter: Text): Integer var Customer: Record Customer; Count: Integer; diff --git a/content/docs/vibe-coding/al-testing.md b/content/docs/vibe-coding/al-testing.md index 68bc9370..2c09aff0 100644 --- a/content/docs/vibe-coding/al-testing.md +++ b/content/docs/vibe-coding/al-testing.md @@ -169,7 +169,6 @@ Organize test files to mirror the application structure while maintaining clear - Use same feature-based organization for tests - Place shared test utilities in Common folder - Maintain consistent naming patterns -- When creating test files, mirror the feature organization of the App project but place all tests in the Test project structure ### Examples From 0aadb75631f1a5ac0f6b4f61ec988634e1f7b402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Br=C3=A4unlich?= Date: Fri, 8 Aug 2025 23:49:08 +0200 Subject: [PATCH 33/60] update upload-pages-artifact to v3 --- .github/workflows/hugo.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index db43f9f2..8ce2ef8c 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -56,7 +56,7 @@ jobs: --minify \ --baseURL "${{ steps.pages.outputs.base_url }}/" - name: Upload artifact - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 with: path: ./public From 3254d9b7e8bb492233f52f7aa36330fc107a28e3 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Mon, 11 Aug 2025 10:15:56 +0200 Subject: [PATCH 34/60] Update GitHub Page deploy action --- .github/workflows/hugo.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index 8ce2ef8c..c833b917 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -70,4 +70,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v4 From 4a0ab33045054c923b9d799e03ebdfbe3fa97f58 Mon Sep 17 00:00:00 2001 From: Nikola Kukrika Date: Tue, 16 Sep 2025 15:44:59 +0200 Subject: [PATCH 35/60] Upgrade review guideliness --- .../al-upgrade-claude-instructions.md | 431 ++++++++++++++++++ 1 file changed, 431 insertions(+) create mode 100644 content/docs/vibe-coding/al-upgrade-claude-instructions.md diff --git a/content/docs/vibe-coding/al-upgrade-claude-instructions.md b/content/docs/vibe-coding/al-upgrade-claude-instructions.md new file mode 100644 index 00000000..456d1b95 --- /dev/null +++ b/content/docs/vibe-coding/al-upgrade-claude-instructions.md @@ -0,0 +1,431 @@ +--- +title: "AL Upgrade Instructions" +description: > + Guidelines for writing and handling upgrade code +globs: ["*.al"] +alwaysApply: false +--- + +## Overview +These instructions cover how to write and review Business Central AL upgrade code following best practices for performance, reliability, and maintainability. + +## 1. Upgrade Codeunit Structure + +### Basic Structure +All upgrade codeunits must follow this exact structure: + +```al +codeunit [ID] [CodeunitName] +{ + Subtype = Upgrade; + + trigger OnCheckPreconditionsPerCompany() + begin + // Your code here + end; + + trigger OnCheckPreconditionsPerDatabase() + begin + // Your code here + end; + + trigger OnUpgradePerCompany() + begin + // Your code here + end; + + trigger OnUpgradePerDatabase() + begin + // Your code here + end; + + trigger OnValidateUpgradePerCompany() + begin + // Your code here + end; + + trigger OnValidateUpgradePerDatabase() + begin + // Your code here + end; +} +``` + +### Critical Rule: Avoid OnValidate and OnCheckPreconditions Triggers +- **DO NOT USE** `OnValidateUpgradePerCompany()` and `OnValidateUpgradePerDatabase()` triggers +- **DO NOT USE** `OnCheckPreconditionsPerCompany()` and `OnCheckPreconditionsPerDatabase()` triggers +- These triggers have performance impact and run on every upgrade +- If developer insists on using them: + - They MUST provide written justification + - Code MUST include checks to skip execution when upgrade is completed + - Should use upgrade tags for these checks + +## 2. OnUpgrade Trigger Implementation + +### Rule: No Direct Code in Triggers +OnUpgrade triggers should only contain method calls, never direct implementation: + +**INCORRECT Example:** +```al +trigger OnUpgradePerCompany() +begin + // Direct implementation code here - WRONG! + Customer.ModifyAll("Some Field", true); +end; +``` + +**CORRECT Example:** +```al +codeunit 4123 UpgradeMyFeature +{ + Subtype = Upgrade; + + trigger OnUpgradePerCompany() + begin + UpgradeMyFeature(); + UpgradeSecondFeature(); + end; + + local procedure UpgradeMyFeature() + begin + Customer.ModifyAll("Some Field", true); + // Other upgrade code here + end; + + local procedure UpgradeSecondFeature() + begin + // Your upgrade implementation here + end; +} +``` + +## 3. Error Handling Philosophy + +### Rule: Minimize Upgrade Blocking +- **Throw errors ONLY** when absolutely necessary to abort upgrade +- Handle unexpected scenarios gracefully without blocking. All read operations (GET, FIND, FINDSET, FINDLAST) should have IF THEN +- Use telemetry for logging issues instead of throwing errors +- Customers should not be blocked from upgrading due to data inconsistencies + +**Example:** +```al +// GOOD - Handle gracefully +if not Customer.Get(CustomerNo) then begin + // Log telemetry about missing customer + Session.LogMessage('0000ABC', 'Customer not found during upgrade', Verbosity::Warning, DataClassification::SystemMetadata); + exit; // Continue with upgrade +end; + +// BAD - Blocks upgrade +Customer.Get(CustomerNo); // Will throw error if not found +``` + +## 4. Database Operations Safety + +### Rule: All Read Operations Must Be Protected +Every GET, FIND, FINDSET, FINDLAST operation MUST be within IF-THEN structure: + +**CORRECT Examples:** +```al +if Customer.Get(CustomerNo) then + Customer.Modify(); + +if ItemLedgerEntry.FindSet() then + repeat + // Process records + until ItemLedgerEntry.Next() = 0; + +if SalesHeader.FindLast() then + // Process record +``` + +**INCORRECT Examples:** +```al +Customer.Get(CustomerNo); // WRONG - not protected +SalesHeader.FindLast(); // WRONG - not protected +``` + +## 5. Execution Control - Use Upgrade Tags (Not Version Checks) + +### AVOID Version Checks +**BAD Examples (Do Not Use):** +```al +// WRONG - Version check approach +if MyApplication.DataVersion().Major > 14 then + exit; + +// WRONG - Complex version structure +if MyApplication.DataVersion().Major < 14 then + UpgradeFeatureA() +else if MyApplicationDataVersion().Major < 17 then + UpgradeFeatureB() +else + exit; +``` + +### Valid Version Check Usage +**ONLY acceptable use** - checking for first installation: +```al +trigger OnInstallAppPerCompany() +var + AppInfo: ModuleInfo; +begin + NavApp.GetCurrentModuleInfo(AppInfo); + if (AppInfo.DataVersion() <> Version.Create('0.0.0.0')) then + exit; + // Insert installation code here +end; + +// Alternative approach +trigger OnInstallAppPerCompany() +var + AppInfo: ModuleInfo; +begin + if AppInfo.DataVersion().Major() = 0 then + SetAllUpgradeTags(); + + CompanyInitialize(); +end; +``` + +### USE Upgrade Tags (Preferred Method) +**CORRECT Implementation:** +```al +local procedure UpgradeMyFeature() +var + UpgradeTag: Codeunit "Upgrade Tag"; +begin + if UpgradeTag.HasUpgradeTag(MyUpgradeTag()) then + exit; + + // Your upgrade code here + + UpgradeTag.SetUpgradeTag(MyUpgradeTag()); +end; + +// Register PerCompany tags +[EventSubscriber(ObjectType::Codeunit, Codeunit::"Upgrade Tag", 'OnGetPerCompanyUpgradeTags', '', false, false)] +local procedure RegisterPerCompanyTags(var PerCompanyUpgradeTags: List of [Code[250]]) +begin + PerCompanyUpgradeTags.Add(MyUpgradeTag()); +end; + +// Register PerDatabase tags +[EventSubscriber(ObjectType::Codeunit, Codeunit::"Upgrade Tag", 'OnGetPerDatabaseUpgradeTags', '', false, false)] +local procedure RegisterPerDatabaseTags(var PerDatabaseUpgradeTags: List of [Code[250]]) +begin + PerDatabaseUpgradeTags.Add(MyUpgradeTag()); +end; +``` + +### Upgrade Tag Rules +- Maximum 2 levels of nesting in upgrade tag logic +- No complex if-then structures +- Reuse existing event subscribers when possible - only add new lines +- Use upgrade tags ONLY in upgrade code + +## 6. No Outside Calls During Upgrade + +### Rule: No Outside Calls During Upgrade +**FORBIDDEN during upgrade:** +- HttpClient or web service requests +- DotNet interop method calls +- Any external system communication + +These operations can fail and block the upgrade process. If they succeed and the upgrade fails, it may not be possible to roll changes back. + +## 7. Execution Context Awareness + +### Rule: Use Execution Context to Skip Code +It's acceptable to skip code execution during upgrade using ExecutionContext: + +**CORRECT Example:** +```al +// Don't add report selection entries during upgrade +if GetExecutionContext() = ExecutionContext::Upgrade then + exit; +``` + +**Requirements:** +- MUST include comment explaining why code is skipped +- Should be used sparingly and with clear justification + +## 8. DataTransfer Usage for Performance + +### When to Use DataTransfer +**MUST use DataTransfer when:** +- Table can contain more than 300,000 records +- Adding new fields to existing tables +- Adding new tables that need data initialization + +**MUST use ONLY for:** +- New fields and tables added in the same PR +- Initializing newly added data structures + +If there is no new fields and tables, comment should be added that the validation triggers and event subscribers will not be raised, potentially breaking the business logic. + +### DataTransfer vs Loop/Modify Comparison + +**BAD Example (Loop/Modify - Avoid for Large Data):** +```al +local procedure UpdatePriceSourceGroupInPriceListLines() +var + PriceListLine: Record "Price List Line"; + UpgradeTag: Codeunit "Upgrade Tag"; + UpgradeTagDefinitions: Codeunit "Upgrade Tag Definitions"; +begin + if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetPriceSourceGroupUpgradeTag()) then + exit; + + PriceListLine.SetRange("Source Group", "Price Source Group"::All); + if PriceListLine.FindSet(true) then + repeat + if PriceListLine."Source Type" in + ["Price Source Type"::"All Jobs", + "Price Source Type"::Job, + "Price Source Type"::"Job Task"] + then + PriceListLine."Source Group" := "Price Source Group"::Job + else + case PriceListLine."Price Type" of + "Price Type"::Purchase: + PriceListLine."Source Group" := "Price Source Group"::Vendor; + "Price Type"::Sale: + PriceListLine."Source Group" := "Price Source Group"::Customer; + end; + if PriceListLine."Source Group" <> "Price Source Group"::All then + PriceListLine.Modify(); + until PriceListLine.Next() = 0; + + UpgradeTag.SetUpgradeTag(UpgradeTagDefinitions.GetPriceSourceGroupFixedUpgradeTag()); +end; +``` + +**GOOD Example (DataTransfer - Use for Large Data):** +```al +local procedure UpdatePriceSourceGroupInPriceListLines() +var + PriceListLine: Record "Price List Line"; + UpgradeTag: Codeunit "Upgrade Tag"; + UpgradeTagDefinitions: Codeunit "Upgrade Tag Definitions"; + PriceListLineDataTransfer: DataTransfer; +begin + if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetPriceSourceGroupUpgradeTag()) then + exit; + + // Update Job-related records + PriceListLineDataTransfer.SetTables(Database::"Price List Line", Database::"Price List Line"); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Source Group"), '=%1', "Price Source Group"::All); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Source Type"), '%1|%2|%3', + "Price Source Type"::"All Jobs", "Price Source Type"::Job, "Price Source Type"::"Job Task"); + PriceListLineDataTransfer.AddConstantValue("Price Source Group"::Job, PriceListLine.FieldNo("Source Group")); + PriceListLineDataTransfer.CopyFields(); + Clear(PriceListLineDataTransfer); + + // Update Vendor-related records + PriceListLineDataTransfer.SetTables(Database::"Price List Line", Database::"Price List Line"); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Source Group"), '=%1', "Price Source Group"::All); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Source Type"), '<>%1&<>%2&<>%3', + "Price Source Type"::"All Jobs", "Price Source Type"::Job, "Price Source Type"::"Job Task"); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Price Type"), '=%1', "Price Type"::Purchase); + PriceListLineDataTransfer.AddConstantValue("Price Source Group"::Vendor, PriceListLine.FieldNo("Source Group")); + PriceListLineDataTransfer.CopyFields(); + Clear(PriceListLineDataTransfer); + + // Update Customer-related records + PriceListLineDataTransfer.SetTables(Database::"Price List Line", Database::"Price List Line"); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Source Group"), '=%1', "Price Source Group"::All); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Source Type"), '<>%1&<>%2&<>%3', + "Price Source Type"::"All Jobs", "Price Source Type"::Job, "Price Source Type"::"Job Task"); + PriceListLineDataTransfer.AddSourceFilter(PriceListLine.FieldNo("Price Type"), '=%1', "Price Type"::Sale); + PriceListLineDataTransfer.AddConstantValue("Price Source Group"::Customer, PriceListLine.FieldNo("Source Group")); + PriceListLineDataTransfer.CopyFields(); + + UpgradeTag.SetUpgradeTag(UpgradeTagDefinitions.GetPriceSourceGroupFixedUpgradeTag()); +end; +``` + +**BAD Example (Loop/Modify - Avoid for Large Data):** +```al + ItemJournalLine.SetLoadFields("Cross-Reference No.", "Item Reference No."); + ItemJournalLine.SetFilter("Cross-Reference No.", '<>%1', ''); + if ItemJournalLine.FindSet() then + repeat + ItemJournalLine."Item Reference No." := ItemJournalLine."Cross-Reference No."; + ItemJournalLine.Modify(); + until ItemJournalLine.Next() = 0; +``` + +**GOOD Example (DataTransfer - Use for Large Data):** +```al + ItemJournalLine.SetFilter("Item Reference No.", '<>%1', ''); + if ItemJournalLine.IsEmpty() then begin + ItemJournalLineDataTransfer.SetTables(Database::"Item Journal Line", Database::"Item Journal Line"); + ItemJournalLineDataTransfer.AddSourceFilter(ItemJournalLine.FieldNo("Cross-Reference No."), '<>%1', ''); + ItemJournalLineDataTransfer.AddFieldValue(ItemJournalLine.FieldNo("Cross-Reference No."), ItemJournalLine.FieldNo("Item Reference No.")); + ItemJournalLineDataTransfer.CopyFields(); + end; +``` + +## 9. InitValue and Upgrade Code Connection + +### Rule: New Fields with InitValue Need Upgrade Code +When a field is added with InitValue: +- InitValue applies ONLY to new records +- Existing records get datatype default (0 for numbers, false for Boolean) +- Code reviewer MUST ask if upgrade code is needed + +**Example Field Addition:** +```al +field(100; "Override Allowed"; Boolean) +{ + DataClassification = CustomerContent; + Caption = 'Override Manual'; + InitValue = true; +} +``` + +**Required Upgrade Code:** +```al +local procedure UpgradeAllocationAccounts() +var + BlankAllocationAccount: Record "Allocation Account"; + UpgradeTag: Codeunit "Upgrade Tag"; + UpgradeTagDefinitions: Codeunit "Upgrade Tag Definitions"; + AllocationAccountDataTransfer: DataTransfer; +begin + if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetUpgradeAllocationAccountsTag()) then + exit; + + AllocationAccountDataTransfer.SetTables(Database::"Allocation Account", Database::"Allocation Account"); + AllocationAccountDataTransfer.AddConstantValue(true, BlankAllocationAccount.FieldNo("Override Allowed")); + AllocationAccountDataTransfer.CopyFields(); + + UpgradeTag.SetUpgradeTag(UpgradeTagDefinitions.GetUpgradeAllocationAccountsTag()); +end; +``` + +## Review Checklist + +When reviewing upgrade code, verify: + +1. ✅ No direct code in OnUpgrade triggers (only method calls) +2. ✅ No OnValidate or OnCheckPreconditions triggers without justification +3. ✅ All database read operations are protected with IF-THEN +4. ✅ Upgrade tags used instead of version checks +5. ✅ No external calls (HTTP, DotNet interop) +6. ✅ DataTransfer used for tables > 300k records +7. ✅ DataTransfer only used for new fields/tables +8. ✅ InitValue fields have corresponding upgrade code +9. ✅ Proper error handling (minimal blocking) +10. ✅ Upgrade tags properly registered with event subscribers + +## Common Anti-Patterns to Flag + +- Version checking instead of upgrade tags +- Direct database operations without IF protection +- Loop/Modify pattern on large datasets +- Missing upgrade code for InitValue fields +- External service calls during upgrade +- Complex nested upgrade tag logic +- Direct implementation in OnUpgrade triggers \ No newline at end of file From 7dd5bae8c9f083e1a8f2deace0cfc442ba369792 Mon Sep 17 00:00:00 2001 From: Igor <62580819+igor-ctrl@users.noreply.github.com> Date: Wed, 1 Oct 2025 15:34:12 -0500 Subject: [PATCH 36/60] Update index.md ## Update No. Series pattern for BC v24+ modern API Microsoft deprecated `NoSeriesManagement` in BC v24+. Added modern `codeunit "No. Series"` pattern documentation with simplified API examples, comparison table, and method reference. Legacy content preserved for backward compatibility. Real-world implementation verified in production BC extension. --- content/docs/patterns/no-series/index.md | 64 +++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/content/docs/patterns/no-series/index.md b/content/docs/patterns/no-series/index.md index a28c48ec..538a7eb9 100644 --- a/content/docs/patterns/no-series/index.md +++ b/content/docs/patterns/no-series/index.md @@ -10,6 +10,68 @@ _Created by Microsoft, Described by Jeremy Vyska (Spare Brained Ideas)_ The "Number Series" system is used extensively to provide numbers to master records, documents, and other transactions through Microsoft Dynamics 365 Business Central. +## Important: BC v24+ Modern Pattern (Updated 2024) + +**As of Business Central version 24.0 and later**, Microsoft deprecated the `NoSeriesManagement` codeunit in favor of the new `codeunit "No. Series"` with simplified methods. + +### Modern Implementation (BC v24+) + +**Variable declaration:** +```al +var + NoSeries: Codeunit "No. Series"; +``` + +**OnInsert pattern (simplified):** +```al +trigger OnInsert() +begin + if "No." = '' then begin + MySetup.Get(); + MySetup.TestField("Document Nos."); + "No. Series" := MySetup."Document Nos."; + if NoSeries.AreRelated(MySetup."Document Nos.", xRec."No. Series") then + "No. Series" := xRec."No. Series"; + "No." := NoSeries.GetNextNo("No. Series"); + end; +end; +``` + +**OnValidate pattern (same as before):** +```al +trigger OnValidate() +begin + if "No." <> xRec."No." then begin + MySetup.Get(); + NoSeries.TestManual(MySetup."Document Nos."); + "No. Series" := ''; + end; +end; +``` + +### Key Differences from Legacy Pattern + +| Legacy (NoSeriesManagement) | Modern (No. Series) | +|----------------------------|---------------------| +| `NoSeriesMgt.InitSeries(...)` - 5 parameters | `NoSeries.GetNextNo(...)` - 1-2 parameters | +| `NoSeriesMgt.TestManual(...)` | `NoSeries.TestManual(...)` - Same method name | +| `NoSeriesMgt.TryGetNextNo(...)` | `NoSeries.PeekNextNo(...)` - New name | +| `NoSeriesMgt.SelectSeries(...)` | `NoSeries.AreRelated(...)` - Simplified API | +| Complex parameter passing | Simplified, intuitive API | + +### Migration Strategy + +For **backward compatibility** (supporting both BC v23 and v24+): +1. Use conditional compilation with `#if` directives based on platform version +2. Check runtime platform version and branch logic accordingly +3. Implement both patterns in separate procedures with version detection + +{{% alert title="Note" color="warning" %}} +**The examples below reflect the LEGACY pattern** (NoSeriesManagement codeunit) for reference and historical context. For new development on BC v24+, use the modern `codeunit "No. Series"` pattern shown above. +{{% /alert %}} + +--- + ## Description At the heart of things, the Number Series engine allows users to define structure for a sequential numeric or alphanumeric string (collectively referred to as a 'number series'), then assign that structure to different parts of the system. @@ -283,4 +345,4 @@ For usage of number series, there is more information available on: - [Microsoft Docs: Create Number Series](https://docs.microsoft.com/en-us/dynamics365/business-central/ui-create-number-series) - [Microsoft Learn: Set up number series and trail codes](https://docs.microsoft.com/en-us/learn/modules/number-series-trail-codes-dynamics-365-business-central/) -For more programming details, there is more information on [Microsoft Docs: Number Sequences in Business Central](https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-number-sequences). \ No newline at end of file +For more programming details, there is more information on [Microsoft Docs: Number Sequences in Business Central](https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-number-sequences). From 17f18636c71929d0a3490718e64a045e33cf279e Mon Sep 17 00:00:00 2001 From: Nikola Kukrika Date: Wed, 8 Oct 2025 12:52:09 +0200 Subject: [PATCH 37/60] Adding lattest instructions --- ...e-claude-instructions.md => al-upgrade.md} | 72 +++++++++++++------ 1 file changed, 49 insertions(+), 23 deletions(-) rename content/docs/vibe-coding/{al-upgrade-claude-instructions.md => al-upgrade.md} (85%) diff --git a/content/docs/vibe-coding/al-upgrade-claude-instructions.md b/content/docs/vibe-coding/al-upgrade.md similarity index 85% rename from content/docs/vibe-coding/al-upgrade-claude-instructions.md rename to content/docs/vibe-coding/al-upgrade.md index 456d1b95..3113ca8b 100644 --- a/content/docs/vibe-coding/al-upgrade-claude-instructions.md +++ b/content/docs/vibe-coding/al-upgrade.md @@ -103,7 +103,22 @@ codeunit 4123 UpgradeMyFeature ### Rule: Minimize Upgrade Blocking - **Throw errors ONLY** when absolutely necessary to abort upgrade -- Handle unexpected scenarios gracefully without blocking. All read operations (GET, FIND, FINDSET, FINDLAST) should have IF THEN +- Handle unexpected scenarios gracefully without blocking. All read operations (Get, Find, FindSet, FindFirst, FindLast) should have if [OPERATION] then to make it safe. +**BAD EXAMPLE** +```al +Item.Get(); +Customer.FindSet(); +Vendor.FindLast(); +``` +**GOOD EXAMPLE** +```al +if Item.Get() then + // CustomCode; +if Customer.FindSet() then; +if not Vendor.FindLast() then + exit; +``` + - Use telemetry for logging issues instead of throwing errors - Customers should not be blocked from upgrading due to data inconsistencies @@ -127,22 +142,22 @@ Every GET, FIND, FINDSET, FINDLAST operation MUST be within IF-THEN structure: **CORRECT Examples:** ```al -if Customer.Get(CustomerNo) then - Customer.Modify(); +if MyTable.Get(CustomerNo) then + MyTable.Modify(); -if ItemLedgerEntry.FindSet() then +if MyTable.FindSet() then repeat // Process records - until ItemLedgerEntry.Next() = 0; + until MyTable.Next() = 0; -if SalesHeader.FindLast() then +if MyTable.FindLast() then // Process record ``` **INCORRECT Examples:** ```al -Customer.Get(CustomerNo); // WRONG - not protected -SalesHeader.FindLast(); // WRONG - not protected +MyTable.Get(CustomerNo); // WRONG - not protected +MyTable.FindLast(); // WRONG - not protected ``` ## 5. Execution Control - Use Upgrade Tags (Not Version Checks) @@ -221,9 +236,10 @@ end; ### Upgrade Tag Rules - Maximum 2 levels of nesting in upgrade tag logic - No complex if-then structures -- Reuse existing event subscribers when possible - only add new lines +- **IMPORTANT** When adding new lines to the register upgrade tags subscribers you must check from where the upgrade method is called. If it is called from OnUpgradePerCompany then it must be registered from OnGetPerCompanyUpgradeTags method. If it is called from OnUpgradePerDatabase it must be registered under OnGetPerDatabaseUpgradeTags. It **MUST** not be called from both, we need to use a different tags in this case. +- Reuse existing event subscribers when possible - only add new lines. - Use upgrade tags ONLY in upgrade code - +- Every new upgrade tag added **MUST** be referenced within an OnGetPerDatabaseUpgradeTags or OnGetPerCompanyUpgradeTags event subscriber ## 6. No Outside Calls During Upgrade ### Rule: No Outside Calls During Upgrade @@ -262,7 +278,9 @@ if GetExecutionContext() = ExecutionContext::Upgrade then - New fields and tables added in the same PR - Initializing newly added data structures -If there is no new fields and tables, comment should be added that the validation triggers and event subscribers will not be raised, potentially breaking the business logic. +**IMPORTANT** +- If there is no new fields and tables, comment should be added that the validation triggers and event subscribers will not be raised, potentially breaking the business logic. +- If a new field is added, especially with InitValue, datatransfer is strongly recommended to be used to have a fast upgrade. ### DataTransfer vs Loop/Modify Comparison @@ -373,35 +391,43 @@ end; When a field is added with InitValue: - InitValue applies ONLY to new records - Existing records get datatype default (0 for numbers, false for Boolean) -- Code reviewer MUST ask if upgrade code is needed +- Code reviewer MUST ask if upgrade code is needed for each of the fields. **Example Field Addition:** ```al -field(100; "Override Allowed"; Boolean) +field(100; "New Field"; Boolean) { DataClassification = CustomerContent; - Caption = 'Override Manual'; + Caption = 'New Field'; InitValue = true; } + +field(101; "New Field 2"; Integer) +{ + DataClassification = CustomerContent; + Caption = 'New Field 2'; + InitValue = 5; +} ``` **Required Upgrade Code:** ```al -local procedure UpgradeAllocationAccounts() +local procedure UpgradeMyTables() var - BlankAllocationAccount: Record "Allocation Account"; + BlankMyTable: Record "My Table"; UpgradeTag: Codeunit "Upgrade Tag"; UpgradeTagDefinitions: Codeunit "Upgrade Tag Definitions"; - AllocationAccountDataTransfer: DataTransfer; + MyTableDataTransfer: DataTransfer; begin - if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetUpgradeAllocationAccountsTag()) then + if UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetUpgradeMyTablesTag()) then exit; - AllocationAccountDataTransfer.SetTables(Database::"Allocation Account", Database::"Allocation Account"); - AllocationAccountDataTransfer.AddConstantValue(true, BlankAllocationAccount.FieldNo("Override Allowed")); - AllocationAccountDataTransfer.CopyFields(); + MyTableDataTransfer.SetTables(Database::"My Table", Database::"My Table"); + MyTableDataTransfer.AddConstantValue(true, BlankMyTable.FieldNo("New Field")); + MyTableDataTransfer.AddConstantValue(5, BlankMyTable.FieldNo("New Field 2")); + MyTableDataTransfer.CopyFields(); - UpgradeTag.SetUpgradeTag(UpgradeTagDefinitions.GetUpgradeAllocationAccountsTag()); + UpgradeTag.SetUpgradeTag(UpgradeTagDefinitions.GetUpgradeMyTablesTag()); end; ``` @@ -416,7 +442,7 @@ When reviewing upgrade code, verify: 5. ✅ No external calls (HTTP, DotNet interop) 6. ✅ DataTransfer used for tables > 300k records 7. ✅ DataTransfer only used for new fields/tables -8. ✅ InitValue fields have corresponding upgrade code +8. ✅ InitValue fields have corresponding upgrade code. Each new file **MUST** be verified. 9. ✅ Proper error handling (minimal blocking) 10. ✅ Upgrade tags properly registered with event subscribers From 4db38ba4d3955a248d14b657e3e30a39f85463d2 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 10 Oct 2025 12:25:41 +0200 Subject: [PATCH 38/60] Add comprehensive agentic coding documentation - Add 6 MCP server documentation pages (bc-code-intelligence, al-dependency, azure-devops, serena, al-objid, clockify) - Add AI Coding Agents documentation (GitHub Copilot, Claude, Cursor) - Add Getting Started section (what is agentic coding, setup, prompting, best practices, limitations, glossary) - Add Getting More section (code review, documentation, telemetry examples) - Add Community Resources placeholders (articles, videos, tools) - Update Tools section to focus on MCP servers instead of VSCode extensions --- .../CommunityResources/Agents/_index.md | 217 +++++ .../CommunityResources/Agents/claude-agent.md | 757 ++++++++++++++++++ .../CommunityResources/Agents/cursor-agent.md | 675 ++++++++++++++++ .../Agents/github-copilot-agent.md | 552 +++++++++++++ .../Agents/github-copilot-chat-agent.md | 627 +++++++++++++++ .../CommunityResources/Tools/_index.md | 133 +++ .../Tools/al-dependency-mcp-server.md | 45 ++ .../Tools/al-objid-mcp-server.md | 44 + .../Tools/azure-devops-mcp.md | 46 ++ .../Tools/bc-code-intelligence-mcp.md | 43 + .../CommunityResources/Tools/clockify-mcp.md | 44 + .../CommunityResources/Tools/serena-mcp.md | 46 ++ .../CommunityResources/_index.md | 131 +++ .../CommunityResources/articles.md | 257 ++++++ .../CommunityResources/tools.md | 569 +++++++++++++ .../CommunityResources/videos.md | 402 ++++++++++ .../docs/agentic-coding/GettingMore/_index.md | 47 ++ .../agentic-coding/GettingMore/code-review.md | 368 +++++++++ .../GettingMore/documentation.md | 661 +++++++++++++++ .../agentic-coding/GettingMore/telemetry.md | 599 ++++++++++++++ .../agentic-coding/GettingStarted/_index.md | 20 + .../GettingStarted/best-practices.md | 415 ++++++++++ .../GettingStarted/effective-prompting.md | 358 +++++++++ .../agentic-coding/GettingStarted/glossary.md | 213 +++++ .../GettingStarted/limitations.md | 473 +++++++++++ .../agentic-coding/GettingStarted/setup.md | 226 ++++++ .../GettingStarted/what-is-agentic-coding.md | 128 +++ content/docs/agentic-coding/_index.md | 56 ++ 28 files changed, 8152 insertions(+) create mode 100644 content/docs/agentic-coding/CommunityResources/Agents/_index.md create mode 100644 content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md create mode 100644 content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md create mode 100644 content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md create mode 100644 content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/_index.md create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/al-dependency-mcp-server.md create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/azure-devops-mcp.md create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/bc-code-intelligence-mcp.md create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/clockify-mcp.md create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/serena-mcp.md create mode 100644 content/docs/agentic-coding/CommunityResources/_index.md create mode 100644 content/docs/agentic-coding/CommunityResources/articles.md create mode 100644 content/docs/agentic-coding/CommunityResources/tools.md create mode 100644 content/docs/agentic-coding/CommunityResources/videos.md create mode 100644 content/docs/agentic-coding/GettingMore/_index.md create mode 100644 content/docs/agentic-coding/GettingMore/code-review.md create mode 100644 content/docs/agentic-coding/GettingMore/documentation.md create mode 100644 content/docs/agentic-coding/GettingMore/telemetry.md create mode 100644 content/docs/agentic-coding/GettingStarted/_index.md create mode 100644 content/docs/agentic-coding/GettingStarted/best-practices.md create mode 100644 content/docs/agentic-coding/GettingStarted/effective-prompting.md create mode 100644 content/docs/agentic-coding/GettingStarted/glossary.md create mode 100644 content/docs/agentic-coding/GettingStarted/limitations.md create mode 100644 content/docs/agentic-coding/GettingStarted/setup.md create mode 100644 content/docs/agentic-coding/GettingStarted/what-is-agentic-coding.md create mode 100644 content/docs/agentic-coding/_index.md diff --git a/content/docs/agentic-coding/CommunityResources/Agents/_index.md b/content/docs/agentic-coding/CommunityResources/Agents/_index.md new file mode 100644 index 00000000..bd6e0f45 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Agents/_index.md @@ -0,0 +1,217 @@ +--- +title: "AI Coding Agents" +linkTitle: "Agents" +weight: 5 +description: > + Learn about different AI coding agents and how to use them for AL development +--- + +## Overview + +AI coding agents are intelligent assistants that help you write, review, and improve AL code for Business Central. This section explains the different types of agents available and how to choose the right one for your needs. + +## What are AI Coding Agents? + +AI coding agents are more than simple autocomplete tools. They can: +- Understand natural language instructions +- Generate complete code implementations +- Explain existing code +- Refactor and improve code quality +- Help debug issues +- Provide learning and guidance + +## Available Agents + +Explore detailed information about each AI coding agent: + +### [GitHub Copilot](github-copilot-agent) +Microsoft's AI pair programmer integrated into VS Code. + +**Best For**: +- Inline code completion as you type +- Quick code generation +- Learning AL patterns +- Teams already using GitHub + +**Key Features**: Real-time suggestions, multi-file context, AL-aware completions + +--- + +### [GitHub Copilot Chat](github-copilot-chat-agent) +Conversational AI assistant from GitHub with deep VS Code integration. + +**Best For**: +- Interactive code discussions +- Code explanations and learning +- Debugging assistance +- Complex refactoring tasks + +**Key Features**: Natural language chat, context-aware responses, inline chat + +--- + +### [Claude (via API or Claude.ai)](claude-agent) +Anthropic's AI assistant with strong reasoning capabilities. + +**Best For**: +- Complex problem solving +- Detailed code analysis +- Architecture discussions +- Large codebase understanding + +**Key Features**: Long context window, strong analytical abilities, helpful explanations + +--- + +### [Cursor](cursor-agent) +AI-first code editor built on VS Code with integrated AI assistance. + +**Best For**: +- All-in-one AI coding environment +- Teams wanting deep AI integration +- Multi-model AI access +- Codebase-wide AI context + +**Key Features**: Multiple AI models, composer mode, codebase indexing, chat + autocomplete + +--- + +## Comparison Matrix + +| Feature | GitHub Copilot | Copilot Chat | Claude | Cursor | +|---------|---------------|--------------|---------|---------| +| **Inline Completion** | ✓✓✓ Excellent | Limited | N/A | ✓✓✓ Excellent | +| **Chat Interface** | N/A | ✓✓✓ Excellent | ✓✓✓ Excellent | ✓✓✓ Excellent | +| **AL Awareness** | ✓✓ Good | ✓✓ Good | ✓ Basic | ✓✓ Good | +| **Code Explanation** | Limited | ✓✓✓ Excellent | ✓✓✓ Excellent | ✓✓✓ Excellent | +| **VS Code Integration** | ✓✓✓ Native | ✓✓✓ Native | ✗ Web/API | ✓✓✓ Fork | +| **Context Window** | Medium | Medium | ✓✓✓ Very Large | Large | +| **Multi-file Editing** | Limited | Limited | Manual | ✓✓✓ Excellent | +| **Pricing** | $10-19/mo | Included | Free/Pro | $20/mo | +| **Team Features** | ✓✓ Good | ✓✓ Good | Limited | ✓ Basic | + +**Legend**: ✓✓✓ Excellent | ✓✓ Good | ✓ Basic | Limited | ✗ Not Available | N/A Not Applicable + +## Choosing the Right Agent + +### For Individual Developers + +**Just Starting with AI?** +→ Start with [GitHub Copilot](github-copilot-agent) + [Copilot Chat](github-copilot-chat-agent) +- Easy setup +- Great VS Code integration +- Good AL support +- One subscription for both + +**Want Maximum AI Power?** +→ Try [Cursor](cursor-agent) +- Multiple AI models +- Strong codebase understanding +- All-in-one solution +- Advanced features + +**Need Deep Analysis?** +→ Use [Claude](claude-agent) for complex tasks +- Long context for large codebases +- Excellent reasoning +- Detailed explanations +- Free tier available + +### For Teams + +**Microsoft/GitHub Ecosystem?** +→ GitHub Copilot for Business +- Centralized management +- License management +- Organization policies +- Familiar tools + +**Maximum Flexibility?** +→ Cursor for Teams +- Multiple AI models +- Strong collaboration +- Advanced features +- Modern interface + +**Hybrid Approach?** +→ Combine tools: +- GitHub Copilot for daily coding +- Claude for complex analysis +- Cursor for specific projects + +## Using Multiple Agents + +Many developers use multiple agents for different tasks: + +**Daily Coding**: GitHub Copilot (inline suggestions) +**Learning & Debugging**: Copilot Chat or Cursor Chat +**Complex Problems**: Claude (detailed analysis) +**Refactoring**: Cursor (multi-file editing) + +**Example Workflow**: +1. Write code with GitHub Copilot inline suggestions +2. Ask Copilot Chat to explain complex BC patterns +3. Use Claude for architecture review of large features +4. Use Cursor for complex multi-file refactoring + +## Getting Started + +### New to AI Coding? + +1. **Start Simple**: [GitHub Copilot](github-copilot-agent) +2. **Learn the Basics**: [Effective Prompting](../../getting-started/effective-prompting) +3. **Try Examples**: [Getting More](../../getting-more) +4. **Explore Others**: Try Claude or Cursor for comparison + +### Already Using AI? + +**Expand Your Toolkit**: +- If using Copilot → Try Cursor for advanced features +- If using Claude → Add Copilot for inline completion +- If using Cursor → Use Claude for deep analysis + +## Common Questions + +### Can I use multiple agents? +Yes! Many developers use different agents for different tasks. They complement each other well. + +### Which is best for AL development? +GitHub Copilot has the most AL-specific training, but all agents can be effective with good prompting. + +### Are these expensive? +Most are $10-20/month for individual use. GitHub Copilot offers free access for students and open source maintainers. + +### Do I need internet? +Yes, all current AI agents require internet connectivity to function. + +### Will AI replace AL developers? +No. AI agents are tools to augment your capabilities, not replace your expertise and decision-making. + +## Privacy & Security + +All agents send code to external services. Consider: +- Review your organization's AI usage policy +- Don't include sensitive data in code +- Use business/enterprise plans for better controls +- Understand each tool's data handling policies + +See individual agent pages for specific privacy information. + +## Learning Path + +1. **Read agent pages** to understand capabilities +2. **Choose one** to start with +3. **Follow setup** instructions +4. **Practice** with examples from [Getting More](../../getting-more) +5. **Experiment** with others as needed + +## Resources + +- [Setup Guide](../../getting-started/setup) - Environment configuration +- [Effective Prompting](../../getting-started/effective-prompting) - Get better results +- [Best Practices](../../getting-started/best-practices) - Use AI effectively +- [Limitations](../../getting-started/limitations) - Understand constraints + +--- + +**Questions?** Join the discussion at [GitHub Discussions](https://github.com/microsoft/alguidelines/discussions) diff --git a/content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md new file mode 100644 index 00000000..806ce4f4 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md @@ -0,0 +1,757 @@ +--- +title: "Claude Agent" +linkTitle: "Claude" +weight: 3 +description: > + Anthropic's AI assistant with strong reasoning and large context window for AL development +--- + +## Overview + +Claude is Anthropic's AI assistant known for its strong reasoning capabilities, long context window, and helpful, detailed responses. While not specifically designed for coding, it excels at code analysis, architecture discussions, and complex problem-solving for AL development. + +**Developer**: Anthropic +**Type**: Conversational AI Assistant +**Primary Use**: Code analysis, learning, complex problem-solving +**Integration**: Web interface (Claude.ai) or API + +## What is Claude? + +Claude is a general-purpose AI assistant that: +- Provides detailed, thoughtful analysis +- Handles very large amounts of code +- Reasons through complex problems +- Explains concepts clearly +- Generates well-structured code +- Maintains context across long conversations + +### Access Methods + +**Claude.ai (Web)**: +- Free tier available +- Pro tier ($20/month) for more usage +- Upload files directly +- Conversation interface +- No IDE integration + +**Claude API**: +- Programmatic access +- Can be integrated into tools +- Pay-per-use pricing +- Requires development + +**Note**: Unlike Copilot/Cursor, Claude doesn't have native VS Code integration. + +## Key Capabilities for AL Development + +### Exceptional Context Window + +**Claude 3.5 Sonnet**: ~200K tokens +- Can analyze entire AL projects +- Process multiple large files simultaneously +- Maintain context across long conversations +- Reference earlier parts of discussion + +**Practical Use**: +``` +You can paste: +- Multiple complete AL files +- Entire codeunit implementations +- Full table structures +- Large amounts of documentation + +Claude maintains context and can reference any part. +``` + +### Strong Analytical Abilities + +**Code Analysis**: +- Deep understanding of code structure +- Identifies patterns and anti-patterns +- Suggests architectural improvements +- Explains complex logic clearly + +**Problem Solving**: +- Reasons through complex scenarios +- Considers multiple approaches +- Explains trade-offs +- Provides detailed rationale + +**Learning & Teaching**: +- Patient, clear explanations +- Step-by-step breakdowns +- Answers follow-up questions +- Adapts to your knowledge level + +## Strengths for AL Development + +### ✓ Exceptional At + +**Large Codebase Analysis**: +``` +Paste your entire project: +- All codeunits +- Table structures +- Page definitions +- Integration logic + +Ask: "Review this AL project for architectural improvements" + +Claude can analyze it all and provide comprehensive feedback. +``` + +**Architecture & Design**: +``` +Questions like: +- "Should I use events or direct calls for this integration?" +- "How should I structure this multi-tenant extension?" +- "What's the best way to handle this complex business logic?" + +Claude provides thoughtful, reasoned analysis. +``` + +**Complex Problem Solving**: +``` +Describe complex scenarios: +- Multi-step business processes +- Integration challenges +- Performance optimization +- Refactoring strategies + +Claude reasons through options and trade-offs. +``` + +**Learning & Understanding**: +``` +Questions like: +- "Explain Business Central's posting architecture" +- "How does AL's event system work?" +- "What are the differences between these BC patterns?" + +Claude provides detailed, educational responses. +``` + +### ⚠ Limitations + +**No IDE Integration**: +- Manual copy-paste workflow +- No inline suggestions +- No automatic context +- More context switching + +**AL-Specific Training**: +- Not specifically trained on AL +- May not know latest BC features +- Might suggest non-AL patterns +- Requires clear AL context + +**Real-Time Coding**: +- Not designed for quick completions +- Better for analysis than generation +- Slower workflow than Copilot +- Best for thoughtful tasks + +## Practical AL Examples + +### Architecture Review + +**You** (paste entire project): +``` +I'm building a customer loyalty system for Business Central. +Here are my main files: + +[Paste 5-10 AL files totaling thousands of lines] + +Review the architecture and suggest improvements. +``` + +**Claude Responds**: +``` +I've analyzed your loyalty system implementation. Here's my review: + +Overall Architecture: +Your implementation follows a good separation of concerns with: +- Setup tables (Loyalty Tier, Loyalty Rules) +- Transaction table (Loyalty Points Entry) +- Processing codeunits (Points Calculator, Tier Evaluator) +- Integration through event subscribers + +Strengths: +1. Good use of events for extensibility +2. Clear separation between setup and transactions +3. Proper use of temporary tables for calculations + +Areas for Improvement: + +1. Performance Optimization (Table 50101 "Loyalty Points Entry"): + - Current implementation recalculates totals on every query + - Recommendation: Add a "Total Points" field on Customer table + - Use events to update when points are added/removed + - Reduces database load significantly + +2. Transaction Handling (Codeunit 50100): + Lines 45-67 process points without transaction wrapping. + This could lead to partial updates if an error occurs. + + Suggested pattern: + procedure AwardPoints(...) + begin + // Wrap in Codeunit.Run for transaction + if not AwardPointsInternal(...) then + Error(GetLastErrorText()); + end; + + procedure AwardPointsInternal(...): Boolean + begin + // Processing logic here + end; + +3. Testing Considerations: + - No test codeunits provided + - Critical calculation logic in Points Calculator should have unit tests + - Recommendation: Create test codeunit with scenarios for: + * Points calculation accuracy + * Tier upgrades/downgrades + * Edge cases (negative points, expired points) + +4. Telemetry (Missing): + Consider adding Application Insights telemetry for: + - Points awarded/redeemed + - Tier changes + - Calculation performance + - Error conditions + +5. API Exposure: + For mobile/web integration, consider: + - API page for customer's current points balance + - API page for points history + - OData for reporting + +Would you like me to elaborate on any of these points or show +specific code examples for the improvements? +``` + +### Complex AL Pattern Explanation + +**You**: +``` +I found this code in standard BC. Can you explain in detail how +this posting pattern works and why it's structured this way? + +[Paste complex BC posting code] +``` + +**Claude Explains**: +``` +This is Business Central's standard document posting pattern. +Let me break it down step by step: + +Structure Overview: +1. OnRun trigger (lines 10-15): Entry point +2. Main posting procedure (lines 20-150): Orchestration +3. Helper procedures (lines 155+): Specific tasks +4. Integration events: Extensibility points + +Detailed Explanation: + +Phase 1: Pre-Posting Validation (lines 22-35) +-------------------------------------------- +The code first validates the document is ready to post: + + OnRun() + begin + CheckDocumentIsReadyToPost(SalesHeader); + end; + +This separation ensures: +- Validation logic is reusable +- Errors caught before any changes +- Can be tested independently + +Key validations: +- Document not already posted +- Required fields populated +- Valid line items exist +- Customer not blocked + +Phase 2: Table Locking (lines 40-45) +------------------------------------ + SalesHeader.LockTable(); + SalesLine.LockTable(); + +Critical for multi-user scenarios: +- Prevents concurrent modifications +- Ensures data consistency +- Follows database transaction best practices + +This must happen INSIDE the implicit transaction +(started by OnRun trigger). + +Phase 3: Integration Events "Before" (lines 50-55) +------------------------------------------------- + OnBeforePostSalesDocument(SalesHeader, PostingResult); + +Allows extensions to: +- Add additional validation +- Modify posting parameters +- Log custom data +- Integrate with external systems + +Extensions subscribe to these events to add functionality +without modifying base code. + +Phase 4: Core Posting Logic (lines 60-120) +------------------------------------------ +The actual posting work: + + PostSalesLines(SalesHeader); // Create ledger entries + PostCustomerLedger(SalesHeader); // Update customer balance + UpdateInventory(SalesHeader); // Adjust inventory + CreatePostedDocument(SalesHeader);// Archive posted doc + +Each step is a separate procedure because: +- Clarity and maintainability +- Reusability +- Easier testing +- Clear transaction boundaries + +Phase 5: Integration Events "After" (lines 125-130) +-------------------------------------------------- + OnAfterPostSalesDocument(SalesHeader, PostingResult); + +Allows extensions to: +- Trigger follow-up actions +- Send notifications +- Update related data +- Log completion + +Phase 6: Cleanup (lines 135-145) +-------------------------------- + DeleteAfterPosting(SalesHeader); + Commit; + +- Removes unposted document +- Commits transaction +- Frees locks + +Why This Pattern? + +1. Reliability: + - Explicit transaction boundaries + - Proper locking prevents conflicts + - Validation before any changes + +2. Extensibility: + - Events at every critical point + - Extensions can hook in without modification + - Standard pattern across all posting routines + +3. Maintainability: + - Clear, linear flow + - Each procedure has single responsibility + - Easy to understand and debug + +4. Performance: + - Table locks minimize deadlocks + - Efficient batch processing + - Single transaction reduces overhead + +5. Error Handling: + - OnRun trigger provides implicit error handling + - Transaction rolled back on error + - Clean state maintained + +This is the gold standard for BC posting routines. When creating +your own posting logic, follow this same pattern for: +- Custom documents +- Batch processing +- Any transactional operations + +Would you like me to explain any specific part in more detail, +or show how to implement this pattern for a custom document? +``` + +### Migration Strategy + +**You**: +``` +We have 50,000 lines of NAV 2018 C/AL code to migrate to BC AL. +What's the best strategy? + +[Include examples of your NAV code] +``` + +**Claude Provides**: +``` +Migrating 50K lines of C/AL to AL is substantial. Here's a strategic approach: + +Phase 1: Assessment & Planning (Week 1-2) +----------------------------------------- + +1. Code Analysis: + - Categorize by object type + - Identify custom vs modified standard objects + - Map dependencies + - Find external integrations + +2. Risk Assessment: + HIGH RISK (manual migration priority): + - Heavy .NET interop + - Automation/OCX controls + - Client-side code + - File system access + + MEDIUM RISK (tool + manual): + - Standard modifications + - Reports + - Complex business logic + + LOW RISK (mostly automated): + - Simple tables + - Basic pages + - Straightforward codeunits + +3. Tool Selection: + - AL Object Designer for conversion + - txt2al for initial conversion + - Manual for complex cases + +Phase 2: Automated Conversion (Week 3-4) +---------------------------------------- + +1. Run automated tools on LOW/MEDIUM risk code +2. Fix compilation errors +3. Address obvious issues +4. Don't spend time on perfect conversion yet + +Phase 3: Manual Review & Refactoring (Week 5-12) +----------------------------------------------- + +Priority order: +1. Core business logic (highest value) +2. Integration points (highest risk) +3. Reports (user-facing) +4. Supporting code (lower priority) + +For each module: +a) Understand business purpose +b) Review automated conversion +c) Refactor to AL patterns +d) Add error handling +e) Add telemetry +f) Create tests + +Phase 4: Testing (Week 13-16) +----------------------------- + +Comprehensive testing: +- Unit tests for calculations +- Integration tests for workflows +- User acceptance testing +- Performance testing +- Migration testing (data) + +Phase 5: Incremental Deployment (Week 17+) +------------------------------------------ + +Consider: +- Parallel run period +- Module-by-module rollout +- Rollback procedures +- User training + +Specific Code Migration Tips: + +1. C/AL Automation → AL: + Your NAV code uses Word automation. + Replace with: + - BC Word Report Layouts (preferred) + - External API calls if complex + - Azure Functions for processing + +2. Client-Side Code → AL: + NAV Page code that ran on client. + Move to: + - Page triggers (server-side) + - Page extensions + - Control add-ins (if really needed) + +3. Record.SETCURRENTKEY → AL: + NAV: Rec.SETCURRENTKEY(Date, Amount); + AL: Rec.SetCurrentKey(Date, Amount); + + Note: Case-sensitive in AL! + +4. Reports: + NAV RDLC reports need: + - AL report object + - Updated dataset + - Layout regeneration + + Consider: RDL → Word layout migration + +5. .NET Interop: + NAV: DotNet variables + AL: Check if: + - Available in AL + - Use BC API instead + - Create Azure Function if needed + +AI-Assisted Migration Strategy: + +Use AI tools effectively: +1. GitHub Copilot: + - Quick syntax fixes + - Pattern replacement + - Boilerplate generation + +2. Claude (me!): + - Complex logic understanding + - Architecture decisions + - Refactoring strategies + +3. Manual effort: + - Business logic validation + - Testing + - Critical decisions + +Realistic Timeline: +- Simple migration: 4-6 months +- Complex migration: 6-12 months +- Very complex: 12-18 months + +Budget for: +- 30% automated conversion +- 40% manual refactoring +- 30% testing and validation + +Would you like me to: +1. Review specific NAV code samples? +2. Elaborate on any phase? +3. Discuss specific technical challenges? +4. Create a detailed project plan template? +``` + +## How to Use Claude Effectively + +### Workflow + +**1. Preparation**: +- Gather all relevant AL code +- Prepare specific questions +- Include context and requirements + +**2. Interaction**: +- Paste code into Claude.ai +- Ask clear, specific questions +- Provide examples of what you want + +**3. Iterate**: +- Ask follow-up questions +- Clarify unclear points +- Request alternatives +- Explore trade-offs + +**4. Implementation**: +- Copy suggested code +- Adapt to your project +- Test thoroughly +- Refine as needed + +### Best Practices + +**Provide Full Context**: +``` +Good: +"I'm building an AL extension for BC v22 that integrates with Shopify. +Here's my current implementation: [paste code] +I need to handle rate limiting from the Shopify API. +Show me the best AL pattern for this." + +vs. + +Poor: +"How do I handle rate limiting?" +``` + +**Ask Specific Questions**: +``` +Good: +"Review this AL posting codeunit for performance issues, +specifically focusing on database operations." + +vs. + +Poor: +"Is this good?" +``` + +**Use for Complex Tasks**: +- Architecture decisions +- Code review of large modules +- Learning complex concepts +- Debugging intricate issues + +## How It Differs from Other Agents + +### vs. GitHub Copilot + +**Claude**: +- ✓ Much larger context window +- ✓ Better at analysis and reasoning +- ✓ More detailed explanations +- ✗ No IDE integration +- ✗ No inline suggestions +- ✗ Manual workflow + +**GitHub Copilot**: +- ✓ IDE integration +- ✓ Real-time suggestions +- ✓ Fast workflow +- ✗ Limited context +- ✗ Less analytical + +**Use Both**: Copilot for daily coding, Claude for deep analysis + +### vs. Cursor + +**Claude**: +- ✓ Larger context window +- ✓ Better analytical depth +- ✓ More thoughtful responses +- ✗ No IDE integration +- ✗ Manual copy-paste + +**Cursor**: +- ✓ IDE integration +- ✓ Multiple AI models (including Claude!) +- ✓ Direct code editing +- ✗ Smaller context per interaction +- ✗ Different editor + +**Note**: Cursor can use Claude as its AI model, giving you Claude's capabilities with IDE integration! + +## Access & Pricing + +### Claude.ai (Web) + +**Free Tier**: +- Limited messages per day +- Claude 3.5 Sonnet access +- Good for occasional use +- No payment required + +**Pro Tier** ($20/month): +- 5x more usage +- Priority access +- Claude 3 Opus (most capable model) +- Early feature access + +### Claude API + +**Pay-per-use**: +- Billed by tokens +- Integration into tools +- Programmatic access +- See Anthropic pricing page + +**Link**: [Claude.ai](https://claude.ai) | [Anthropic Pricing](https://www.anthropic.com/pricing) + +## Privacy & Security + +### What Gets Sent +- Your messages and questions +- Code you paste +- Files you upload +- Conversation history + +### Data Usage +- Not used for training (as of current policy) +- Processed for improving responses +- Retained per Anthropic's policy +- Review privacy policy for details + +### Best Practices +- Don't paste sensitive data +- Avoid customer information +- Review organization policies +- Use sanitized code examples + +## When to Use Claude + +### ✓ Ideal For + +- **Large code reviews**: Paste entire projects +- **Architecture discussions**: Complex design decisions +- **Learning**: Detailed explanations of AL/BC concepts +- **Problem solving**: Complex scenarios with many variables +- **Migration planning**: NAV to BC conversions +- **Refactoring strategies**: Large-scale code improvements +- **API design**: Thoughtful API architecture + +### ⚠ Consider Alternatives + +- **Quick completions** → GitHub Copilot +- **IDE integration** → Copilot or Cursor +- **Real-time coding** → Copilot or Cursor +- **Multi-file editing** → Cursor + +## Complementary Tools + +**Use With**: +- GitHub Copilot for daily coding +- VS Code for development +- AL analyzers for code quality +- Version control for safety + +**Workflow Example**: +1. Code with Copilot in VS Code +2. Review architecture with Claude +3. Implement improvements in VS Code +4. Test and validate + +## Tips for AL Development + +**Provide AL Context**: +``` +"I'm working in AL for Business Central version 22. +[Your question]" +``` + +**Reference BC Concepts**: +``` +"Using BC's standard posting pattern..." +"Following BC event subscriber patterns..." +``` + +**Ask for Alternatives**: +``` +"Show me 3 different approaches to this problem, +with pros and cons of each." +``` + +**Request Explanations**: +``` +"Explain this like I'm familiar with C# but new to AL" +``` + +## Resources + +### Official +- [Claude.ai](https://claude.ai) +- [Anthropic Documentation](https://docs.anthropic.com) +- [API Documentation](https://docs.anthropic.com/claude/reference) + +### AL Guidelines +- [Effective Prompting](../../getting-started/effective-prompting) +- [Best Practices](../../getting-started/best-practices) +- [Code Review Examples](../../getting-more/code-review) + +--- + +**Next Steps**: +- Try [Claude.ai](https://claude.ai) for free +- Compare with [other AI agents](./) +- Use alongside [GitHub Copilot](github-copilot-agent) + +**Questions?** Join [GitHub Discussions](https://github.com/microsoft/alguidelines/discussions) diff --git a/content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md new file mode 100644 index 00000000..e6e25c23 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md @@ -0,0 +1,675 @@ +--- +title: "Cursor Agent" +linkTitle: "Cursor" +weight: 4 +description: > + AI-first code editor with integrated AI assistance and multi-file editing for AL development +--- + +## Overview + +Cursor is an AI-first code editor built on VS Code that integrates AI deeply into every aspect of development. It provides inline suggestions, chat assistance, and advanced features like Composer mode for multi-file editing, making it a powerful tool for AL development. + +**Developer**: Anysphere Inc. +**Type**: AI-Integrated Code Editor +**Primary Use**: Complete AI-assisted development environment +**Integration**: Native (is a code editor) + +## What is Cursor? + +Cursor is a fork of Visual Studio Code with integrated AI capabilities: +- Native AI code completion (like Copilot) +- Built-in AI chat (like Copilot Chat) +- Composer mode for multi-file editing +- Codebase indexing for better context +- Multiple AI model support +- All VS Code extensions work + +### Key Differentiator + +Unlike tools that add AI to VS Code, Cursor **is** an AI-first editor built from the ground up with AI integration. + +**Think of it as**: VS Code + GitHub Copilot + Advanced AI Features + Better Context Understanding + +## Key Features + +### 1. Tab Completion (Like Copilot) + +Real-time AI suggestions as you type: +```al +// Type a comment +/// Validate customer credit limit + +// Cursor suggests complete procedure +procedure ValidateCreditLimit(CustomerNo: Code[20]): Boolean +var + Customer: Record Customer; +begin + // Full implementation suggested +end; +``` + +**Plus**: +- Faster than Copilot +- Better context awareness +- Multiple AI models available + +### 2. Chat Interface (Like Copilot Chat) + +Built-in AI chat in the sidebar: +- Ask questions about code +- Get explanations +- Request code generation +- Debug issues + +**Plus**: +- Can use multiple AI models (GPT-4, Claude, etc.) +- Better codebase understanding +- More context awareness + +### 3. Cmd+K (Inline Chat) + +Quick inline AI assistance: +- Press `Cmd+K` (Mac) or `Ctrl+K` (Windows) +- Ask questions or request changes +- AI suggests edits inline +- Accept, reject, or modify + +**Example**: +```al +// Select code, press Cmd+K, type: +"Add error handling and telemetry" + +// Cursor shows diff with changes +// Accept to apply +``` + +### 4. Composer Mode ⭐ + +**Most Powerful Feature**: Multi-file editing with AI + +- Create/edit multiple files simultaneously +- AI understands file relationships +- Generates complete features +- Handles complex refactoring + +**Example**: +``` +Press Cmd+I (Composer) +Type: "Add a loyalty points system with table, page, and codeunit" + +Cursor creates: +- Table 50100 "Loyalty Points Entry" +- Page 50100 "Loyalty Points List" +- Page 50101 "Loyalty Points Card" +- Codeunit 50100 "Loyalty Points Manager" + +All properly connected and following AL patterns +``` + +### 5. Codebase Indexing + +Cursor indexes your entire workspace: +- AI understands your project structure +- References existing code +- Follows your patterns +- Suggests consistent code + +**Benefit for AL**: +- Knows your table structures +- Understands your naming conventions +- Follows your coding patterns +- References your existing codeunits + +### 6. Multiple AI Models + +Choose your AI model: +- GPT-4 (OpenAI) +- GPT-4 Turbo +- Claude 3.5 Sonnet (Anthropic) +- Claude 3 Opus +- (More being added) + +**Why it matters**: +- Different models have different strengths +- Switch based on task +- Try multiple for comparison +- Use best for each scenario + +## Strengths for AL Development + +### ✓ Exceptional At + +**Multi-File Projects**: +``` +Composer: "Create a complete order processing module with: +- Order Header and Line tables +- Card and List pages +- Processing codeunit +- Validation codeunit +- Test codeunit +Follow AL best practices" + +Cursor creates all files properly structured and connected. +``` + +**Large Refactoring**: +``` +"Refactor this project to: +- Add telemetry to all procedures +- Standardize error handling +- Add XML documentation +- Update to use new AL patterns" + +Cursor makes changes across all relevant files. +``` + +**Project Generation**: +``` +"Create a BC extension for customer surveys with: +- Setup tables +- Survey and response tables +- Pages for all tables +- Email sending logic +- API for mobile access" + +Cursor scaffolds entire extension. +``` + +**Codebase Understanding**: +- Knows your entire project +- References existing patterns +- Follows your conventions +- Suggests consistent code + +### ⚠ Consider Limitations + +**Learning Curve**: +- Different from VS Code workflow +- New shortcuts to learn +- Composer mode takes practice +- More features to understand + +**Cost**: +- $20/month (more than Copilot's $10) +- No free tier for individuals +- Worth it for heavy AI use + +**AL-Specific Training**: +- Not specifically trained on AL +- Requires good AL context +- May need explicit AL patterns +- Works best with symbols downloaded + +## Practical AL Examples + +### Composer Mode: Complete Feature + +**Command** (in Composer, `Cmd+I`): +``` +Create a complete customer discount management system: + +Tables: +- Discount Group Setup (code, description, percentage) +- Customer Discount Assignment (customer no, discount group) + +Pages: +- List and Card pages for each table + +Codeunit: +- Calculate discount based on customer's group +- Apply discount to sales lines +- Event subscribers for sales line validation + +Include: +- Proper AL naming conventions +- XML documentation +- Error handling +- Data classification +``` + +**Cursor Creates** (all files): + +``` +Created Files: +✓ Tables/DiscountGroupSetup.Table.al +✓ Tables/CustomerDiscountAssignment.Table.al +✓ Pages/DiscountGroupSetupList.Page.al +✓ Pages/DiscountGroupSetupCard.Page.al +✓ Pages/CustomerDiscountAssignmentList.Page.al +✓ Codeunits/DiscountManager.Codeunit.al + +All files properly structured with: +- AL best practices +- XML documentation +- Event subscribers +- Error handling +``` + +### Chat: Code Review + +**You** (in Chat): +``` +Review this codeunit for performance and best practices: + +[Paste codeunit] + +Specifically check: +- Database operations +- AL patterns +- Error handling +- Code analyzers compliance +``` + +**Cursor Analyzes**: +``` +Found several issues: + +1. Performance Issue (Lines 45-52): + Multiple FindSet without SetLoadFields + + Current: + SalesLine.SetRange("Document No.", OrderNo); + if SalesLine.FindSet() then + + Recommended: + SalesLine.SetRange("Document No.", OrderNo); + SalesLine.SetLoadFields(Quantity, "Unit Price", Amount); + if SalesLine.FindSet() then + +2. Missing Error Handling (Lines 67-70): + No try-catch for posting operation + + [Shows specific improvements] + +3. CodeCop Violations: + - Procedure names don't follow AL naming + - Missing XML documentation + + [Lists specific fixes needed] + +Would you like me to apply these fixes? +``` + +### Inline Edit (Cmd+K) + +**Select procedure, press Cmd+K**: +``` +"Add Application Insights telemetry to track execution time and parameters" +``` + +**Cursor Shows Diff**: +```al +- procedure ProcessOrder(OrderNo: Code[20]) ++ procedure ProcessOrder(OrderNo: Code[20]) + var + SalesHeader: Record "Sales Header"; ++ Telemetry: Codeunit Telemetry; ++ CustomDimensions: Dictionary of [Text, Text]; ++ StartTime: DateTime; + begin ++ StartTime := CurrentDateTime; ++ CustomDimensions.Add('OrderNo', OrderNo); ++ ++ Telemetry.LogMessage('ORDER-001', 'Processing order started', ++ Verbosity::Normal, DataClassification::SystemMetadata, ++ TelemetryScope::ExtensionPublisher, CustomDimensions); ++ + // Existing code... ++ ++ CustomDimensions.Add('Duration', Format(CurrentDateTime - StartTime)); ++ Telemetry.LogMessage('ORDER-002', 'Processing order completed', ++ Verbosity::Normal, DataClassification::SystemMetadata, ++ TelemetryScope::ExtensionPublisher, CustomDimensions); + end; +``` + +Accept with `Cmd+Enter`, reject with `Cmd+Backspace` + +### Codebase Chat + +**You**: +``` +@codebase How is customer validation currently implemented in this project? +``` + +**Cursor** (searches entire project): +``` +Found customer validation in 3 places: + +1. Codeunit 50100 "Customer Validator" (Lines 23-45): + - Main validation logic + - Checks blocked status + - Validates credit limit + +2. Table Extension 50100 "Customer Extension" (Lines 15-20): + - OnValidate trigger for custom field + +3. Event Subscriber in Codeunit 50105 (Lines 67-80): + - Subscribes to Customer OnAfterValidate + - Adds additional custom validation + +Recommendation: Consolidate validation logic into single codeunit +for better maintainability. + +[Shows code snippets from each location] +``` + +## How It Differs from Other Agents + +### vs. GitHub Copilot + +**Cursor**: +- ✓ Multiple AI models (including GPT-4) +- ✓ Composer mode (multi-file editing) +- ✓ Better codebase understanding +- ✓ More advanced features +- ✗ Higher cost ($20 vs $10) +- ✗ Different editor (learning curve) + +**Copilot**: +- ✓ Lower cost +- ✓ Standard VS Code +- ✓ Familiar workflow +- ✗ Single AI model +- ✗ No composer mode +- ✗ Less context awareness + +### vs. Claude + +**Cursor**: +- ✓ IDE integration +- ✓ Multi-file editing +- ✓ Direct code application +- ✓ Can use Claude as AI model! +- ✗ Smaller context per interaction + +**Claude**: +- ✓ Larger context window +- ✓ Better for analysis +- ✓ Web interface +- ✗ No IDE integration +- ✗ Manual copy-paste + +**Note**: Cursor can use Claude as its AI model, giving you best of both! + +### vs. VS Code + Extensions + +**Cursor**: +- ✓ Native AI integration +- ✓ Optimized for AI workflow +- ✓ Advanced features +- ✓ All VS Code extensions work +- ✗ Different app (not VS Code) +- ✗ Subscription required + +**VS Code + Copilot**: +- ✓ Standard VS Code +- ✓ Familiar environment +- ✓ Established workflow +- ✗ Less AI integration +- ✗ Fewer AI features + +## Setup & Configuration + +### Installation + +1. **Download Cursor** + - Visit [cursor.sh](https://cursor.sh) + - Download for your OS + - Install application + +2. **Sign Up** + - Create account + - Choose subscription plan + - Verify email + +3. **Configure AL Development** + - Install AL Language extension + - Import VS Code settings (optional) + - Download BC symbols + - Open your AL project + +### Migrating from VS Code + +**Import Settings**: +``` +Cursor > Settings > Import Settings from VS Code +``` + +**Your Extensions**: +- All VS Code extensions work +- Install AL Language +- Install AL Object Designer +- Install other AL tools + +**Keyboard Shortcuts**: +- Most VS Code shortcuts work +- Learn Cursor-specific shortcuts: + - `Cmd+K`: Inline edit + - `Cmd+L`: Chat + - `Cmd+I`: Composer + +### Optimizing for AL + +**Workspace Setup**: +- Keep `app.json` well-configured +- Download symbols first +- Organize files clearly +- Use descriptive naming + +**AI Model Selection**: +- GPT-4 for general coding +- Claude for analysis +- Experiment to find preference + +## Best Practices + +### Using Composer Mode + +**Clear Instructions**: +``` +Good: +"Create AL customer loyalty system with: +- Tier setup table (code, name, min points, discount %) +- Customer points table (customer no, points, tier code) +- List and card pages for both +- Codeunit to calculate and assign tiers +- Event subscriber to update on purchase +Follow AL naming conventions and add XML docs" + +Poor: +"Make a loyalty system" +``` + +**Iterative Development**: +1. Start with basic structure +2. Review generated files +3. Ask for refinements +4. Add features incrementally + +### Using Chat Effectively + +**Reference Files**: +``` +@filename.al What does this procedure do? +@codebase How is posting handled in this project? +``` + +**Specific Questions**: +``` +"Review CustomerProcessor.codeunit.al for: +- Performance issues +- AL best practices +- Missing error handling" +``` + +### Using Inline Edit + +**Targeted Changes**: +- Select specific code +- Request specific improvements +- Review diff carefully +- Accept or modify + +## Pricing + +**Pro Plan**: $20/month +- Unlimited AI completions +- Unlimited chat +- Composer mode +- All AI models +- Priority support + +**Business Plan**: Custom pricing +- Team features +- Organization management +- Usage analytics +- Enhanced security + +**Free Trial**: 14 days (typically) + +**Link**: [Cursor Pricing](https://cursor.sh/pricing) + +## Privacy & Security + +### What Gets Sent +- Code you're working on +- Files in your workspace +- Chat messages +- User interactions + +### Privacy Controls +- Can disable AI features +- Control what's indexed +- Configure model usage +- Review privacy settings + +### Best Practices +- Don't include sensitive data +- Review organization policies +- Use privacy mode when needed +- Understand data handling + +## When to Use Cursor + +### ✓ Ideal For + +- **New Projects**: Build from scratch with AI +- **Large Refactoring**: Multi-file changes +- **Learning**: Explore AL patterns +- **Rapid Development**: Build features quickly +- **Experimentation**: Try different approaches +- **Team Development**: Consistent patterns + +### ⚠ Consider Alternatives + +- **Quick edits** → GitHub Copilot faster +- **Just need VS Code** → Stick with Copilot +- **Budget constrained** → Copilot cheaper +- **Prefer standard tools** → VS Code + Copilot + +## Practical Workflows + +### Starting New Extension + +1. **Composer Mode**: Generate project structure +2. **Chat**: Refine and improve +3. **Inline Edit**: Add features +4. **Tab**: Complete code quickly + +### Refactoring Existing Code + +1. **Chat**: "Analyze this project for improvements" +2. **Review**: Understand suggestions +3. **Composer**: Apply multi-file changes +4. **Inline**: Fix specific issues + +### Learning AL Patterns + +1. **Generate example** with Composer +2. **Ask Chat** to explain +3. **Experiment** with variations +4. **Apply** to real project + +## Complementary Tools + +**Use With**: +- AL Language extension (required) +- AL analyzers for quality +- Git for version control +- BC symbols for context + +**Workflow**: +1. Cursor for development +2. AL analyzers for validation +3. Git for safety +4. Claude (via Cursor) for analysis + +## Tips for AL Development + +**Provide AL Context**: +``` +"Generate AL code for Business Central v22..." +"Follow AL naming conventions..." +"Use BC standard posting patterns..." +``` + +**Use Codebase Context**: +``` +@codebase Reference existing table structures +@CustomerTable.al Follow this naming pattern +``` + +**Leverage Models**: +- GPT-4 for code generation +- Claude for analysis +- Try both for comparison + +**Iterate**: +- Generate basic structure +- Review and refine +- Add complexity gradually +- Test thoroughly + +## Resources + +### Official +- [Cursor Website](https://cursor.sh) +- [Cursor Documentation](https://docs.cursor.sh) +- [Community Discord](https://discord.gg/cursor) + +### AL Guidelines +- [Effective Prompting](../../getting-started/effective-prompting) +- [Best Practices](../../getting-started/best-practices) +- [Getting More Examples](../../getting-more) + +## Learning Cursor + +### Start Simple +1. Try tab completion (like Copilot) +2. Use chat for questions +3. Experiment with Cmd+K +4. Practice Composer on small tasks + +### Progress to Advanced +1. Multi-file projects with Composer +2. Codebase-wide refactoring +3. Multiple AI model usage +4. Advanced keyboard shortcuts + +### Master Features +1. Understand when to use each mode +2. Optimize prompts for better results +3. Integrate into daily workflow +4. Share patterns with team + +--- + +**Next Steps**: +- Download [Cursor](https://cursor.sh) +- Try free trial +- Compare with [other AI agents](./) +- Use alongside your existing tools + +**Questions?** Join [GitHub Discussions](https://github.com/microsoft/alguidelines/discussions) diff --git a/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md new file mode 100644 index 00000000..b688f7c1 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md @@ -0,0 +1,552 @@ +--- +title: "GitHub Copilot Agent" +linkTitle: "GitHub Copilot" +weight: 1 +description: > + Microsoft's AI pair programmer for real-time code completion and suggestions +--- + +## Overview + +GitHub Copilot is Microsoft's AI-powered coding assistant that provides real-time code suggestions directly in your editor. It's trained on billions of lines of public code and integrates seamlessly with Visual Studio Code. + +**Developer**: GitHub (Microsoft) +**Type**: AI Code Completion Agent +**Primary Use**: Inline code suggestions as you type +**Integration**: Native VS Code extension + +## What is GitHub Copilot? + +GitHub Copilot acts as an AI pair programmer that: +- Suggests code completions in real-time +- Generates entire functions from comments +- Provides multiple suggestion alternatives +- Understands context from your codebase +- Learns patterns specific to AL and Business Central + +### How It Works + +1. **You write**: A comment or start typing code +2. **Copilot analyzes**: Your code, open files, and context +3. **Copilot suggests**: Code completion in gray text +4. **You decide**: Accept (Tab), reject (Esc), or modify + +**Example**: +```al +// Type this comment: +/// Calculate total sales for customer including tax + +// Copilot suggests (press Tab to accept): +procedure CalculateTotalSalesWithTax(CustomerNo: Code[20]): Decimal +var + SalesLine: Record "Sales Line"; + TotalAmount: Decimal; +begin + SalesLine.SetRange("Sell-to Customer No.", CustomerNo); + SalesLine.SetRange(Type, SalesLine.Type::Item); + if SalesLine.FindSet() then + repeat + TotalAmount += SalesLine."Amount Including VAT"; + until SalesLine.Next() = 0; + exit(TotalAmount); +end; +``` + +## Key Capabilities + +### For AL Development + +**Understands AL Syntax**: +- Recognizes AL keywords and patterns +- Knows Business Central object types +- Suggests BC-appropriate code structures +- Follows AL naming conventions + +**Business Central Awareness**: +- Familiar with BC table structures +- Knows common BC APIs +- Suggests standard BC patterns +- Understands event subscriber patterns + +**Context-Aware**: +- Reads your open AL files +- Understands project structure +- References your existing code +- Adapts to your coding style + +### Code Generation Capabilities + +**From Comments**: +```al +/// Create a page extension for Customer Card that adds loyalty points field + +// Generates complete page extension structure +``` + +**From Partial Code**: +```al +procedure ValidateCustomer +// Continue typing... Copilot completes with parameters, logic +``` + +**From Patterns**: +```al +[EventSubscriber( +// Copilot suggests common event patterns +``` + +**Test Code**: +```al +[Test] +procedure TestCustomerValidation +// Generates test structure with Given-When-Then +``` + +## Strengths for AL Development + +### ✓ Excellent At + +**Boilerplate Code**: +- Table and field definitions +- Page layouts +- Standard procedures +- Variable declarations + +**Common Patterns**: +- CRUD operations +- Validation logic +- Event subscribers +- API pages + +**Code Structure**: +- Procedure signatures +- If-then-else logic +- Loop structures +- Error handling templates + +**Quick Edits**: +- Adding fields +- Extending objects +- Creating similar code +- Repetitive tasks + +### ⚠ Use With Care + +**Complex Business Logic**: +- May not understand specific requirements +- Review carefully for correctness +- Validate against business rules + +**Performance-Critical Code**: +- Check for efficient database queries +- Verify optimal AL patterns +- Profile if needed + +**Security-Sensitive Code**: +- Review authentication logic +- Validate input handling +- Check authorization patterns + +## How It Differs from Other Agents + +### vs. GitHub Copilot Chat +**Copilot (Inline)**: +- ✓ Better for code completion +- ✓ Faster for quick edits +- ✓ Non-intrusive workflow +- ✗ Limited explanation ability +- ✗ Can't answer questions + +**Copilot Chat**: +- ✓ Better for explanations +- ✓ Can answer questions +- ✓ Helps with debugging +- ✗ Slower for quick completions +- ✗ More context switching + +**Best Practice**: Use both together + +### vs. Claude +**GitHub Copilot**: +- ✓ Faster inline suggestions +- ✓ Better VS Code integration +- ✓ No context switching +- ✗ Smaller context window +- ✗ No deep analysis + +**Claude**: +- ✓ Larger context window +- ✓ Better for complex analysis +- ✓ Strong reasoning +- ✗ No inline completions +- ✗ Manual copy-paste workflow + +**Best Practice**: Copilot for coding, Claude for analysis + +### vs. Cursor +**GitHub Copilot**: +- ✓ Works in standard VS Code +- ✓ Familiar environment +- ✓ Just code completion +- ✗ Single AI model +- ✗ Limited multi-file edits + +**Cursor**: +- ✓ Multiple AI models +- ✓ Advanced features (Composer) +- ✓ Better multi-file editing +- ✗ Different editor +- ✗ Learning curve + +**Best Practice**: Copilot for standard workflow, Cursor for advanced needs + +## Practical AL Examples + +### Creating Tables + +**Input** (comment): +```al +/// Customer loyalty tier table with tier name, min points, and discount percentage +``` + +**Copilot Generates**: +```al +table 50100 "Customer Loyalty Tier" +{ + DataClassification = CustomerContent; + + fields + { + field(1; "Code"; Code[20]) + { + Caption = 'Code'; + } + field(2; "Tier Name"; Text[50]) + { + Caption = 'Tier Name'; + } + field(10; "Minimum Points"; Integer) + { + Caption = 'Minimum Points'; + MinValue = 0; + } + field(20; "Discount Percentage"; Decimal) + { + Caption = 'Discount Percentage'; + MinValue = 0; + MaxValue = 100; + DecimalPlaces = 0 : 2; + } + } + + keys + { + key(PK; "Code") + { + Clustered = true; + } + key(Points; "Minimum Points") + { + } + } +} +``` + +### Event Subscribers + +**Input** (partial code): +```al +[EventSubscriber(ObjectType::Table, Database::Customer, 'OnAfterValidateEvent', 'Credit Limit (LCY)', false, false)] +``` + +**Copilot Completes**: +```al +local procedure OnAfterValidateCreditLimit(var Rec: Record Customer; var xRec: Record Customer; CurrFieldNo: Integer) +begin + // Add your implementation + if Rec."Credit Limit (LCY)" > 100000 then + if not Confirm('Credit limit exceeds 100,000. Continue?') then + Error(''); +end; +``` + +### API Pages + +**Input**: +```al +/// API v2.0 page for items exposing no, description, unit price, inventory +``` + +**Copilot Generates**: +```al +page 50100 "Item API" +{ + APIVersion = 'v2.0'; + APIPublisher = 'yourcompany'; + APIGroup = 'inventory'; + EntityCaption = 'Item'; + EntitySetCaption = 'Items'; + PageType = API; + SourceTable = Item; + DelayedInsert = true; + ODataKeyFields = SystemId; + + layout + { + area(Content) + { + repeater(GroupName) + { + field(id; Rec.SystemId) + { + Caption = 'Id'; + Editable = false; + } + field(number; Rec."No.") + { + Caption = 'No.'; + } + field(description; Rec.Description) + { + Caption = 'Description'; + } + field(unitPrice; Rec."Unit Price") + { + Caption = 'Unit Price'; + } + field(inventory; Rec.Inventory) + { + Caption = 'Inventory'; + } + } + } + } +} +``` + +### Test Code + +**Input**: +```al +[Test] +procedure TestCustomerCreditLimitValidation +``` + +**Copilot Suggests**: +```al +[Test] +procedure TestCustomerCreditLimitValidation() +var + Customer: Record Customer; + LibrarySales: Codeunit "Library - Sales"; +begin + // [GIVEN] A customer with credit limit set + Customer.Init(); + Customer."No." := LibrarySales.CreateCustomerNo(); + Customer."Credit Limit (LCY)" := 50000; + Customer.Insert(); + + // [WHEN] Credit limit is exceeded + Customer.Validate("Credit Limit (LCY)", 150000); + + // [THEN] Appropriate validation occurs + // Add assertions here +end; +``` + +## Setup & Configuration + +### Installation + +See the detailed [GitHub Copilot Tool Page](../Tools/github-copilot) for complete installation instructions. + +**Quick Start**: +1. Install GitHub Copilot extension in VS Code +2. Sign in with GitHub account +3. Verify subscription is active +4. Start coding in AL files + +### Optimizing for AL + +**VS Code Settings**: +```json +{ + "github.copilot.enable": { + "*": true, + "al": true + }, + "editor.inlineSuggest.enabled": true, + "editor.quickSuggestions": { + "other": true, + "comments": true, + "strings": true + } +} +``` + +**Project Setup**: +- Keep `app.json` well-configured +- Download BC symbols +- Use descriptive file names +- Maintain good code organization + +## Best Practices + +### Getting Quality Suggestions + +**Write Clear Comments**: +```al +❌ // calc total +✅ /// Calculate the total sales amount for a customer including tax and discounts +``` + +**Use Meaningful Names**: +```al +❌ procedure Calc(x: Code[20]): Decimal +✅ procedure CalculateCustomerTotalSales(CustomerNo: Code[20]): Decimal +``` + +**Provide Context**: +- Keep related files open +- Use consistent naming +- Follow AL conventions +- Add XML documentation + +### Review Checklist + +Before accepting Copilot suggestions: + +- [ ] Does it match my requirements? +- [ ] Is the AL syntax correct? +- [ ] Are BC APIs used properly? +- [ ] Is it performant? +- [ ] Does it follow best practices? +- [ ] Is error handling appropriate? +- [ ] Are data types correct? + +### Workflow Integration + +**Effective Use**: +1. Write descriptive comment or start typing +2. Review Copilot's suggestion +3. Accept if good, modify if needed +4. Test the generated code +5. Refine as necessary + +**Don't**: +- Blindly accept every suggestion +- Skip testing generated code +- Ignore code analysis warnings +- Use without understanding + +## Pricing + +**Individual**: +- $10/month or $100/year +- Free for verified students +- Free for open source maintainers + +**Business**: +- $19/user/month +- Organization management +- Policy controls +- Usage insights + +**Free Trial**: Usually 30 days available + +**Link**: [GitHub Copilot Pricing](https://github.com/features/copilot) + +## Privacy & Security + +### What Gets Sent +- Code snippets from your editor +- File names and structure +- Code you're working on +- Acceptance/rejection of suggestions + +### What You Control +- Enable/disable globally +- Disable for specific files/repos +- Block suggestions from public code +- Telemetry settings + +### Best Practices +- Don't commit secrets to code +- Review organization policies +- Use Business plan for enterprise control +- Understand data retention policies + +## Troubleshooting + +### Common Issues + +**No Suggestions Appearing**: +- Check extension is enabled +- Verify subscription is active +- Ensure AL files are recognized +- Reload VS Code window + +**Poor Quality Suggestions**: +- Download BC symbols +- Add more context (comments, related files) +- Use descriptive names +- Open related AL files + +**Slow Performance**: +- Close unnecessary files +- Check internet connection +- Reduce workspace size +- Update VS Code + +## Learning Resources + +### Official Resources +- [GitHub Copilot Documentation](https://docs.github.com/copilot) +- [VS Code Extension Page](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) +- [Getting Started Guide](https://docs.github.com/copilot/getting-started-with-github-copilot) + +### AL Guidelines Resources +- [Setup Guide](../../getting-started/setup) +- [Effective Prompting](../../getting-started/effective-prompting) +- [Best Practices](../../getting-started/best-practices) +- [Code Review Examples](../../getting-more/code-review) + +## When to Use GitHub Copilot + +### ✓ Ideal For + +- Daily AL development +- Quick code generation +- Learning AL patterns +- Reducing boilerplate +- Standard BC implementations +- Exploring APIs + +### ⚠ Consider Alternatives + +- **Complex analysis** → Use Claude or Copilot Chat +- **Multi-file refactoring** → Use Cursor +- **Learning deep concepts** → Use Copilot Chat or Claude +- **Architecture decisions** → Human expertise required + +## Complementary Tools + +**Use With**: +- [GitHub Copilot Chat](github-copilot-chat-agent) - For explanations and debugging +- [AL Language Extension](../Tools/al-language) - For AL support +- [AL Code Analyzers](../Tools/al-codecop) - For quality checks + +**Workflow**: +1. Copilot generates code +2. AL analyzers check quality +3. Copilot Chat explains complex parts +4. You review and test + +--- + +**Next Steps**: +- Install and try [GitHub Copilot](../Tools/github-copilot) +- Learn about [Copilot Chat](github-copilot-chat-agent) for complementary features +- Compare with other [AI Agents](./) + +**Questions?** Join [GitHub Discussions](https://github.com/microsoft/alguidelines/discussions) diff --git a/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md new file mode 100644 index 00000000..ebc73ce8 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md @@ -0,0 +1,627 @@ +--- +title: "GitHub Copilot Chat Agent" +linkTitle: "Copilot Chat" +weight: 2 +description: > + Conversational AI assistant for code explanations, debugging, and interactive development +--- + +## Overview + +GitHub Copilot Chat is a conversational AI assistant integrated into Visual Studio Code that allows you to ask questions, get explanations, and receive guidance through natural language interaction. + +**Developer**: GitHub (Microsoft) +**Type**: Conversational AI Agent +**Primary Use**: Interactive code assistance, explanations, and debugging +**Integration**: Native VS Code extension + +## What is GitHub Copilot Chat? + +GitHub Copilot Chat provides an interactive AI assistant that: +- Answers questions about code and AL development +- Explains complex code segments +- Helps debug issues +- Suggests refactoring approaches +- Provides learning and guidance +- Generates code based on detailed requirements + +### How It Works + +1. **You ask**: Questions in natural language via chat panel or inline +2. **Chat analyzes**: Your code, context, and question +3. **Chat responds**: With explanations, code, or suggestions +4. **You interact**: Ask follow-ups, refine, or apply suggestions + +**Example Interaction**: +``` +You: Explain how this procedure validates customer credit limits + +Chat: This procedure validates customer credit limits by: +1. Retrieving the customer record +2. Calculating current outstanding amount +3. Comparing against credit limit +4. Raising an error if exceeded + +The validation ensures customers cannot exceed their credit limits +before creating new sales orders... +``` + +## Key Capabilities + +### For AL Development + +**Code Explanation**: +- Describes what AL code does +- Explains Business Central concepts +- Breaks down complex procedures +- Clarifies AL syntax and patterns + +**Interactive Learning**: +- Teaches AL patterns +- Explains BC APIs +- Provides examples +- Answers "how do I..." questions + +**Debugging Assistance**: +- Helps diagnose errors +- Suggests fixes +- Explains error messages +- Proposes debugging strategies + +**Code Generation**: +- Creates code from detailed descriptions +- Generates test cases +- Produces documentation +- Builds complex structures + +## How to Use Copilot Chat + +### Chat Panel + +**Open Chat**: +- Press `Ctrl+Shift+I` (Windows/Linux) +- Press `Cmd+Shift+I` (Mac) +- Click chat icon in sidebar + +**Chat Interface**: +``` +┌─────────────────────────────┐ +│ GitHub Copilot Chat │ +├─────────────────────────────┤ +│ Your conversation history │ +│ │ +│ You: How do I... │ +│ Copilot: You can... │ +│ │ +├─────────────────────────────┤ +│ Type your question... [>]│ +└─────────────────────────────┘ +``` + +### Inline Chat + +**Open Inline**: +- Press `Ctrl+I` in editor +- Chat appears next to your code +- Ask quick questions +- Get instant suggestions + +**Use Cases**: +- Quick refactoring +- Explain selected code +- Fix errors in place +- Generate code snippets + +### Slash Commands + +Quick access to common tasks: + +| Command | Purpose | Example | +|---------|---------|---------| +| `/explain` | Explain selected code | `/explain this validation logic` | +| `/fix` | Suggest fixes | `/fix the error in this procedure` | +| `/tests` | Generate tests | `/tests for this codeunit` | +| `/help` | Show commands | `/help` | +| `/clear` | Clear chat | `/clear` | + +## Strengths for AL Development + +### ✓ Excellent At + +**Learning & Understanding**: +- Explaining AL concepts +- Teaching BC patterns +- Clarifying syntax +- Answering "why" questions + +**Debugging Help**: +- Diagnosing errors +- Suggesting fixes +- Explaining error messages +- Proposing test cases + +**Code Exploration**: +- Understanding legacy code +- Identifying patterns +- Finding issues +- Suggesting improvements + +**Documentation**: +- Generating XML comments +- Creating README files +- Writing user guides +- Explaining features + +### ⚠ Use With Care + +**Generated Code**: +- Always review for correctness +- Verify BC compatibility +- Test thoroughly +- Adapt to your standards + +**Complex Business Logic**: +- May not understand specific requirements +- Review carefully +- Validate against rules + +**Performance Advice**: +- General suggestions may not fit your scenario +- Profile and test +- Verify with BC best practices + +## AL-Specific Examples + +### Code Explanation + +**You**: +``` +Explain this procedure and when I should use it + +[Select and paste this code]: +procedure CheckCreditLimit(var SalesHeader: Record "Sales Header") +var + Customer: Record Customer; + OutstandingAmount: Decimal; +begin + Customer.Get(SalesHeader."Sell-to Customer No."); + Customer.CalcFields("Balance (LCY)"); + OutstandingAmount := Customer."Balance (LCY)" + SalesHeader."Amount Including VAT"; + + if OutstandingAmount > Customer."Credit Limit (LCY)" then + Error('Customer %1 would exceed credit limit. Outstanding: %2, Limit: %3', + Customer."No.", OutstandingAmount, Customer."Credit Limit (LCY)"); +end; +``` + +**Chat Explains**: +``` +This procedure validates customer credit limits before allowing sales orders: + +Purpose: +- Prevents customers from exceeding their credit limits +- Calculates total outstanding amount (existing balance + new order) +- Raises an error if limit would be exceeded + +When to use: +- Before posting sales orders +- In OnValidate triggers for sales headers +- As part of order validation workflow + +Key points: +- Uses CalcFields to get current customer balance +- Adds new order amount to existing balance +- Compares total against credit limit +- Provides clear error message with details + +Best practice considerations: +- Consider making error message translatable +- Might want to allow override with permission +- Could log credit limit violations for reporting +``` + +### Generating Complex Code + +**You**: +``` +Create a codeunit that processes sales orders in batch. + +Requirements: +- Accept list of sales order numbers +- Validate each order (check credit, inventory) +- Post valid orders +- Collect and return errors for failed orders +- Log to telemetry +- Show progress dialog + +Use proper error handling and AL best practices. +``` + +**Chat Generates**: +```al +codeunit 50100 "Batch Sales Order Processor" +{ + /// + /// Processes multiple sales orders in batch with validation and error handling + /// + procedure ProcessOrders(OrderNumbers: List of [Code[20]]): List of [Text] + var + SalesHeader: Record "Sales Header"; + Errors: List of [Text]; + Dialog: Dialog; + Counter: Integer; + TotalCount: Integer; + begin + TotalCount := OrderNumbers.Count; + Dialog.Open('Processing orders...\Order #1######### of #2#########'); + + foreach OrderNo in OrderNumbers do begin + Counter += 1; + Dialog.Update(1, Counter); + Dialog.Update(2, TotalCount); + + if not ProcessSingleOrder(OrderNo, Errors) then + LogProcessingError(OrderNo, Errors); + end; + + Dialog.Close(); + LogBatchCompletion(TotalCount, Counter - Errors.Count, Errors.Count); + exit(Errors); + end; + + local procedure ProcessSingleOrder(OrderNo: Code[20]; var Errors: List of [Text]): Boolean + var + SalesHeader: Record "Sales Header"; + SalesPost: Codeunit "Sales-Post"; + begin + if not SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo) then begin + Errors.Add(StrSubstNo('Order %1 not found', OrderNo)); + exit(false); + end; + + if not ValidateOrder(SalesHeader, Errors) then + exit(false); + + if not SalesPost.Run(SalesHeader) then begin + Errors.Add(StrSubstNo('Order %1: %2', OrderNo, GetLastErrorText())); + exit(false); + end; + + exit(true); + end; + + // Additional helper procedures... +end; +``` + +### Debugging Assistance + +**You**: +``` +I'm getting error "The field Customer No. must have a value" +when trying to post a sales order. Here's my code: + +[Paste problematic code] + +What's wrong? +``` + +**Chat Analyzes**: +``` +The error occurs because the Customer No. field is empty when posting. + +Looking at your code, the issue is on line 15: + SalesHeader."Sell-to Customer No." := ''; + +This explicitly sets the customer number to empty before posting. + +Likely causes: +1. Customer lookup/validation failed earlier +2. Field being cleared unintentionally +3. Missing validation before assignment + +Recommended fixes: + +1. Remove the line setting it to empty +2. Add validation: + if Customer.Get(CustomerNo) then + SalesHeader.Validate("Sell-to Customer No.", CustomerNo) + else + Error('Customer %1 does not exist', CustomerNo); + +3. Add defensive check before posting: + if SalesHeader."Sell-to Customer No." = '' then + Error('Customer must be specified before posting'); + +Would you like me to show the corrected version of your code? +``` + +### Learning AL Patterns + +**You**: +``` +What's the standard AL pattern for implementing a document posting routine? +``` + +**Chat Explains**: +``` +Standard AL document posting routines follow this pattern: + +1. Structure: + - Main posting codeunit + - Optional posting preview codeunit + - Optional batch posting codeunit + +2. Main Posting Codeunit Pattern: + +codeunit 50100 "Document-Post" +{ + TableNo = "Your Document Header"; + + trigger OnRun() + begin + PostDocument(Rec); + end; + + procedure PostDocument(var DocHeader: Record "Your Document Header") + var + DocLine: Record "Your Document Line"; + begin + // 1. Pre-posting checks + CheckDocumentIsReadyToPost(DocHeader); + + // 2. Run events (OnBeforePost) + OnBeforePostDocument(DocHeader); + + // 3. Lock tables + DocHeader.LockTable(); + + // 4. Post with transaction + PostDocumentLines(DocHeader); + FinalizePosting(DocHeader); + + // 5. Run events (OnAfterPost) + OnAfterPostDocument(DocHeader); + end; + + // Additional procedures... + + // Events for extensibility + [IntegrationEvent(false, false)] + local procedure OnBeforePostDocument(var DocHeader: Record "Your Document Header") + begin + end; +} + +Key principles: +- Use transactions (implicit in OnRun trigger) +- Lock records being modified +- Provide integration events +- Validate before posting +- Handle errors gracefully +- Use Codeunit.Run for error handling + +Would you like examples of specific parts? +``` + +## How It Differs from Other Agents + +### vs. GitHub Copilot (Inline) + +**Copilot Chat**: +- ✓ Better for explanations +- ✓ Can answer questions +- ✓ Helps with debugging +- ✓ Teaches concepts +- ✗ Slower for quick edits + +**Copilot (Inline)**: +- ✓ Faster completions +- ✓ Less disruptive +- ✓ Great for quick coding +- ✗ No explanations +- ✗ Can't answer questions + +**Use Together**: Inline for coding, Chat for understanding + +### vs. Claude + +**Copilot Chat**: +- ✓ Native VS Code integration +- ✓ Automatic code context +- ✓ No copy-paste needed +- ✗ Smaller context window +- ✗ Less analytical depth + +**Claude**: +- ✓ Larger context window +- ✓ Deeper analysis +- ✓ Better reasoning +- ✗ Manual workflow +- ✗ No editor integration + +**Use Cases**: Chat for daily work, Claude for deep analysis + +### vs. Cursor + +**Copilot Chat**: +- ✓ Standard VS Code +- ✓ Familiar environment +- ✓ Single purpose +- ✗ One AI model +- ✗ Limited features + +**Cursor**: +- ✓ Multiple AI models +- ✓ Composer mode +- ✓ Advanced features +- ✗ Different editor +- ✗ Higher learning curve + +**Use Cases**: Chat for standard workflow, Cursor for advanced needs + +## Best Practices + +### Asking Good Questions + +**Be Specific**: +``` +❌ "Explain this" +✅ "Explain how this procedure handles inventory updates + and why it uses a transaction" +``` + +**Provide Context**: +``` +❌ "How do I validate?" +✅ "How do I validate customer credit limits in AL before + posting a sales order? Show me the BC standard pattern." +``` + +**Break Down Complex Questions**: +``` +Instead of: +"Build complete order management system" + +Try: +1. "Show me pattern for order validation" +2. "Now add posting logic" +3. "Add error handling" +4. "Add telemetry" +``` + +### Using Responses Effectively + +**Review Code**: +- Understand what it does +- Verify BC compatibility +- Check best practices +- Test thoroughly + +**Learn from Explanations**: +- Read thoroughly +- Try examples yourself +- Ask follow-up questions +- Apply to your own code + +**Iterate**: +- Start with basic request +- Refine based on response +- Add requirements gradually +- Build understanding + +## Setup & Configuration + +### Installation + +See [GitHub Copilot Chat Tool Page](../Tools/github-copilot-chat) for detailed setup. + +**Quick Start**: +1. Install GitHub Copilot Chat extension +2. Verify Copilot subscription +3. Open chat panel (`Ctrl+Shift+I`) +4. Start asking questions + +### Optimizing for AL + +**Provide Context**: +- Keep relevant AL files open +- Reference BC objects specifically +- Mention AL version when relevant +- Include app.json configuration + +## Pricing + +**Included with GitHub Copilot**: +- Individual: $10/month or $100/year +- Business: $19/user/month +- Free for students and OSS maintainers + +No separate charge - comes with Copilot subscription. + +## Privacy & Security + +### What Gets Sent +- Your chat messages +- Selected code snippets +- Context from open files +- Workspace information (limited) + +### Best Practices +- Don't paste sensitive data +- Avoid customer information +- Review organization policies +- Use business plan for enterprise controls + +## When to Use Copilot Chat + +### ✓ Ideal For + +- Learning AL and BC concepts +- Understanding existing code +- Debugging issues +- Getting explanations +- Generating complex code +- Exploring patterns +- Documentation creation + +### ⚠ Consider Alternatives + +- **Quick completions** → Use GitHub Copilot (inline) +- **Very large context** → Use Claude +- **Multi-file refactoring** → Use Cursor +- **Critical decisions** → Consult humans + +## Practical Workflow + +**Daily Development**: +1. Write code with Copilot inline suggestions +2. Use Chat to explain complex parts +3. Ask Chat for debugging help when stuck +4. Generate tests with Chat +5. Create documentation with Chat + +**Learning**: +1. Ask Chat about AL patterns +2. Request examples +3. Get explanations of BC concepts +4. Explore APIs and features + +**Code Review**: +1. Select code section +2. Ask Chat to review +3. Get suggestions for improvements +4. Learn better patterns + +## Resources + +### Official Documentation +- [Copilot Chat Docs](https://docs.github.com/copilot/github-copilot-chat) +- [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) + +### AL Guidelines Resources +- [Effective Prompting](../../getting-started/effective-prompting) +- [Best Practices](../../getting-started/best-practices) +- [Getting More Examples](../../getting-more) + +## Complementary Tools + +**Use With**: +- [GitHub Copilot](github-copilot-agent) - For inline completions +- [AL Language Extension](../Tools/al-language) - For AL support +- [AL Code Analyzers](../Tools/al-codecop) - For quality + +**Workflow**: +1. Copilot generates code quickly +2. Chat explains what it does +3. You understand and refine +4. Analyzers validate quality + +--- + +**Next Steps**: +- Install [GitHub Copilot Chat](../Tools/github-copilot-chat) +- Try with [GitHub Copilot](github-copilot-agent) +- Compare with other [AI Agents](./) + +**Questions?** Join [GitHub Discussions](https://github.com/microsoft/alguidelines/discussions) diff --git a/content/docs/agentic-coding/CommunityResources/Tools/_index.md b/content/docs/agentic-coding/CommunityResources/Tools/_index.md new file mode 100644 index 00000000..b8b267fd --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/_index.md @@ -0,0 +1,133 @@ +--- +title: "MCP Servers" +linkTitle: "Tools" +weight: 3 +description: > + Model Context Protocol (MCP) servers that enhance AI-assisted AL development +--- + +## Overview + +This section catalogs Model Context Protocol (MCP) servers designed to enhance AI coding assistants for Business Central development. MCP is an open standard that enables AI assistants to connect to external tools, databases, and knowledge sources, making them significantly more powerful for AL development workflows. + +**What is MCP?** +- Standard protocol for connecting AI assistants to external capabilities +- STDIO transport for local execution +- Tool-based architecture for exposing features to AI assistants +- Supported by Claude Desktop, GitHub Copilot, Cursor, VS Code extensions, and more + +Each MCP server below has its own dedicated page with detailed information, setup instructions, and integration guidance. + +--- + +## AL & Business Central MCP Servers + +### [BC Code Intelligence MCP](bc-code-intelligence-mcp.md) + +**Key Features**: +- 14 specialist AI personas for BC development (Sam Coder, Dean Debug, Alex Architect, etc.) +- 20+ MCP tools for knowledge discovery, code analysis, and workflow orchestration +- Seamless specialist handoffs with context preservation +- Integration with GitHub Copilot, Claude Desktop, VS Code + +--- + +### [AL Dependency MCP Server](al-dependency-mcp-server.md) + +**Key Features**: +- Exposes AL workspace compiled symbols (.app files) to AI assistants +- 6 token-optimized tools for symbol search and dependency analysis +- O(1) lookups with optimized indexing for 50MB+ symbol files +- Auto-discovers .alpackages directories + +--- + +### [Serena MCP](serena-mcp.md) + +**Key Features**: +- Multi-language LSP-based coding assistant with AL support +- AL Language Server integration via VS Code AL extension +- Symbolic operations (find references, definitions, document symbols) +- Supports 20+ languages including AL, Python, TypeScript, Rust, Go + +--- + +### [AL Object ID Ninja MCP](al-objid-mcp-server.md) + +**Key Features**: +- AL object ID collision prevention and management +- Two modes: LITE (individual developers) and STANDARD (teams) +- Backend integration for shared ID pools and team collaboration +- Automatic app identification via Git integration + +--- + +## DevOps & Productivity MCP Servers + +### [Azure DevOps MCP](azure-devops-mcp.md) + +**Key Features**: +- Official Microsoft MCP server for Azure DevOps integration +- 50+ tools covering work items, repos, pipelines, wiki, and advanced security +- Domain filtering to manage tool count and focus +- Multiple authentication options (interactive, azcli, env) + +--- + +### [Clockify MCP](clockify-mcp.md) + +**Key Features**: +- Comprehensive Clockify time tracking integration +- 33 tools for workspace, client, project, task, tag, and time entry management +- Timer start/stop functionality and bulk operations +- Full CRUD operations for all Clockify entities + +--- + +## Contributing Tools + +**Created a tool for AI-assisted AL development?** + +Share it with the community! + +**Submission Guidelines**: +- Must be useful for AL/BC development +- Should enhance AI-assisted workflows +- Open source preferred +- Well documented + +**How to Submit**: See [Contributing](../../../contributing) section + +--- + +## Tool Safety & Privacy + +### Privacy Considerations + +**What Gets Shared**: +- Code in your workspace (with AI assistants) +- File names and structure +- Your prompts and questions + +**Best Practices**: +- Review extension permissions +- Understand data handling +- Use organization-approved tools +- Don't include sensitive data in code + +### Security + +**Verify Extensions**: +- Check publisher reputation +- Read reviews +- Review permissions requested +- Keep extensions updated + +--- + +## Related Resources + +- [Setup Guide](../../getting-started/setup) - Environment configuration +- [Blog Posts](../articles) - Tool reviews and comparisons +- [Videos](../videos) - Tool demonstrations +- [GitHub Discussions](https://github.com/microsoft/alguidelines/discussions) - Tool recommendations and support diff --git a/content/docs/agentic-coding/CommunityResources/Tools/al-dependency-mcp-server.md b/content/docs/agentic-coding/CommunityResources/Tools/al-dependency-mcp-server.md new file mode 100644 index 00000000..7f467316 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/al-dependency-mcp-server.md @@ -0,0 +1,45 @@ +--- +title: "AL Dependency MCP Server" +linkTitle: "AL Dependency MCP" +weight: 2 +description: > + Expose AL workspace compiled symbols to AI assistants for intelligent code navigation and dependency analysis +--- + +## Overview + +The AL Dependency MCP Server exposes all compiled AL package symbols (.app files) to AI assistants, enabling them to understand dependencies, navigate code, and provide accurate suggestions based on Microsoft base app and other extension symbols. + +**Created by**: [Stefan Maron](https://github.com/StefanMaron) + +--- + +## Key Features + +**Symbol Database**: +- O(1) lookup performance via optimized indices +- Streaming JSON parser for large symbol files (handles 50MB+ Microsoft base app) +- Sub-100ms query responses +- <500MB memory usage even with massive symbol databases + +**6 Token-Optimized Tools**: +- `al_search_objects` - Search for AL objects across all packages +- `al_get_object_definition` - Get full object definition with all members +- `al_get_object_summary` - Get token-optimized summary (96% smaller) +- `al_get_object_members` - Get object members without full definition +- `al_packages` - List all available AL packages +- `al_get_stats` - Get database statistics and diagnostics + +**Auto-Discovery**: +- Automatically finds .alpackages directories in your workspace +- Detects package changes in real-time +- Supports multiple package sources + +**Requirements**: Node.js 18+, .NET SDK 8.0+ (for development) + +--- + +## Links + +- **GitHub**: https://github.com/StefanMaron/AL-Dependency-MCP-Server +- **npm Package**: https://www.npmjs.com/package/al-mcp-server diff --git a/content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md b/content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md new file mode 100644 index 00000000..8f5d27f2 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md @@ -0,0 +1,44 @@ +--- +title: "AL Object ID Ninja MCP" +linkTitle: "AL Object ID Ninja" +weight: 5 +description: > + AL object ID collision prevention and management for Business Central development teams +--- + +## Overview + +The AL Object ID Ninja MCP Server manages AL object IDs to prevent collisions in Business Central development. It provides two modes: LITE for individual developers and STANDARD for teams with shared ID pools and backend integration. + +**Created by**: [SShadowS (Vjeko Kundačina)](https://github.com/SShadowS) + +--- + +## Key Features + +**Two Modes**: +- **LITE Mode** (4 tools) - Individual developers: authorization, config, allocate_id, analyze_workspace +- **STANDARD Mode** (8 tools) - Teams: adds pool management, consumption reports, backend sync, activity logs + +**Collision Prevention**: +- Automatic ID conflict detection +- Smart ID allocation with preview/reserve/reclaim +- Git integration for automatic app identification +- Real-time workspace analysis + +**Team Collaboration** (STANDARD): +- Shared ID pools across team members +- Backend integration with AL Object ID Ninja service +- Consumption tracking and reporting +- Audit trail with activity logs + +**Configuration**: +Set `MCP_MODE` environment variable to `lite` or `standard` (default: lite) + +--- + +## Links + +- **GitHub**: https://github.com/SShadowS/al-objid-mcp-server +- **npm Package**: https://www.npmjs.com/package/@sshadows/objid-mcp +- **Backend Service**: AL Object ID Ninja (vjekocom-alext-weu.azurewebsites.net) diff --git a/content/docs/agentic-coding/CommunityResources/Tools/azure-devops-mcp.md b/content/docs/agentic-coding/CommunityResources/Tools/azure-devops-mcp.md new file mode 100644 index 00000000..1ab55260 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/azure-devops-mcp.md @@ -0,0 +1,46 @@ +--- +title: "Azure DevOps MCP" +linkTitle: "Azure DevOps MCP" +weight: 4 +description: > + Official Microsoft MCP server for comprehensive Azure DevOps integration with AI assistants +--- + +## Overview + +The Azure DevOps MCP Server is Microsoft's official Model Context Protocol implementation for Azure DevOps, providing AI assistants with comprehensive access to work items, repositories, pipelines, wiki, search, and advanced security features. + +**Publisher**: [Microsoft](https://github.com/microsoft) + +--- + +## Key Features + +**50+ Tools Across All Azure DevOps Services**: +- Core (projects, teams, identities) +- Work (iterations, capacity) +- Work Items (CRUD, queries, comments, linking) +- Repositories (repos, branches, PRs, commits, file contents) +- Pipelines (builds, logs, artifacts, triggering) +- Wiki (pages, content, CRUD operations) +- Search (code, wiki, work items) +- Advanced Security (alerts, findings) + +**Domain Filtering**: +- Enable only needed domains to reduce tool count +- Example: `-d work-items -d repositories` for focused workflows + +**Multiple Authentication Options**: +- Interactive (default) - Browser-based OAuth +- Azure CLI - Use existing `az login` session +- Environment variable - PAT via `AZURE_DEVOPS_PAT` + + +--- + +## Links + +- **GitHub**: https://github.com/microsoft/azure-devops-mcp +- **npm Package**: https://www.npmjs.com/package/@azure-devops/mcp +- **Getting Started**: https://github.com/microsoft/azure-devops-mcp/blob/main/docs/GETTINGSTARTED.md + diff --git a/content/docs/agentic-coding/CommunityResources/Tools/bc-code-intelligence-mcp.md b/content/docs/agentic-coding/CommunityResources/Tools/bc-code-intelligence-mcp.md new file mode 100644 index 00000000..9597cc61 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/bc-code-intelligence-mcp.md @@ -0,0 +1,43 @@ +--- +title: "BC Code Intelligence MCP" +linkTitle: "BC Code Intelligence" +weight: 1 +description: > + Business Central knowledge base with 14 specialist AI personas for comprehensive development guidance +--- + +## Overview + +The BC Code Intelligence MCP Server provides atomic Business Central knowledge topics through an innovative specialist system. Instead of a single generic AI, you interact with 14 domain-expert personas who provide focused, expert guidance for specific BC development areas. + +**Created by**: [Jeremy Vyska](https://github.com/JeremyVyska) + +--- + +## Key Features + +**14 BC Domain Specialists**: +- Sam Coder (AL coding), Dean Debug (troubleshooting), Alex Architect (design) +- Casey Cloud (cloud/SaaS), Morgan Modern (DevOps), Taylor Test (testing) +- Quinn Quality (code quality), Riley Report (reporting), Parker Performance (optimization) +- Jordan Journey (learning), Blake Business (business logic), Skyler Security (security) +- Drew Data (data modeling), Finley Flow (workflow/UX) + +**Smart Routing**: +- Automatic routing to the right specialist based on your question +- Multi-specialist collaboration for complex questions +- Seamless context handoffs between specialists + +**20+ MCP Tools**: +- Knowledge discovery (search topics, get content) +- Specialist management (routing, handoffs) +- Code analysis (reviews, patterns, architecture) +- Workflow orchestration + +--- + +## Links + +- **GitHub**: https://github.com/JeremyVyska/bc-code-intelligence-mcp +- **Knowledge Base**: https://github.com/JeremyVyska/bc-code-intelligence +- **npm Package**: https://www.npmjs.com/package/bc-code-intelligence-mcp diff --git a/content/docs/agentic-coding/CommunityResources/Tools/clockify-mcp.md b/content/docs/agentic-coding/CommunityResources/Tools/clockify-mcp.md new file mode 100644 index 00000000..dd805816 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/clockify-mcp.md @@ -0,0 +1,44 @@ +--- +title: "Clockify MCP" +linkTitle: "Clockify MCP" +weight: 6 +description: > + Comprehensive Clockify time tracking integration for project management and invoicing +--- + +## Overview + +The Clockify MCP Server provides comprehensive integration with Clockify time tracking and project management. It exposes 33 tools for managing workspaces, clients, projects, tasks, tags, time entries, and timers through AI assistants. + +**Created by**: [Jeremy Vyska](https://github.com/JeremyVyska) + +--- + +## Key Features + +**33 Tools for Complete Clockify Management**: +- Workspace Management - list, get, update workspaces +- Client Management - full CRUD operations +- Project Management - full CRUD operations +- Task Management - full CRUD operations +- Tag Management - full CRUD operations +- Time Entry Management - CRUD plus bulk operations +- Timer Operations - start, stop, get active timer + +**Enhanced from Reference Implementation**: +- Full CRUD operations (create, read, update, delete) +- Bulk operations for time entries +- Comprehensive filtering and pagination +- Timer start/stop functionality + +**Requirements**: +- Node.js 20+ +- CLOCKIFY_API_KEY from Clockify profile settings + +--- + +## Links + +- **GitHub**: https://github.com/JeremyVyska/clockify-mcp +- **Clockify API**: https://clockify.me/developers-api +- **Get API Key**: https://app.clockify.me/user/settings (Profile Settings → API) diff --git a/content/docs/agentic-coding/CommunityResources/Tools/serena-mcp.md b/content/docs/agentic-coding/CommunityResources/Tools/serena-mcp.md new file mode 100644 index 00000000..2ead1ed0 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/serena-mcp.md @@ -0,0 +1,46 @@ +--- +title: "Serena MCP" +linkTitle: "Serena MCP" +weight: 3 +description: > + Multi-language LSP-based coding assistant with AL Language Server support for Business Central +--- + +## Overview + +Serena is an AI-first code editor that provides MCP (Model Context Protocol) integration with Language Server Protocol (LSP) support for 20+ programming languages, including Business Central AL. It enables AI assistants to perform accurate code navigation, symbol lookup, and refactoring by leveraging native language servers. + +**Created by**: [oraios](https://github.com/oraios) + +--- + +## Key Features + +**AL Language Server Support**: +- Automatic setup using VS Code AL extension (`ms-dynamics-smb.al`) +- Native AL LSP integration with custom AL commands +- Platform detection for Windows/Linux/macOS +- Proper AL Language Server initialization + +**20+ Supported Languages**: +- AL, Python, TypeScript/JavaScript, Rust, Go, C/C++, C#, Java, Ruby, PHP, Kotlin, Swift, and more +- Each language uses native LSP implementation for maximum accuracy + +**Symbolic Operations**: +- Find References - Locate all usages across codebase +- Go to Definition - Jump to symbol definitions +- Document/Workspace Symbols - Search and list symbols +- Type & Call Hierarchy - Navigate relationships and call traces + +**Modes**: +- Lite Mode - Minimal tool set for focused tasks +- Standard Mode - Full tool suite with additional capabilities + +--- + +## Links + +- **GitHub**: https://github.com/oraios/serena +- **PyPI Package**: https://pypi.org/project/serena-mcp/ +- **Changelog**: https://github.com/oraios/serena/blob/main/CHANGELOG.md + diff --git a/content/docs/agentic-coding/CommunityResources/_index.md b/content/docs/agentic-coding/CommunityResources/_index.md new file mode 100644 index 00000000..bcc2926c --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/_index.md @@ -0,0 +1,131 @@ +--- +title: "Community Resources" +linkTitle: "Community Resources" +weight: 30 +description: > + Curated resources from the AL and Business Central community for agentic coding +--- + +## Overview + +The AL and Business Central community has created excellent resources for learning about and using AI-powered coding assistants. This section curates and summarizes these valuable community contributions. + +## Resource Categories + +### AI Coding Agents +Learn about different AI assistants available for AL development, their capabilities, and when to use each one. + +- **[AI Coding Agents](Agents)** - Compare GitHub Copilot, Claude, Cursor, and other AI agents for AL development + +### Articles & Blog Posts +In-depth articles and blog posts from community members sharing their experiences and insights with AI-assisted AL development. + +### Video Tutorials +Video content demonstrating AI coding techniques, tips, and workflows for Business Central development. + +### Tools & Extensions +Community-created tools and VS Code extensions that enhance AI-assisted development. + +- **[Tools & Extensions](Tools)** - Detailed guides for GitHub Copilot, AL Language extension, and other essential tools + +### Discussions & Forums +Active community discussions about agentic coding practices, challenges, and solutions. + +## Featured Resources + +### Getting Started with AI for AL +Collection of introductory resources for developers new to AI-assisted AL development. + +### Advanced Techniques +Resources covering advanced AI prompting, workflow optimization, and specialized use cases. + +### Real-World Examples +Case studies and examples from community members showing AI assistance in production projects. + +## Contributing Resources + +Found a great resource about AI-assisted AL development? We welcome contributions! + +**To suggest a resource:** +1. Ensure it's relevant to AL/Business Central development +2. Verify the content is high-quality and accurate +3. Check it's not already listed +4. Submit via the [Contributing](../../contributing) process + +**Resource Guidelines:** +- Must be publicly accessible +- Should provide clear value to AL developers +- Content should be accurate and up-to-date +- Appropriate for a professional audience + +## Resource Pages + +Explore detailed summaries and links for specific types of resources: + +- **[Blog Posts & Articles](articles)** - Written content from the community +- **[Video Tutorials](videos)** - Visual learning resources +- **[Tools & Extensions](Tools)** - Utilities that enhance AI development +- **[Community Discussions](https://github.com/microsoft/alguidelines/discussions)** - Join the conversation on GitHub + +## Stay Connected + +### Community Platforms + +**Business Central Community** +- [Business Central Community Forum](https://community.dynamics.com/business/) +- Dedicated sections for development questions and AI tooling + +**GitHub** +- [microsoft/AL](https://github.com/microsoft/AL) - AL Language repository +- Various community extension repositories with AI-friendly code + +**Social Media** +- Follow #MSDyn365BC hashtag +- Follow #ALDevelopment hashtag +- Connect with AL developers sharing AI tips + +**Discord & Slack** +- Business Central developer communities +- Channels dedicated to development tools and automation + +## Regular Contributors + +The community is grateful to developers who regularly share their knowledge about AI-assisted development. Check out content from active contributors in each resource category. + +## Learning Paths + +### For Beginners +1. Start with [Getting Started](../getting-started) in this hub +2. Watch introductory videos about AI coding assistants +3. Read beginner-friendly blog posts +4. Try simple prompts with your own code + +### For Intermediate Developers +1. Review advanced prompting techniques +2. Study real-world examples +3. Experiment with specialized tools +4. Participate in community discussions + +### For Advanced Users +1. Explore cutting-edge use cases +2. Contribute your own insights +3. Develop tools for the community +4. Mentor others in AI-assisted development + +## Quality Standards + +Resources listed here are reviewed for: +- **Accuracy**: Content is technically correct +- **Relevance**: Directly applicable to AL/BC development +- **Value**: Provides genuine insights or learning +- **Accessibility**: Publicly available and clearly presented + +## Updates + +This section is regularly updated with new community resources. Check back often for the latest content! + +**Last Updated**: Check individual resource pages for update dates. + +## Feedback + +Have feedback about these resources or suggestions for improvement? Please share through our [Contributing](../../contributing) channels. diff --git a/content/docs/agentic-coding/CommunityResources/articles.md b/content/docs/agentic-coding/CommunityResources/articles.md new file mode 100644 index 00000000..f553b972 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/articles.md @@ -0,0 +1,257 @@ +--- +title: "Blog Posts & Articles" +linkTitle: "Articles" +weight: 1 +description: > + Written content from the community about AI-assisted AL development +--- + +## Overview + +This page curates blog posts, articles, and written guides from the Business Central community about using AI coding assistants for AL development. + +## Featured Articles + +### Getting Started + +#### "My First Month with GitHub Copilot for AL Development" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: A developer's experience adopting GitHub Copilot for AL development, including lessons learned, productivity gains, and common pitfalls. + +**Key Takeaways**: +- How to configure Copilot for optimal AL suggestions +- Prompting patterns that work well for AL +- Mistakes to avoid when starting out + +**Link**: [Example - Replace with actual link when available] + +--- + +#### "Effective Prompting for Business Central Extensions" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Deep dive into writing effective prompts specifically for AL and Business Central development scenarios. + +**Key Takeaways**: +- AL-specific prompting patterns +- How to provide context for better results +- Examples of before/after prompt improvements + +**Link**: [Example - Replace with actual link when available] + +--- + +### Advanced Techniques + +#### "Using AI to Modernize Legacy NAV Code" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Strategies for using AI assistants to migrate and modernize code from NAV to Business Central AL. + +**Key Takeaways**: +- Approach for large-scale code conversion +- Handling NAV-specific patterns +- Quality assurance strategies + +**Link**: [Example - Replace with actual link when available] + +--- + +#### "AI-Assisted Test Development for AL" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: How to leverage AI to create comprehensive test coverage for Business Central extensions. + +**Key Takeaways**: +- Generating test codeunits with AI +- Creating test data setup +- Ensuring test quality + +**Link**: [Example - Replace with actual link when available] + +--- + +### Real-World Case Studies + +#### "How We Used AI to Accelerate Extension Development" +**Author**: Development Team +**Published**: Example Date +**Summary**: Case study from a development team that integrated AI assistants into their workflow, with metrics and results. + +**Key Takeaways**: +- Productivity metrics before and after +- Team adoption strategies +- ROI analysis + +**Link**: [Example - Replace with actual link when available] + +--- + +#### "Building a Complex Integration with AI Assistance" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Detailed walkthrough of using AI to build a complex integration between Business Central and external systems. + +**Key Takeaways**: +- Approach for complex projects +- What AI handled well vs. manual effort +- Lessons learned + +**Link**: [Example - Replace with actual link when available] + +--- + +## Best Practices & Guidelines + +#### "Code Review Checklist for AI-Generated AL Code" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Comprehensive checklist for reviewing AI-generated AL code before production. + +**Key Takeaways**: +- Specific AL concerns to check +- Performance review criteria +- Security considerations + +**Link**: [Example - Replace with actual link when available] + +--- + +#### "When NOT to Use AI for AL Development" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Important discussion of scenarios where AI assistance is not appropriate or effective. + +**Key Takeaways**: +- Limitation awareness +- Risk scenarios +- Alternative approaches + +**Link**: [Example - Replace with actual link when available] + +--- + +## Specialized Topics + +#### "Generating API Documentation with AI" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Techniques for using AI to create and maintain API documentation for AL extensions. + +**Link**: [Example - Replace with actual link when available] + +--- + +#### "AI-Assisted Performance Optimization" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Using AI to identify and resolve performance issues in AL code. + +**Link**: [Example - Replace with actual link when available] + +--- + +#### "Telemetry Instrumentation with AI Help" +**Author**: Community Contributor +**Published**: Example Date +**Summary**: Systematically adding Application Insights telemetry using AI assistance. + +**Link**: [Example - Replace with actual link when available] + +--- + +## Series & Multi-Part Articles + +### "AI for AL Developers" Series +**Author**: Community Contributor +**Parts**: 5 + +1. **Part 1**: Introduction and Setup +2. **Part 2**: Basic Prompting Techniques +3. **Part 3**: Advanced Workflows +4. **Part 4**: Team Integration +5. **Part 5**: Measuring Success + +**Link**: [Series homepage - Replace with actual link when available] + +--- + +## Tips & Tricks Collections + +#### "50 AI Prompts Every AL Developer Should Know" +**Summary**: Collection of tried-and-tested prompts for common AL development tasks. + +**Link**: [Example - Replace with actual link when available] + +--- + +#### "Quick Wins with GitHub Copilot in AL" +**Summary**: Short, actionable tips for immediate productivity gains. + +**Link**: [Example - Replace with actual link when available] + +--- + +## How to Use These Articles + +### For Learning +- Start with "Getting Started" articles if you're new +- Move to "Advanced Techniques" as you gain experience +- Reference "Best Practices" regularly + +### For Reference +- Bookmark articles relevant to your current work +- Use case studies for project planning +- Check specialized topics when needed + +### For Sharing +- Share articles with team members +- Use in training and onboarding +- Reference in documentation + +## Contributing Articles + +Have you written about AI-assisted AL development? + +**We'd love to include your content!** + +**Submission Guidelines**: +- Must be publicly accessible +- Focused on AL/Business Central development +- High-quality, accurate content +- Original work or properly attributed + +**How to Submit**: +1. Review the [Contributing](../../../contributing) guidelines +2. Submit a pull request adding your article +3. Include: Title, Author, Summary, Key Takeaways, Link + +## Article Quality Criteria + +Listed articles meet these standards: +- ✅ Technically accurate +- ✅ Relevant to AL development +- ✅ Clear and well-written +- ✅ Provides actionable insights +- ✅ Publicly accessible + +## Updates + +**Note**: This is a living document. As community members publish new content, this page will be updated. + +**To suggest additions**: See [Contributing](../../../contributing) section. + +--- + +## Placeholder Notice + +> **Note to Contributors**: This page uses example placeholders for community resources. As actual articles and blog posts about AI-assisted AL development are published by the community, they should be added here with proper attribution and links. Please contribute by submitting pull requests with real resources that meet the quality criteria above. + +--- + +## Related Resources + +- [Video Tutorials](../videos) - Visual learning content +- [Tools & Extensions](../tools) - Development utilities +- [Discussions](../discussions) - Community conversations diff --git a/content/docs/agentic-coding/CommunityResources/tools.md b/content/docs/agentic-coding/CommunityResources/tools.md new file mode 100644 index 00000000..368ad700 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/tools.md @@ -0,0 +1,569 @@ +--- +title: "Tools & Extensions" +linkTitle: "Tools" +weight: 3 +description: > + VS Code extensions and tools that enhance AI-assisted AL development +--- + +## Overview + +This page catalogs VS Code extensions, utilities, and tools that complement AI coding assistants for Business Central development. + +## AI Coding Assistants + +### GitHub Copilot +**Publisher**: GitHub +**Type**: AI Code Completion + +**Features**: +- Inline code suggestions +- Chat interface for questions +- Multi-file context awareness +- Code explanation and refactoring + +**AL-Specific Benefits**: +- Understands AL syntax and patterns +- Suggests Business Central APIs +- Generates AL-compliant code +- Helps with event subscribers and patterns + +**Installation**: +``` +Extension ID: GitHub.copilot +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) + +**Pricing**: Subscription required (free for students/open source maintainers) + +--- + +### GitHub Copilot Chat +**Publisher**: GitHub +**Type**: AI Chat Assistant + +**Features**: +- Interactive chat in VS Code +- Code explanations +- Debugging assistance +- Inline code chat + +**Best For**: +- Asking questions about AL code +- Getting explanations of Business Central patterns +- Debugging assistance +- Code refactoring discussions + +**Installation**: +``` +Extension ID: GitHub.copilot-chat +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) + +**Requires**: GitHub Copilot subscription + +--- + +## AL Development Extensions + +### AL Language +**Publisher**: Microsoft +**Type**: Language Support + +**Why It's Essential**: +- Core AL language support +- Syntax highlighting +- IntelliSense +- Code analysis + +**AI Integration**: +- Provides context for AI suggestions +- Enables AL-aware completions +- Works with AL code analyzers + +**Installation**: +``` +Extension ID: ms-dynamics-smb.al +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-dynamics-smb.al) + +**Required**: Yes, for AL development + +--- + +### AL Code Outline +**Publisher**: Community +**Type**: Code Navigation + +**Features**: +- Visual code structure +- Quick navigation +- Object overview +- Procedure list + +**AI Enhancement**: +- Helps AI understand code structure +- Easier to reference specific procedures in prompts +- Better context for AI suggestions + +**Installation**: +``` +Extension ID: davidfeldhoff.al-code-outline +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=davidfeldhoff.al-code-outline) + +--- + +### AL Object Designer +**Publisher**: Community +**Type**: Object Browser + +**Features**: +- Browse all AL objects +- Search functionality +- Quick navigation +- Object creation + +**AI Enhancement**: +- Quickly find objects to reference in prompts +- Better workspace navigation +- Context for AI when working with multiple objects + +**Installation**: +``` +Extension ID: martonsagi.al-object-designer +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=martonsagi.al-object-designer) + +--- + +### AL Variable Helper +**Publisher**: Community +**Type**: Variable Management + +**Features**: +- Auto-declare variables +- Variable suggestions +- Type inference +- Quick fixes + +**AI Complement**: +- Use with AI-generated code to clean up variables +- Auto-complete variables from AI suggestions +- Streamline AI-generated code + +**Installation**: +``` +Extension ID: rasmus.al-var-helper +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=rasmus.al-var-helper) + +--- + +### AL Test Runner +**Publisher**: Community +**Type**: Test Framework + +**Features**: +- Run AL tests from VS Code +- Test results visualization +- Code coverage +- Test debugging + +**AI Use Cases**: +- Test AI-generated code +- Verify AI refactoring +- Run tests for AI-written procedures + +**Installation**: +``` +Extension ID: jamespearson.al-test-runner +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=jamespearson.al-test-runner) + +--- + +## Code Quality Tools + +### AL CodeCop +**Type**: Code Analyzer +**Included In**: AL Language Extension + +**What It Does**: +- Enforces AL coding standards +- Identifies best practice violations +- Provides code fixes + +**AI Integration**: +- Review AI-generated code +- Ensure AI follows standards +- Auto-fix AI code issues + +**Usage**: Enabled in `app.json`: +```json +"codeAnalyzers": ["${CodeCop}"] +``` + +--- + +### Business Central Performance Toolkit +**Publisher**: Microsoft +**Type**: Performance Testing + +**Features**: +- Performance scenario testing +- Load testing +- Performance metrics + +**AI Use Cases**: +- Test performance of AI-generated code +- Validate AI optimization suggestions +- Benchmark before/after AI refactoring + +**Link**: [GitHub Repository](https://github.com/microsoft/BusinessCentralPerfToolkit) + +--- + +## Documentation Tools + +### AL XML Documentation +**Publisher**: Community +**Type**: Documentation Generator + +**Features**: +- Generate XML documentation +- Documentation snippets +- Template support + +**AI Enhancement**: +- Complement AI-generated docs +- Standardize documentation format +- Quick doc generation + +**Installation**: +``` +Extension ID: andrzejzwierzchowski.al-xml-doc +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=andrzejzwierzchowski.al-xml-doc) + +--- + +### Markdown All in One +**Publisher**: Community +**Type**: Markdown Editor + +**Features**: +- Markdown preview +- Keyboard shortcuts +- Auto-completion +- Table formatting + +**AI Use Cases**: +- Edit AI-generated README files +- Format AI-generated documentation +- Create documentation with AI assistance + +**Installation**: +``` +Extension ID: yzhang.markdown-all-in-one +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one) + +--- + +## Productivity Enhancers + +### GitLens +**Publisher**: GitKraken +**Type**: Git Enhancement + +**Features**: +- Code authorship +- Commit history +- Blame annotations +- Git visualization + +**AI Context**: +- See who wrote code (human vs AI-assisted) +- Track AI-generated code changes +- Review AI code evolution + +**Installation**: +``` +Extension ID: eamodio.gitlens +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) + +--- + +### Code Spell Checker +**Publisher**: Street Side Software +**Type**: Spell Checker + +**Features**: +- Spell checking in code +- Supports AL/BC terms +- Custom dictionaries + +**AI Complement**: +- Catch spelling errors in AI-generated code +- Improve AI-generated documentation +- Ensure consistent terminology + +**Installation**: +``` +Extension ID: streetsidesoftware.code-spell-checker +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) + +--- + +### Better Comments +**Publisher**: Community +**Type**: Comment Enhancement + +**Features**: +- Color-coded comments +- TODO highlighting +- Comment categories + +**AI Use Cases**: +- Mark AI-generated code sections +- Highlight AI code for review +- Track AI TODOs + +**Installation**: +``` +Extension ID: aaron-bond.better-comments +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) + +--- + +## Specialized Tools + +### AL Toolbox +**Publisher**: Community +**Type**: Utility Collection + +**Features**: +- Code snippets +- Quick actions +- AL utilities +- Productivity commands + +**AI Enhancement**: +- Complements AI code generation +- Quick fixes for AI code +- Utilities for AI-generated projects + +**Installation**: +``` +Extension ID: BartPermentier.al-toolbox +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=BartPermentier.al-toolbox) + +--- + +### AZ AL Dev Tools +**Publisher**: Community +**Type**: Development Tools + +**Features**: +- Code generators +- AL object wizards +- Development utilities +- Code analysis + +**AI Complement**: +- Generate boilerplate for AI to enhance +- Analyze AI-generated code structure +- Quick object creation + +**Installation**: +``` +Extension ID: andrzejzwierzchowski.az-al-dev-tools-vscode +``` + +**Link**: [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=andrzejzwierzchowski.az-al-dev-tools-vscode) + +--- + +## Recommended Extension Packs + +### Essential AL + AI Setup +Minimal setup for AI-assisted AL development: + +1. **AL Language** (Microsoft) +2. **GitHub Copilot** (GitHub) +3. **GitHub Copilot Chat** (GitHub) +4. **AL Code Outline** (Community) +5. **AL Object Designer** (Community) + +### Complete AL Development Suite +Comprehensive setup: + +- All from Essential Setup +- AL Variable Helper +- AL Test Runner +- AL XML Documentation +- GitLens +- Code Spell Checker +- Better Comments + +### Team Development +Recommended for development teams: + +- Complete Suite extensions +- AL Toolbox +- AZ AL Dev Tools +- Business Central Performance Toolkit + +## Configuration Tips + +### Optimizing for AI +Add to your `settings.json`: + +```json +{ + // Enable GitHub Copilot for AL + "github.copilot.enable": { + "*": true, + "al": true + }, + + // Better inline suggestions + "editor.inlineSuggest.enabled": true, + "editor.suggest.showMethods": true, + "editor.suggest.showFunctions": true, + + // Code analysis + "al.enableCodeAnalysis": true, + "al.codeAnalyzers": ["${CodeCop}", "${UICop}", "${PerTenantExtensionCop}"], + + // Auto-save for better AI context + "files.autoSave": "afterDelay", + "files.autoSaveDelay": 1000 +} +``` + +### Keyboard Shortcuts +Useful shortcuts when working with AI: + +- **Trigger Suggestion**: `Ctrl+Space` (Windows/Linux) or `Cmd+Space` (Mac) +- **Accept Suggestion**: `Tab` +- **Next Suggestion**: `Alt+]` +- **Previous Suggestion**: `Alt+[` +- **Open Copilot Chat**: `Ctrl+Shift+I` + +## Tool Integrations + +### Combining Tools Effectively + +**AI + Code Analysis**: +1. Generate code with AI +2. Run CodeCop to check standards +3. Fix issues with AI assistance +4. Verify with test runner + +**AI + Documentation**: +1. Write code with AI +2. Generate XML docs with AI +3. Format with AL XML Documentation extension +4. Create README with Markdown All in One + +**AI + Version Control**: +1. Develop features with AI +2. Review changes with GitLens +3. Commit with clear AI-related messages +4. Track AI productivity over time + +## Community-Created Tools + +### AL Prompt Templates +**Type**: Snippet Collection +**What**: Pre-written prompts for common AL tasks + +**Repository**: [Example - To be created by community] + +--- + +### BC AI Helper Scripts +**Type**: PowerShell Scripts +**What**: Automation scripts for AI-assisted BC development + +**Repository**: [Example - To be created by community] + +--- + +## Contributing Tools + +**Created a tool for AI-assisted AL development?** + +Share it with the community! + +**Submission Guidelines**: +- Must be useful for AL/BC development +- Should enhance AI-assisted workflows +- Open source preferred +- Well documented + +**How to Submit**: See [Contributing](../../../contributing) section + +## Tool Safety & Privacy + +### Privacy Considerations + +**What Gets Shared**: +- Code in your workspace (with AI assistants) +- File names and structure +- Your prompts and questions + +**Best Practices**: +- Review extension permissions +- Understand data handling +- Use organization-approved tools +- Don't include sensitive data in code + +### Security + +**Verify Extensions**: +- Check publisher reputation +- Read reviews +- Review permissions requested +- Keep extensions updated + +## Updates + +Extensions are frequently updated. Check for updates regularly: + +- VS Code: `Ctrl+Shift+X` → Click update icon +- Auto-update: Enable in VS Code settings + +--- + +## Placeholder Notice + +> **Note**: Some tools listed may be examples for community-created utilities. As real tools are developed and published, they should be added here. The core Microsoft and established community extensions (GitHub Copilot, AL Language, etc.) are real and available now. + +--- + +## Related Resources + +- [Setup Guide](../../getting-started/setup) - Environment configuration +- [Blog Posts](../articles) - Tool reviews and comparisons +- [Videos](../videos) - Tool demonstrations +- [Discussions](../discussions) - Tool recommendations and support diff --git a/content/docs/agentic-coding/CommunityResources/videos.md b/content/docs/agentic-coding/CommunityResources/videos.md new file mode 100644 index 00000000..1c0139bd --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/videos.md @@ -0,0 +1,402 @@ +--- +title: "Video Tutorials" +linkTitle: "Videos" +weight: 2 +description: > + Video content demonstrating AI-assisted AL development techniques +--- + +## Overview + +Visual learning resources showing AI coding assistants in action for Business Central development. These videos demonstrate real workflows, techniques, and best practices. + +## Getting Started Videos + +### Introduction to AI Coding for AL +**Channel**: Community Channel +**Duration**: ~15 minutes +**Level**: Beginner + +**What You'll Learn**: +- Setting up GitHub Copilot for AL development +- First steps with AI assistance +- Basic prompting techniques +- Common mistakes to avoid + +**Topics Covered**: +- Installation and configuration +- Writing your first AI-assisted AL code +- Understanding suggestions +- Accepting and modifying completions + +**Link**: [Example - Replace with actual link when available] + +--- + +### Configuring VS Code for Optimal AI Assistance +**Channel**: Community Channel +**Duration**: ~10 minutes +**Level**: Beginner + +**What You'll Learn**: +- VS Code settings for AL + AI +- Workspace configuration +- Extension setup +- Optimizing for better suggestions + +**Link**: [Example - Replace with actual link when available] + +--- + +## Technique Demonstrations + +### Effective Prompting for AL Development +**Channel**: Community Channel +**Duration**: ~20 minutes +**Level**: Intermediate + +**Demonstrations**: +- Writing clear, specific prompts +- Providing context for better results +- Iterative refinement +- Prompt patterns that work for AL + +**Example Scenarios**: +- Creating table extensions +- Generating page code +- Writing codeunit logic +- Building API pages + +**Link**: [Example - Replace with actual link when available] + +--- + +### Live Coding: Building a Feature with AI +**Channel**: Community Channel +**Duration**: ~30 minutes +**Level**: Intermediate + +**Watch As**: +- Complete feature built with AI assistance +- Real-time problem solving +- Code review and refinement +- Testing and debugging + +**Feature Built**: Customer loyalty points system + +**Link**: [Example - Replace with actual link when available] + +--- + +## Advanced Workflows + +### AI-Assisted Code Refactoring +**Channel**: Community Channel +**Duration**: ~25 minutes +**Level**: Advanced + +**Demonstrations**: +- Analyzing legacy code +- Planning refactoring with AI +- Executing transformations +- Validating changes + +**Before/After**: Real code transformation examples + +**Link**: [Example - Replace with actual link when available] + +--- + +### Adding Telemetry with AI Assistance +**Channel**: Community Channel +**Duration**: ~20 minutes +**Level**: Advanced + +**Step-by-Step**: +- Planning telemetry strategy +- Generating telemetry code +- Creating custom dimensions +- Testing telemetry output + +**Link**: [Example - Replace with actual link when available] + +--- + +### Building Test Coverage with AI +**Channel**: Community Channel +**Duration**: ~30 minutes +**Level**: Advanced + +**Covers**: +- Test planning with AI +- Generating test codeunits +- Creating test data +- Running and debugging tests + +**Link**: [Example - Replace with actual link when available] + +--- + +## Real-World Projects + +### Case Study: Migrating NAV to BC with AI +**Channel**: Company Channel +**Duration**: ~45 minutes +**Level**: Advanced + +**Complete Walkthrough**: +- Project scope and planning +- AI-assisted code conversion +- Manual review process +- Quality assurance +- Results and lessons learned + +**Metrics Shared**: Time savings, accuracy rates + +**Link**: [Example - Replace with actual link when available] + +--- + +### Building a Complete Extension from Scratch +**Channel**: Community Channel +**Duration**: ~60 minutes (multi-part) +**Level**: Intermediate + +**Full Development Cycle**: +- Requirements gathering +- Architecture design +- Implementation with AI +- Testing +- Documentation +- Deployment + +**Extension Built**: Warehouse management enhancement + +**Link**: [Example - Replace with actual link when available] + +--- + +## Tips & Tricks + +### "5-Minute AL AI Tips" Series +**Channel**: Community Channel +**Episodes**: 20+ +**Duration**: ~5 minutes each +**Level**: All + +**Topics Include**: +- Quick productivity hacks +- Useful prompt templates +- Keyboard shortcuts +- Common pitfalls to avoid +- Integration tips + +**Link**: [Playlist - Replace with actual link when available] + +--- + +### AI Shortcuts Every AL Developer Should Know +**Channel**: Community Channel +**Duration**: ~15 minutes +**Level**: All + +**Quick Wins**: +- Fast code generation +- Smart completions +- Context switching +- Multi-file operations + +**Link**: [Example - Replace with actual link when available] + +--- + +## Tool-Specific Tutorials + +### GitHub Copilot for AL Developers +**Channel**: GitHub or Community +**Duration**: ~25 minutes +**Level**: Beginner to Intermediate + +**Specific to GitHub Copilot**: +- Installation and setup +- Chat vs inline suggestions +- Slash commands +- Best practices for AL + +**Link**: [Example - Replace with actual link when available] + +--- + +### Using AI in VS Code for Business Central +**Channel**: Microsoft or Community +**Duration**: ~20 minutes +**Level**: Beginner + +**VS Code Integration**: +- Extension setup +- Keyboard shortcuts +- Chat interface +- Multi-file context + +**Link**: [Example - Replace with actual link when available] + +--- + +## Conference Talks & Webinars + +### "The Future of AL Development with AI" +**Event**: BC TechDays / Directions +**Speaker**: Industry Expert +**Duration**: ~45 minutes +**Level**: All + +**Topics**: +- Current state of AI assistance +- Emerging trends +- Impact on development teams +- Future predictions + +**Link**: [Example - Replace with actual link when available] + +--- + +### "Practical AI for BC Developers" Workshop +**Event**: Community Webinar +**Duration**: ~90 minutes +**Level**: Intermediate + +**Hands-On Workshop**: +- Interactive exercises +- Real-world scenarios +- Q&A session +- Best practices discussion + +**Link**: [Example - Replace with actual link when available] + +--- + +## Series & Playlists + +### "AI-Powered AL Development" Complete Course +**Creator**: Community Educator +**Videos**: 15 +**Total Duration**: ~6 hours +**Level**: Beginner to Advanced + +**Curriculum**: +1. Introduction and Setup (3 videos) +2. Basic Techniques (4 videos) +3. Advanced Patterns (4 videos) +4. Real Projects (3 videos) +5. Best Practices (1 video) + +**Link**: [Course playlist - Replace with actual link when available] + +--- + +### "Code Review with AI" Series +**Creator**: Community Contributor +**Videos**: 10 +**Duration**: ~20 minutes each +**Level**: Intermediate + +**Each Episode**: Reviews real AL code with AI assistance, showing improvements and best practices + +**Link**: [Series - Replace with actual link when available] + +--- + +## Live Streams & Recordings + +### Weekly AL Development with AI +**Stream**: Live on [Platform] +**Schedule**: Weekly +**Duration**: ~60 minutes +**Level**: All + +**Format**: +- Live coding with AI +- Community Q&A +- Tip sharing +- Problem solving + +**Link**: [Channel - Replace with actual link when available] + +--- + +## How to Use These Videos + +### For Learning +- **Beginners**: Start with "Getting Started" videos +- **Intermediate**: Focus on technique demonstrations +- **Advanced**: Watch real-world projects and case studies + +### For Reference +- Bookmark specific technique videos +- Use during development as guidance +- Share with team members +- Include in training materials + +### For Practice +- Code along with demonstrations +- Pause and try techniques yourself +- Apply patterns to your own projects +- Experiment with variations + +## Creating Your Own Content + +**Interested in creating AL + AI video content?** + +We encourage community members to create and share! + +**Tips for Creating Good Content**: +- Show real code and workflows +- Explain your thinking process +- Include mistakes and corrections +- Provide downloadable examples +- Keep audio quality high +- Use clear screen recordings + +**To Get Listed**: +1. Create quality content +2. Make it publicly accessible +3. Submit via [Contributing](../../../contributing) process + +## Video Quality Standards + +Listed videos meet these criteria: +- ✅ Clear audio and video +- ✅ Accurate information +- ✅ Relevant to AL/BC development +- ✅ Good demonstration quality +- ✅ Publicly accessible + +## Language & Accessibility + +Most videos are in English, but we welcome content in other languages. Please indicate language in submissions. + +**Accessibility**: +- Look for videos with closed captions +- Many creators provide transcripts +- Some include downloadable code samples + +## Updates + +**Latest Additions**: Check back regularly for new videos + +**To Suggest Videos**: See [Contributing](../../../contributing) section + +--- + +## Placeholder Notice + +> **Note to Contributors**: This page uses example placeholders for community video resources. As actual video content about AI-assisted AL development is published, it should be added here with proper attribution and links. Please contribute by submitting pull requests with real resources that meet the quality criteria above. + +--- + +## Related Resources + +- [Blog Posts & Articles](../articles) - Written content +- [Tools & Extensions](../tools) - Development utilities +- [Discussions](../discussions) - Community conversations +- [Getting Started](../../getting-started) - Foundational concepts diff --git a/content/docs/agentic-coding/GettingMore/_index.md b/content/docs/agentic-coding/GettingMore/_index.md new file mode 100644 index 00000000..9d93daa1 --- /dev/null +++ b/content/docs/agentic-coding/GettingMore/_index.md @@ -0,0 +1,47 @@ +--- +title: "Getting More" +linkTitle: "Getting More" +weight: 20 +description: > + Practical examples and advanced techniques for AI-assisted AL development +--- + +This section provides hands-on examples of how to use AI assistants for common AL development tasks. Each guide walks through a realistic scenario with step-by-step instructions and prompts. + +## In This Section + +- **[AI-Assisted Code Review](code-review)** - Use AI to review code for quality, performance, and best practices +- **[Generating Documentation](documentation)** - Automatically create and maintain documentation for your AL code +- **[Adding Telemetry](telemetry)** - Instrument your extensions with Application Insights telemetry +- **[Refactoring Legacy Code](refactoring)** - Modernize and improve existing AL code +- **[Writing Tests](testing)** - Create comprehensive test coverage with AI assistance + +## How to Use These Guides + +Each guide follows a practical, scenario-based approach: + +1. **Scenario**: A realistic development task +2. **Goal**: What you're trying to achieve +3. **Step-by-Step**: Detailed instructions with actual prompts +4. **Review Points**: What to check in the AI-generated code +5. **Tips**: Additional insights and variations + +## Before You Start + +Make sure you've completed the [Getting Started](../getting-started) section to: +- Understand agentic coding concepts +- Set up your environment +- Learn effective prompting +- Know the best practices and limitations + +## Learning by Doing + +These examples are designed to be: +- **Practical**: Based on real AL development tasks +- **Detailed**: Step-by-step instructions you can follow +- **Educational**: Explains why, not just what +- **Adaptable**: Patterns you can apply to your own work + +## Contributing Examples + +Have a great example of AI-assisted AL development? Consider contributing! See the [Contributing](../../contributing) section for guidelines. diff --git a/content/docs/agentic-coding/GettingMore/code-review.md b/content/docs/agentic-coding/GettingMore/code-review.md new file mode 100644 index 00000000..0010d847 --- /dev/null +++ b/content/docs/agentic-coding/GettingMore/code-review.md @@ -0,0 +1,368 @@ +--- +title: "AI-Assisted Code Review" +linkTitle: "Code Review" +weight: 1 +description: > + Learn how to use AI assistants to review AL code for quality, performance, and best practices +--- + +## Scenario + +You've just finished implementing a new feature: a codeunit that processes sales orders and applies volume-based discounts. Before submitting for peer review, you want to use AI to catch potential issues. + +## Goal + +Use AI to identify: +- Potential bugs or logical errors +- Performance issues +- AL best practice violations +- Missing error handling +- Code quality improvements + +## The Code to Review + +Here's the codeunit we'll review: + +```al +codeunit 50100 "Sales Order Discount Processor" +{ + procedure ApplyVolumeDiscounts(var SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + TotalQuantity: Decimal; + DiscountPct: Decimal; + begin + TotalQuantity := 0; + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + if SalesLine.FindSet() then + repeat + TotalQuantity := TotalQuantity + SalesLine.Quantity; + until SalesLine.Next() = 0; + + if TotalQuantity > 100 then + DiscountPct := 15 + else if TotalQuantity > 50 then + DiscountPct := 10 + else if TotalQuantity > 10 then + DiscountPct := 5; + + SalesLine.Reset(); + if SalesLine.FindSet() then + repeat + SalesLine."Line Discount %" := DiscountPct; + SalesLine.Modify(); + until SalesLine.Next() = 0; + end; +} +``` + +## Step-by-Step Review Process + +### Step 1: Initial Quality Review + +**Prompt**: +``` +Review this AL codeunit for potential bugs, code quality issues, and best practice violations. + +[Paste the code above] + +Specifically check for: +- Logical errors +- Missing error handling +- Variable declarations +- Commit/transaction issues +- Performance concerns +``` + +**Expected AI Findings**: +The AI should identify issues like: +- Missing `FindSet(true, false)` parameters for modification +- No error handling +- Multiple FindSet operations (inefficient) +- Hard-coded discount percentages +- No validation of input parameters +- Missing ModifyAll opportunity +- No telemetry or logging + +### Step 2: Performance Analysis + +**Prompt**: +``` +Analyze the performance of this code, especially database operations. +What are potential performance issues? How can it be optimized? + +[Include the code or reference it if in context] +``` + +**Expected AI Suggestions**: +- Combine the two FindSet loops into one +- Use ModifyAll instead of looping for discount application +- Consider using SetLoadFields for better performance +- Cache discount percentages instead of hard-coding + +### Step 3: Best Practices Check + +**Prompt**: +``` +Check this code against AL coding best practices and Business Central development standards. +What improvements would you recommend? +``` + +**Expected AI Recommendations**: +- Add XML documentation +- Extract discount calculation to separate function +- Use constants for discount tiers +- Add error handling +- Implement proper transaction handling +- Add telemetry for monitoring + +### Step 4: Request Improved Version + +**Prompt**: +``` +Rewrite this codeunit implementing all the improvements you suggested. +Include: +- XML documentation +- Error handling +- Performance optimizations +- Best practice compliance +- Telemetry/logging +- Discount tiers from setup table instead of hard-coded values +``` + +**Review the Generated Code**: +The AI should generate something like: + +```al +/// +/// Processes sales orders and applies volume-based discounts +/// +codeunit 50100 "Sales Order Discount Processor" +{ + /// + /// Applies volume-based discounts to a sales order + /// + /// The sales header to process + procedure ApplyVolumeDiscounts(var SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + TotalQuantity: Decimal; + DiscountPct: Decimal; + begin + if SalesHeader."No." = '' then + Error('Sales order number cannot be empty.'); + + TotalQuantity := CalculateTotalQuantity(SalesHeader); + DiscountPct := GetDiscountPercentage(TotalQuantity); + + if DiscountPct > 0 then + ApplyDiscountToLines(SalesHeader, DiscountPct); + + LogTelemetry(SalesHeader."No.", TotalQuantity, DiscountPct); + end; + + local procedure CalculateTotalQuantity(SalesHeader: Record "Sales Header"): Decimal + var + SalesLine: Record "Sales Line"; + TotalQty: Decimal; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.SetLoadFields(Quantity); + + if SalesLine.FindSet() then + repeat + TotalQty += SalesLine.Quantity; + until SalesLine.Next() = 0; + + exit(TotalQty); + end; + + local procedure GetDiscountPercentage(TotalQuantity: Decimal): Decimal + var + VolumeDiscountSetup: Record "Volume Discount Setup"; // Assuming this table exists + begin + VolumeDiscountSetup.SetFilter("Minimum Quantity", '<=%1', TotalQuantity); + VolumeDiscountSetup.SetCurrentKey("Minimum Quantity"); + VolumeDiscountSetup.Ascending(false); + + if VolumeDiscountSetup.FindFirst() then + exit(VolumeDiscountSetup."Discount Percentage"); + + exit(0); + end; + + local procedure ApplyDiscountToLines(SalesHeader: Record "Sales Header"; DiscountPct: Decimal) + var + SalesLine: Record "Sales Line"; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.ModifyAll("Line Discount %", DiscountPct, true); + end; + + local procedure LogTelemetry(DocumentNo: Code[20]; TotalQty: Decimal; DiscountPct: Decimal) + var + Telemetry: Codeunit Telemetry; + CustomDimensions: Dictionary of [Text, Text]; + begin + CustomDimensions.Add('DocumentNo', DocumentNo); + CustomDimensions.Add('TotalQuantity', Format(TotalQty)); + CustomDimensions.Add('DiscountPercentage', Format(DiscountPct)); + + Telemetry.LogMessage('0001', 'Volume discount applied', Verbosity::Normal, + DataClassification::SystemMetadata, TelemetryScope::All, CustomDimensions); + end; +} +``` + +## Review Points: What to Check + +After AI generates the improved code, verify: + +### ✅ Correctness +- [ ] Logic matches business requirements +- [ ] All edge cases handled +- [ ] No regression in functionality +- [ ] Error messages are clear + +### ✅ Performance +- [ ] Efficient database queries +- [ ] Proper use of SetLoadFields +- [ ] ModifyAll used where appropriate +- [ ] No unnecessary loops + +### ✅ Best Practices +- [ ] XML documentation complete +- [ ] Proper error handling +- [ ] Appropriate transaction handling +- [ ] Good function decomposition + +### ✅ AL Specifics +- [ ] Correct AL syntax +- [ ] Proper use of BC APIs +- [ ] No deprecated features +- [ ] Appropriate data types + +### ✅ Maintainability +- [ ] Clear, descriptive names +- [ ] Logical organization +- [ ] Easy to test +- [ ] Well documented + +## Additional Review Prompts + +### Security Review +``` +Review this code for potential security issues: +- Input validation +- Authorization checks +- Data access controls +- Potential injection vulnerabilities +``` + +### Testability Review +``` +Analyze this code for testability. +What makes it easy or hard to test? +How can it be restructured to be more testable? +``` + +### Documentation Review +``` +Review the XML documentation for this code. +Is it complete? Clear? Helpful? +What additional documentation would be valuable? +``` + +## Common Issues AI Might Miss + +Be aware AI might not catch: + +1. **Business Logic Errors** + - AI doesn't know your specific discount rules + - Verify the logic matches actual requirements + +2. **Integration Issues** + - AI doesn't know about other extensions + - Check for conflicts with existing code + +3. **BC Version Compatibility** + - AI might use features not in your BC version + - Verify all APIs are available + +4. **Organization Standards** + - AI doesn't know your specific standards + - Adapt to match your conventions + +## Best Practices for AI Code Review + +### 1. Use Specific Review Criteria +Instead of "review this code", specify what to look for: +``` +Review for: performance, error handling, AL best practices, testability +``` + +### 2. Review in Layers +Don't try to review everything at once: +- First: Correctness and logic +- Second: Performance +- Third: Best practices +- Fourth: Documentation + +### 3. Combine with Tools +Use AI review alongside: +- AL code analyzers +- Static analysis tools +- Peer review +- Testing + +### 4. Iterate +Review, improve, review again: +``` +Review the updated code. Are there any remaining issues? +``` + +### 5. Document Findings +Keep track of: +- Common issues AI finds +- Issues AI misses +- Effective review prompts + +## Practice Exercise + +Try reviewing this code with AI: + +```al +procedure CalculateShippingCost(SalesHeader: Record "Sales Header"): Decimal +var + SalesLine: Record "Sales Line"; + Weight: Decimal; +begin + Weight := 0; + SalesLine.SetRange("Document No.", SalesHeader."No."); + if SalesLine.Find('-') then + repeat + Weight := Weight + SalesLine.Quantity; + until SalesLine.Next() = 0; + + if Weight < 10 then + exit(5.00) + else + exit(10.00); +end; +``` + +**Your Tasks**: +1. Ask AI to review for issues +2. Request performance improvements +3. Ask for best practice compliance +4. Get an improved version +5. Review the improved version yourself + +## Next Steps + +- Learn how to use AI for [generating documentation](../documentation) +- See how AI can help with [adding telemetry](../telemetry) +- Explore [refactoring legacy code](../refactoring) with AI assistance diff --git a/content/docs/agentic-coding/GettingMore/documentation.md b/content/docs/agentic-coding/GettingMore/documentation.md new file mode 100644 index 00000000..d853917b --- /dev/null +++ b/content/docs/agentic-coding/GettingMore/documentation.md @@ -0,0 +1,661 @@ +--- +title: "Generating Documentation" +linkTitle: "Documentation" +weight: 2 +description: > + Use AI to create and maintain comprehensive documentation for your AL code +--- + +## Scenario + +You have a well-functioning AL extension but it lacks documentation. You need to create: +- XML documentation comments for all procedures +- A comprehensive README file +- API documentation for public interfaces +- User-facing feature documentation + +## Goal + +Use AI to quickly generate high-quality documentation that: +- Explains what the code does +- Documents parameters and return values +- Provides usage examples +- Helps developers and users understand the extension + +## Types of Documentation + +### 1. XML Documentation Comments +In-code documentation for procedures, triggers, and events. + +### 2. README Files +Project overview, setup instructions, and getting started guides. + +### 3. API Documentation +Documentation for public APIs and integration points. + +### 4. User Documentation +End-user guides and feature explanations. + +## Step-by-Step Guide + +### Step 1: XML Documentation for Procedures + +**Scenario**: You have a codeunit without documentation. + +**Starting Code**: +```al +codeunit 50100 "Customer Email Manager" +{ + procedure SendWelcomeEmail(CustomerNo: Code[20]): Boolean + var + Customer: Record Customer; + EmailMessage: Codeunit "Email Message"; + begin + if not Customer.Get(CustomerNo) then + exit(false); + + if Customer."E-Mail" = '' then + exit(false); + + EmailMessage.Create(Customer."E-Mail", 'Welcome!', GetWelcomeEmailBody(Customer)); + exit(EmailMessage.Send()); + end; + + local procedure GetWelcomeEmailBody(Customer: Record Customer): Text + begin + exit(StrSubstNo('Dear %1, welcome to our service!', Customer.Name)); + end; +} +``` + +**Prompt**: +``` +Add XML documentation comments to all procedures in this codeunit. +Include: +- Summary for each procedure +- Parameter descriptions +- Return value descriptions +- Example usage where helpful +- Any important notes or warnings + +[Paste the code] +``` + +**Expected Result**: +```al +/// +/// Manages customer email communications +/// +codeunit 50100 "Customer Email Manager" +{ + /// + /// Sends a welcome email to a customer + /// + /// The customer number to send the email to + /// True if the email was sent successfully, false otherwise + /// + /// The procedure will return false if: + /// - The customer does not exist + /// - The customer has no email address + /// - The email fails to send + /// + /// + /// if CustomerEmailManager.SendWelcomeEmail('C001') then + /// Message('Welcome email sent successfully'); + /// + procedure SendWelcomeEmail(CustomerNo: Code[20]): Boolean + var + Customer: Record Customer; + EmailMessage: Codeunit "Email Message"; + begin + if not Customer.Get(CustomerNo) then + exit(false); + + if Customer."E-Mail" = '' then + exit(false); + + EmailMessage.Create(Customer."E-Mail", 'Welcome!', GetWelcomeEmailBody(Customer)); + exit(EmailMessage.Send()); + end; + + /// + /// Generates the body text for the welcome email + /// + /// The customer record to generate the email for + /// The formatted email body text + local procedure GetWelcomeEmailBody(Customer: Record Customer): Text + begin + exit(StrSubstNo('Dear %1, welcome to our service!', Customer.Name)); + end; +} +``` + +### Step 2: Batch Documentation for Multiple Files + +**Prompt**: +``` +I have multiple AL files that need XML documentation. +For each public procedure, add: +- Summary +- Parameter descriptions +- Return value (if applicable) +- Example usage + +Process these files: +[List files or paste multiple code blocks] +``` + +**Tip**: Do this in batches of 3-5 files to maintain context and quality. + +### Step 3: Creating a README File + +**Prompt**: +``` +Create a comprehensive README.md for my AL extension with the following information: + +Extension Name: Customer Engagement Suite +Purpose: Enhance customer communication and engagement features +Key Features: +- Automated welcome emails +- Customer portal access +- Newsletter subscription management +- Customer satisfaction surveys + +Include sections for: +- Overview and purpose +- Features list +- Installation instructions +- Configuration steps +- Usage examples +- Dependencies +- Compatibility (BC version 21+) +- Contributing guidelines +- License (MIT) +``` + +**Expected Structure**: +```markdown +# Customer Engagement Suite + +> Enhance customer communication and engagement in Microsoft Dynamics 365 Business Central + +## Overview + +The Customer Engagement Suite is a Business Central extension that provides comprehensive +tools for managing customer communications and engagement activities. + +## Features + +### Automated Welcome Emails +Automatically send personalized welcome emails to new customers upon registration. + +### Customer Portal Access +Enable customers to access a self-service portal for order tracking and account management. + +### Newsletter Subscription Management +Allow customers to manage their newsletter preferences and subscriptions. + +### Customer Satisfaction Surveys +Collect and analyze customer feedback through integrated surveys. + +## Installation + +### Prerequisites +- Microsoft Dynamics 365 Business Central version 21.0 or higher +- Email account configured in Business Central +- System Application extension installed + +### Steps + +1. Download the extension file (.app) +2. Open Business Central Administration Shell +3. Run the installation command: + ```powershell + Publish-NAVApp -ServerInstance BC210 -Path "CustomerEngagementSuite.app" + Install-NAVApp -ServerInstance BC210 -Name "Customer Engagement Suite" + ``` + +## Configuration + +### Email Setup +1. Navigate to **Email Accounts** page +2. Configure your SMTP settings +3. Test the email connection + +### Welcome Email Template +1. Go to **Customer Engagement Setup** +2. Configure the welcome email template +3. Enable automatic sending + +## Usage + +### Sending Welcome Emails +```al +codeunit 50100 "Customer Email Manager" +{ + procedure SendWelcomeEmail(CustomerNo: Code[20]): Boolean +} +``` + +**Example:** +```al +CustomerEmailManager: Codeunit "Customer Email Manager"; +begin + if CustomerEmailManager.SendWelcomeEmail('C001') then + Message('Welcome email sent successfully'); +end; +``` + +## Dependencies + +- **System Application**: Core BC functionality +- **Base Application**: Standard BC tables and pages + +## Compatibility + +- **Business Central**: Version 21.0 and higher +- **Platform**: Compatible with both SaaS and On-Premises + +## Contributing + +We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. + +## License + +This project is licensed under the MIT License - see [LICENSE](LICENSE) file for details. + +## Support + +For issues and questions: +- Create an issue in our [GitHub repository](https://github.com/yourorg/customer-engagement) +- Email: support@yourcompany.com + +## Changelog + +See [CHANGELOG.md](CHANGELOG.md) for version history. +``` + +### Step 4: API Documentation + +**Prompt**: +``` +Create API documentation for the public procedures in my Customer Email Manager codeunit. +Format it as markdown suitable for a developer portal. + +Include: +- Procedure signature +- Description +- Parameters with types and descriptions +- Return values +- Code examples +- Error conditions +- Notes and best practices + +[Include the codeunit code] +``` + +**Expected Output**: +```markdown +# Customer Email Manager API + +## Overview +The Customer Email Manager provides functionality for sending customer-related emails. + +## Procedures + +### SendWelcomeEmail + +Sends a welcome email to a specified customer. + +**Signature:** +```al +procedure SendWelcomeEmail(CustomerNo: Code[20]): Boolean +``` + +**Parameters:** + +| Name | Type | Description | +|------|------|-------------| +| CustomerNo | Code[20] | The unique identifier of the customer | + +**Returns:** + +| Type | Description | +|------|-------------| +| Boolean | `true` if email sent successfully, `false` otherwise | + +**Example:** +```al +var + CustomerEmailManager: Codeunit "Customer Email Manager"; + Success: Boolean; +begin + Success := CustomerEmailManager.SendWelcomeEmail('C00001'); + if Success then + Message('Email sent successfully') + else + Error('Failed to send email'); +end; +``` + +**Error Conditions:** + +The procedure returns `false` in the following cases: +- Customer does not exist +- Customer has no email address configured +- Email service is unavailable + +**Best Practices:** +- Always check the return value +- Ensure email account is configured before calling +- Consider calling asynchronously for better performance + +**See Also:** +- Email Account Setup +- Customer Configuration +``` + +### Step 5: User Documentation + +**Prompt**: +``` +Create user-facing documentation for the Welcome Email feature. +Target audience: Business users who are not developers. + +Explain: +- What the feature does +- How to enable/configure it +- How to use it +- Troubleshooting common issues + +Use simple language and include screenshots placeholders where helpful. +``` + +**Expected Output**: +```markdown +# Welcome Email Feature + +## What is the Welcome Email Feature? + +The Welcome Email feature automatically sends a personalized email to new customers +when they are added to your system. This helps create a positive first impression +and provides important information to your customers right away. + +## Enabling Welcome Emails + +1. Open Business Central +2. Search for "Customer Engagement Setup" +3. Check the box next to "Send Welcome Emails" +4. Click "OK" to save + +![Setup Screenshot] + +## Configuring the Email Template + +### Step 1: Access Email Templates +1. Search for "Email Templates" +2. Find "Customer Welcome Email" +3. Click "Edit" + +### Step 2: Customize the Message +1. Update the email subject line +2. Modify the email body +3. Add your company logo +4. Click "OK" to save + +### Step 3: Test the Email +1. Open a test customer +2. Click "Actions" > "Send Welcome Email" +3. Check that you receive the email + +## Using Welcome Emails + +### Automatic Sending +When enabled, welcome emails are sent automatically when: +- A new customer is created +- An existing customer is marked as active for the first time + +### Manual Sending +You can also send welcome emails manually: + +1. Open the customer card +2. Click "Actions" > "Email" > "Send Welcome Email" +3. Confirm the action + +## Troubleshooting + +### Email Not Sending + +**Problem:** Welcome emails are not being sent + +**Solutions:** +- Check that the feature is enabled in setup +- Verify the customer has an email address +- Confirm your email account is configured correctly +- Check that email service is running + +### Wrong Email Template + +**Problem:** Customers receive the wrong email content + +**Solutions:** +- Review the email template configuration +- Ensure you're editing the correct template +- Clear any cached templates + +### Customer Not Receiving Email + +**Problem:** Email shows as sent but customer didn't receive it + +**Solutions:** +- Ask customer to check spam folder +- Verify the email address is correct +- Check email delivery logs +- Test with a different email address + +## Tips and Best Practices + +- **Personalization**: Use customer name and company name in the email +- **Timing**: Send welcome emails within 24 hours of customer creation +- **Follow-up**: Consider a follow-up email series +- **Feedback**: Ask customers if they received and found the email helpful + +## Need Help? + +Contact your Business Central administrator or support team for assistance. +``` + +## Review Points + +After generating documentation, verify: + +### ✅ Accuracy +- [ ] Documentation matches actual code behavior +- [ ] Parameter descriptions are correct +- [ ] Return values accurately described +- [ ] Examples work as shown + +### ✅ Completeness +- [ ] All public procedures documented +- [ ] All parameters explained +- [ ] Edge cases mentioned +- [ ] Error conditions documented + +### ✅ Clarity +- [ ] Easy to understand +- [ ] Appropriate level of detail +- [ ] Good examples provided +- [ ] Proper formatting + +### ✅ Maintenance +- [ ] Easy to update +- [ ] Versioned appropriately +- [ ] Consistent style +- [ ] Well organized + +## Advanced Documentation Prompts + +### Generate CHANGELOG +``` +Create a CHANGELOG.md file documenting these changes from version 1.0 to 2.0: +- Added: Customer portal access +- Added: Newsletter preferences +- Changed: Welcome email now includes portal link +- Fixed: Email encoding issues with special characters +- Deprecated: Old email API (will be removed in 3.0) + +Follow Keep a Changelog format. +``` + +### Create Migration Guide +``` +Create a migration guide for users upgrading from version 1.x to 2.0. +Include: +- Breaking changes +- New features +- Configuration changes needed +- Data migration steps +- Deprecation warnings +``` + +### Generate Inline Code Comments +``` +Add helpful inline comments to this complex procedure explaining the logic flow. +Don't over-comment obvious code, but do explain: +- Complex algorithms +- Business rule implementations +- Non-obvious optimizations +- Workarounds + +[Paste code] +``` + +## Keeping Documentation Updated + +### When Code Changes +**Prompt**: +``` +I've updated this procedure to add a new parameter. +Update the XML documentation to reflect the change: + +Old procedure: +[paste old code] + +New procedure: +[paste new code] +``` + +### Regular Documentation Reviews +**Prompt**: +``` +Review the documentation for this codeunit. +Check for: +- Outdated information +- Missing documentation +- Incorrect examples +- Deprecated features + +[Paste codeunit] +``` + +## Best Practices + +### 1. Document As You Code +``` +I'm about to write a procedure to validate customer credit limits. +Create the XML documentation comment first, then we'll implement the procedure. +``` + +### 2. Use Consistent Style +Create a documentation template: +``` +Create an XML documentation template I can use for all my procedures. +Include sections for: summary, parameters, returns, exceptions, examples, and remarks. +``` + +### 3. Generate Documentation in Batches +Document related code together for consistency: +``` +Document all procedures in this codeunit that relate to email sending. +Use consistent terminology and structure. +``` + +### 4. Include Real Examples +``` +Add a realistic code example to this procedure's documentation showing: +- Typical usage +- Error handling +- Integration with other features +``` + +## Common Documentation Patterns + +### For Validation Procedures +``` +Document this validation procedure. Include: +- What is being validated +- Valid conditions +- Error messages that can be raised +- Example of valid and invalid inputs +``` + +### For Event Subscribers +``` +Document this event subscriber. Include: +- What event it subscribes to +- When it triggers +- What it does +- Side effects or implications +- Integration points +``` + +### For APIs +``` +Create REST API documentation for this AL API page. +Include: +- Endpoint URL +- HTTP methods supported +- Request/response examples +- Authentication requirements +- Error codes +``` + +## Practice Exercise + +Generate documentation for this code: + +```al +codeunit 50110 "Order Status Manager" +{ + procedure UpdateOrderStatus(OrderNo: Code[20]; NewStatus: Enum "Order Status"): Boolean + var + SalesHeader: Record "Sales Header"; + begin + if not SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo) then + exit(false); + + SalesHeader.Status := NewStatus; + SalesHeader.Modify(true); + SendStatusNotification(OrderNo, NewStatus); + exit(true); + end; + + local procedure SendStatusNotification(OrderNo: Code[20]; Status: Enum "Order Status") + begin + // Implementation + end; +} +``` + +**Your Tasks**: +1. Generate XML documentation +2. Create a README section explaining this feature +3. Write API documentation +4. Create user documentation +5. Review and improve the generated docs + +## Next Steps + +- Learn how to use AI for [adding telemetry](../telemetry) +- Explore [refactoring legacy code](../refactoring) while maintaining documentation +- See how to conduct [AI-assisted code reviews](../code-review) diff --git a/content/docs/agentic-coding/GettingMore/telemetry.md b/content/docs/agentic-coding/GettingMore/telemetry.md new file mode 100644 index 00000000..c4d0c696 --- /dev/null +++ b/content/docs/agentic-coding/GettingMore/telemetry.md @@ -0,0 +1,599 @@ +--- +title: "Adding Telemetry" +linkTitle: "Telemetry" +weight: 3 +description: > + Use AI to instrument your AL extensions with Application Insights telemetry +--- + +## Scenario + +You have a Business Central extension that's running in production, but you have limited visibility into: +- How often features are used +- Where errors occur +- Performance bottlenecks +- User behavior patterns + +You want to add comprehensive telemetry using Application Insights to monitor your extension in production. + +## Goal + +Use AI to help you: +- Add telemetry calls throughout your code +- Log important events and errors +- Track feature usage +- Monitor performance +- Create custom dimensions for better analysis + +## Prerequisites + +Understanding of: +- Business Central telemetry concepts +- Application Insights basics +- When to log (without over-logging) +- Data classification requirements + +## Step-by-Step Guide + +### Step 1: Understanding Your Code + +**Starting Code** (without telemetry): +```al +codeunit 50100 "Sales Order Processor" +{ + procedure ProcessOrder(var SalesHeader: Record "Sales Header"): Boolean + var + SalesLine: Record "Sales Line"; + begin + if not ValidateOrder(SalesHeader) then + exit(false); + + CalculateTotals(SalesHeader); + ApplyDiscounts(SalesHeader); + + if not PostOrder(SalesHeader) then + exit(false); + + exit(true); + end; + + local procedure ValidateOrder(var SalesHeader: Record "Sales Header"): Boolean + var + Customer: Record Customer; + begin + if not Customer.Get(SalesHeader."Sell-to Customer No.") then begin + Error('Customer %1 does not exist.', SalesHeader."Sell-to Customer No."); + end; + + if Customer.Blocked <> Customer.Blocked::" " then begin + Error('Customer %1 is blocked.', Customer."No."); + end; + + exit(true); + end; + + local procedure PostOrder(var SalesHeader: Record "Sales Header"): Boolean + var + SalesPost: Codeunit "Sales-Post"; + begin + exit(SalesPost.Run(SalesHeader)); + end; +} +``` + +### Step 2: Request Telemetry Strategy + +**Prompt**: +``` +I want to add Application Insights telemetry to this Business Central codeunit. + +Help me plan what to log: +- What events should be logged? +- What custom dimensions should be included? +- What data classification is appropriate? +- Where should we log errors vs. information? + +[Paste the code above] +``` + +**Expected AI Response**: +The AI should suggest logging: + +**Events to Log:** +1. Order processing started (Informational) +2. Order validation completed (Informational) +3. Order posted successfully (Informational) +4. Validation failures (Warning) +5. Posting failures (Error) +6. Performance metrics (Informational) + +**Custom Dimensions:** +- Order Number +- Customer Number +- Order Amount +- Number of Lines +- Processing Duration +- Error Details (when applicable) + +**Data Classification:** +- Order Number: CustomerContent +- Customer Number: CustomerContent +- Amounts: CustomerContent +- Counts: SystemMetadata +- Duration: SystemMetadata + +### Step 3: Add Telemetry to Main Procedure + +**Prompt**: +``` +Add Application Insights telemetry to the ProcessOrder procedure. + +Include: +- Start event when processing begins +- Success event when complete +- Error event on failure +- Custom dimensions: OrderNo, CustomerNo, TotalAmount, LineCount, Duration +- Use appropriate data classification +- Use the Telemetry codeunit from System Application + +Update this code: +[Paste ProcessOrder procedure] +``` + +**Expected Result**: +```al +procedure ProcessOrder(var SalesHeader: Record "Sales Header"): Boolean +var + Telemetry: Codeunit Telemetry; + CustomDimensions: Dictionary of [Text, Text]; + StartTime: DateTime; + Duration: Duration; + LineCount: Integer; +begin + StartTime := CurrentDateTime; + + // Log start of processing + AddOrderDimensions(CustomDimensions, SalesHeader); + Telemetry.LogMessage('SALESORD-001', 'Order processing started', + Verbosity::Normal, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + + if not ValidateOrder(SalesHeader) then begin + LogProcessingError(SalesHeader, 'Validation failed'); + exit(false); + end; + + CalculateTotals(SalesHeader); + ApplyDiscounts(SalesHeader); + + if not PostOrder(SalesHeader) then begin + LogProcessingError(SalesHeader, 'Posting failed'); + exit(false); + end; + + // Log successful completion + Duration := CurrentDateTime - StartTime; + Clear(CustomDimensions); + AddOrderDimensions(CustomDimensions, SalesHeader); + CustomDimensions.Add('Duration', Format(Duration)); + CustomDimensions.Add('LineCount', Format(CountLines(SalesHeader))); + + Telemetry.LogMessage('SALESORD-002', 'Order processing completed successfully', + Verbosity::Normal, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + + exit(true); +end; + +local procedure AddOrderDimensions(var CustomDimensions: Dictionary of [Text, Text]; SalesHeader: Record "Sales Header") +begin + CustomDimensions.Add('OrderNo', SalesHeader."No."); + CustomDimensions.Add('CustomerNo', SalesHeader."Sell-to Customer No."); + CustomDimensions.Add('OrderType', Format(SalesHeader."Document Type")); +end; + +local procedure LogProcessingError(SalesHeader: Record "Sales Header"; ErrorMessage: Text) +var + Telemetry: Codeunit Telemetry; + CustomDimensions: Dictionary of [Text, Text]; +begin + AddOrderDimensions(CustomDimensions, SalesHeader); + CustomDimensions.Add('ErrorMessage', ErrorMessage); + CustomDimensions.Add('ErrorCallStack', GetLastErrorCallStack()); + + Telemetry.LogMessage('SALESORD-E001', StrSubstNo('Order processing failed: %1', ErrorMessage), + Verbosity::Error, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); +end; + +local procedure CountLines(SalesHeader: Record "Sales Header"): Integer +var + SalesLine: Record "Sales Line"; +begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + exit(SalesLine.Count); +end; +``` + +### Step 4: Add Error Tracking + +**Prompt**: +``` +Update the ValidateOrder procedure to log validation failures with telemetry. + +For each validation check that fails: +- Log a warning message +- Include relevant details (customer number, block reason, etc.) +- Use appropriate custom dimensions +- Use proper data classification + +[Paste ValidateOrder procedure] +``` + +**Expected Result**: +```al +local procedure ValidateOrder(var SalesHeader: Record "Sales Header"): Boolean +var + Customer: Record Customer; + Telemetry: Codeunit Telemetry; + CustomDimensions: Dictionary of [Text, Text]; +begin + if not Customer.Get(SalesHeader."Sell-to Customer No.") then begin + AddValidationDimensions(CustomDimensions, SalesHeader, 'Customer not found'); + Telemetry.LogMessage('SALESORD-W001', 'Order validation failed: Customer not found', + Verbosity::Warning, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + + Error('Customer %1 does not exist.', SalesHeader."Sell-to Customer No."); + end; + + if Customer.Blocked <> Customer.Blocked::" " then begin + Clear(CustomDimensions); + AddValidationDimensions(CustomDimensions, SalesHeader, 'Customer blocked'); + CustomDimensions.Add('BlockedReason', Format(Customer.Blocked)); + + Telemetry.LogMessage('SALESORD-W002', 'Order validation failed: Customer blocked', + Verbosity::Warning, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + + Error('Customer %1 is blocked.', Customer."No."); + end; + + exit(true); +end; + +local procedure AddValidationDimensions(var CustomDimensions: Dictionary of [Text, Text]; SalesHeader: Record "Sales Header"; Reason: Text) +begin + CustomDimensions.Add('OrderNo', SalesHeader."No."); + CustomDimensions.Add('CustomerNo', SalesHeader."Sell-to Customer No."); + CustomDimensions.Add('ValidationFailure', Reason); +end; +``` + +### Step 5: Add Performance Tracking + +**Prompt**: +``` +Add performance telemetry to track how long different operations take. + +Track duration for: +- Overall processing +- Validation +- Calculation +- Posting + +Log if any operation takes longer than expected thresholds: +- Validation > 1 second +- Calculation > 2 seconds +- Posting > 5 seconds + +[Include the codeunit] +``` + +**Expected Result**: +```al +local procedure ValidateOrder(var SalesHeader: Record "Sales Header"): Boolean +var + Customer: Record Customer; + Telemetry: Codeunit Telemetry; + CustomDimensions: Dictionary of [Text, Text]; + StartTime: DateTime; + Duration: Duration; +begin + StartTime := CurrentDateTime; + + // Validation logic here... + + Duration := CurrentDateTime - StartTime; + + // Log if validation took too long + if Duration > 1000 then begin + AddOrderDimensions(CustomDimensions, SalesHeader); + CustomDimensions.Add('Duration', Format(Duration)); + CustomDimensions.Add('Operation', 'Validation'); + + Telemetry.LogMessage('SALESORD-P001', 'Slow validation detected', + Verbosity::Warning, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + end; + + exit(true); +end; +``` + +### Step 6: Add Feature Usage Tracking + +**Prompt**: +``` +Add telemetry to track feature usage for business analytics. + +Track: +- How often each discount type is applied +- Which payment methods are used +- Popular shipping methods +- Order size distribution + +Create a FeatureUsageTelemetry codeunit for this purpose. +``` + +**Expected Result**: +```al +codeunit 50101 "Feature Usage Telemetry" +{ + var + Telemetry: Codeunit Telemetry; + + procedure LogDiscountApplied(DiscountType: Text; DiscountPct: Decimal; OrderNo: Code[20]) + var + CustomDimensions: Dictionary of [Text, Text]; + begin + CustomDimensions.Add('FeatureArea', 'Discounts'); + CustomDimensions.Add('DiscountType', DiscountType); + CustomDimensions.Add('DiscountPercentage', Format(DiscountPct)); + CustomDimensions.Add('OrderNo', OrderNo); + + Telemetry.LogMessage('FEATURE-DISCOUNT', 'Discount applied', + Verbosity::Normal, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + end; + + procedure LogPaymentMethod(PaymentMethodCode: Code[10]; Amount: Decimal) + var + CustomDimensions: Dictionary of [Text, Text]; + begin + CustomDimensions.Add('FeatureArea', 'Payment'); + CustomDimensions.Add('PaymentMethod', PaymentMethodCode); + CustomDimensions.Add('AmountRange', GetAmountRange(Amount)); + + Telemetry.LogMessage('FEATURE-PAYMENT', 'Payment method used', + Verbosity::Normal, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + end; + + local procedure GetAmountRange(Amount: Decimal): Text + begin + case true of + Amount < 100: + exit('0-100'); + Amount < 1000: + exit('100-1000'); + Amount < 10000: + exit('1000-10000'); + else + exit('10000+'); + end; + end; +} +``` + +## Telemetry Best Practices + +### ✅ Do's + +**Use Consistent Event IDs** +``` +SALESORD-001: Processing started +SALESORD-002: Processing completed +SALESORD-E001: Processing error +SALESORD-W001: Validation warning +SALESORD-P001: Performance warning +``` + +**Use Meaningful Messages** +```al +// Good +Telemetry.LogMessage('SALESORD-001', 'Sales order processing started for large order', ...); + +// Bad +Telemetry.LogMessage('001', 'Started', ...); +``` + +**Include Helpful Custom Dimensions** +```al +CustomDimensions.Add('OrderNo', OrderNo); +CustomDimensions.Add('CustomerNo', CustomerNo); +CustomDimensions.Add('LineCount', Format(LineCount)); +CustomDimensions.Add('TotalAmount', Format(TotalAmount)); +CustomDimensions.Add('ProcessingDuration', Format(Duration)); +``` + +**Use Appropriate Data Classification** +```al +// Customer data +DataClassification::CustomerContent + +// System metrics +DataClassification::SystemMetadata + +// Organizational data +DataClassification::OrganizationIdentifiableInformation +``` + +### ❌ Don'ts + +**Don't Over-Log** +```al +// Too much logging +Telemetry.LogMessage('001', 'Line 1', ...); +Telemetry.LogMessage('002', 'Line 2', ...); +// Don't log every single step +``` + +**Don't Log Sensitive Data** +```al +// Bad - logging password +CustomDimensions.Add('Password', Password); + +// Bad - logging full credit card +CustomDimensions.Add('CreditCard', CreditCardNo); + +// Bad - logging personal data unnecessarily +CustomDimensions.Add('SSN', SSN); +``` + +**Don't Use Generic Messages** +```al +// Bad +Telemetry.LogMessage('001', 'Error', ...); + +// Good +Telemetry.LogMessage('SALESORD-E001', 'Failed to post sales order due to credit limit exceeded', ...); +``` + +## Advanced Telemetry Patterns + +### Pattern 1: Telemetry Wrapper +**Prompt**: +``` +Create a telemetry wrapper codeunit that simplifies logging for my extension. +Include helper methods for: +- LogStart/LogEnd (with automatic duration calculation) +- LogError (with automatic call stack) +- LogFeatureUsage +- LogPerformanceWarning + +Prefix all event IDs with my extension prefix "SALESEXT-" +``` + +### Pattern 2: Telemetry Constants +**Prompt**: +``` +Create a codeunit with constants for all my telemetry event IDs and messages. +This will ensure consistency and make it easier to update messages. +``` + +### Pattern 3: Contextual Telemetry +**Prompt**: +``` +Create a system that automatically adds common context to all telemetry: +- User ID (anonymized) +- Company name (anonymized) +- Extension version +- BC version +- Environment type (Production/Sandbox) + +Make this context added automatically to all telemetry calls. +``` + +## Monitoring and Analysis + +### Creating Useful Queries + +**Prompt**: +``` +Create KQL (Kusto Query Language) queries for Application Insights to analyze: + +1. Most common errors in the last 24 hours +2. Average processing duration by order size +3. Feature usage statistics +4. Performance trends over time +5. Error rate percentage + +Base the queries on the telemetry we added to the Sales Order Processor codeunit. +``` + +**Expected Result**: +```kql +// Most common errors in last 24 hours +traces +| where timestamp > ago(24h) +| where message startswith "SALESORD-E" +| summarize ErrorCount = count() by message, customDimensions.ErrorMessage +| order by ErrorCount desc +| take 10 + +// Average processing duration by line count +traces +| where message == "SALESORD-002" +| extend LineCount = toint(customDimensions.LineCount) +| extend Duration = toint(customDimensions.Duration) +| summarize AvgDuration = avg(Duration) by LineCountBucket = bin(LineCount, 5) +| order by LineCountBucket asc + +// Feature usage - discount types +traces +| where message == "FEATURE-DISCOUNT" +| summarize UsageCount = count() by DiscountType = tostring(customDimensions.DiscountType) +| order by UsageCount desc + +// Performance warnings +traces +| where message startswith "SALESORD-P" +| summarize WarningCount = count() by Operation = tostring(customDimensions.Operation), bin(timestamp, 1h) +| render timechart + +// Error rate percentage +let totalOrders = toscalar( + traces + | where message == "SALESORD-001" + | where timestamp > ago(24h) + | count +); +let failedOrders = toscalar( + traces + | where message startswith "SALESORD-E" + | where timestamp > ago(24h) + | count +); +print ErrorRate = (todouble(failedOrders) / todouble(totalOrders)) * 100 +``` + +## Practice Exercise + +Add comprehensive telemetry to this code: + +```al +codeunit 50200 "Inventory Adjustment Handler" +{ + procedure AdjustInventory(ItemNo: Code[20]; Quantity: Decimal; ReasonCode: Code[10]) + var + Item: Record Item; + ItemJnlLine: Record "Item Journal Line"; + begin + Item.Get(ItemNo); + + ItemJnlLine.Init(); + ItemJnlLine."Item No." := ItemNo; + ItemJnlLine.Quantity := Quantity; + ItemJnlLine."Reason Code" := ReasonCode; + ItemJnlLine.Insert(true); + + CODEUNIT.Run(CODEUNIT::"Item Jnl.-Post Line", ItemJnlLine); + end; +} +``` + +**Your Tasks**: +1. Add start/end telemetry +2. Add error handling and logging +3. Track performance +4. Log feature usage +5. Add appropriate custom dimensions +6. Create KQL queries for analysis + +## Next Steps + +- Learn about [refactoring legacy code](../refactoring) while adding telemetry +- See how [code review](../code-review) can catch telemetry issues +- Explore [testing strategies](../testing) for telemetry code diff --git a/content/docs/agentic-coding/GettingStarted/_index.md b/content/docs/agentic-coding/GettingStarted/_index.md new file mode 100644 index 00000000..2d092a76 --- /dev/null +++ b/content/docs/agentic-coding/GettingStarted/_index.md @@ -0,0 +1,20 @@ +--- +title: "Getting Started" +linkTitle: "Getting Started" +weight: 10 +description: > + Essential concepts and practices for working with AI coding assistants +--- + +This section covers the fundamentals you need to start working effectively with AI-powered coding assistants in your AL development workflow. + +## In This Section + +- **[What is Agentic Coding](what-is-agentic-coding)** - Understanding the core concepts and benefits +- **[Glossary](glossary)** - Common terms and concepts explained +- **[Setting Up Your Environment](setup)** - Configure your development environment for AI assistance +- **[Effective Prompting](effective-prompting)** - Learn how to communicate clearly with AI assistants +- **[Best Practices](best-practices)** - Guidelines for successful AI-assisted development +- **[Understanding Limitations](limitations)** - Know when to use (and not use) AI assistance + +Start with understanding the concepts, then move through the practical setup and techniques to get the most value from your AI coding assistant. diff --git a/content/docs/agentic-coding/GettingStarted/best-practices.md b/content/docs/agentic-coding/GettingStarted/best-practices.md new file mode 100644 index 00000000..af52ca2b --- /dev/null +++ b/content/docs/agentic-coding/GettingStarted/best-practices.md @@ -0,0 +1,415 @@ +--- +title: "Best Practices" +linkTitle: "Best Practices" +weight: 4 +description: > + Guidelines for successful AI-assisted AL development +--- + +## Overview + +AI coding assistants are powerful tools, but they work best when used thoughtfully. This guide provides best practices for integrating AI assistance into your AL development workflow. + +## General Principles + +### 1. AI Augments, Not Replaces +**You are still the developer.** The AI is a tool to enhance your productivity, not a replacement for your expertise. + +✅ **Good Approach**: +- Use AI to generate boilerplate code +- Review and understand all generated code +- Make architectural decisions yourself +- Validate business logic + +❌ **Poor Approach**: +- Blindly accept all AI suggestions +- Skip code review for AI-generated code +- Let AI make design decisions +- Assume AI understands your business requirements + +### 2. Trust, but Verify +Always review AI-generated code: + +```al +// AI might generate this: +procedure CalculateDiscount(Amount: Decimal): Decimal +begin + exit(Amount * 0.1); // Always 10% discount +end; + +// But you need to verify it matches requirements: +// - Is 10% correct for all scenarios? +// - Should it vary by customer type? +// - Are there discount limits? +// - Should it read from setup? +``` + +### 3. Provide Good Context +Better context = better results: + +✅ **Provide**: +- Clear file and folder names +- XML documentation comments +- Descriptive variable names +- Project README with conventions +- Open related files + +❌ **Avoid**: +- Generic names like `Temp1`, `DoStuff` +- Undocumented complex logic +- Mixing unrelated code in one file + +## Code Generation Best Practices + +### Start with Structure +Generate scaffolding first, then refine: + +1. **First**: Generate basic structure +``` +Create a codeunit skeleton for "Sales Order Processor" with procedures for: +- ValidateOrder +- CalculateTotals +- ProcessPayment +- PostOrder +``` + +2. **Then**: Implement each procedure +``` +Implement the ValidateOrder procedure with these checks: +- Customer exists +- All lines have positive quantities +- Credit limit not exceeded +``` + +### Review Generated Code +Check AI-generated code for: + +**Correctness** +- Does it do what you asked? +- Are there edge cases not handled? +- Is the logic sound? + +**AL Best Practices** +- Proper error handling +- Appropriate use of transactions +- Correct field validations +- No unnecessary database calls + +**Business Central Standards** +- Correct use of BC APIs +- Proper event patterns +- Standard naming conventions +- Application area settings + +**Performance** +- Efficient database queries +- Appropriate filtering +- Minimal record iterations +- Proper use of FindSet vs FindFirst + +### Iterate and Refine +Don't expect perfection on first try: + +``` +// Initial prompt +Create a procedure to import customers from CSV + +// After reviewing generated code +Add validation for required fields: Name and Email + +// After further review +Add error logging and return a list of failed imports + +// Final refinement +Add telemetry tracking for import metrics +``` + +## Code Review with AI + +### Use AI for Initial Review +AI can catch common issues: + +``` +Review this code for: +- Potential bugs +- Performance issues +- AL best practice violations +- Missing error handling +``` + +### Don't Skip Human Review +AI review is a supplement, not a replacement: + +- **AI catches**: Syntax issues, common patterns, style violations +- **You catch**: Business logic errors, architectural concerns, context-specific issues + +### Review AI's Review +The AI might miss context: + +```al +// AI might flag this as inefficient: +Customer.SetRange("No.", CustNo); +if Customer.FindFirst() then + Customer.Name := NewName; + +// But might miss that in your context, you're in a loop +// processing thousands of customers, which is inefficient +``` + +## Documentation with AI + +### Generate Drafts, Then Personalize +Use AI for documentation drafts: + +``` +Generate XML documentation for this codeunit +``` + +Then review and enhance: +- Add business context +- Include usage examples +- Document assumptions +- Note dependencies + +### Keep Documentation Updated +When AI generates code changes: + +``` +Update this procedure and its XML documentation to include the new parameter +``` + +### Create User-Facing Documentation +AI can help with user docs too: + +``` +Create user documentation explaining how to set up customer discount categories. +Target audience: Business users, not developers. +``` + +## Testing with AI + +### Generate Test Scaffolding +``` +Create a test codeunit structure for testing the Sales Order Processor +Include test methods for each public procedure +``` + +### Create Test Data Setup +``` +Create a helper procedure that sets up test data: +- One customer with normal credit limit +- One customer with exceeded credit +- Sample items with prices +- Sales header with lines +``` + +### Don't Rely Only on AI Tests +AI-generated tests might miss: +- Edge cases specific to your business +- Integration scenarios +- Performance testing needs +- User acceptance criteria + +## Refactoring with AI + +### Safe Refactoring Steps + +1. **Ensure Tests Exist** +``` +Create tests for this procedure before we refactor it +``` + +2. **Refactor with AI** +``` +Refactor this procedure to extract the discount calculation into a separate function +``` + +3. **Verify Tests Still Pass** +Run your test suite to confirm behavior unchanged + +4. **Review Changes** +Understand what changed and why + +### When to Refactor with AI +✅ **Good for**: +- Extracting methods +- Renaming variables +- Applying consistent formatting +- Adding error handling +- Modernizing deprecated APIs + +❌ **Be Careful with**: +- Complex business logic changes +- Architectural changes +- Database schema modifications +- Integration point changes + +## Learning from AI + +### Use AI as a Learning Tool + +**Ask for Explanations**: +``` +Explain why this code uses Commit instead of direct posting +``` + +**Request Alternatives**: +``` +Show me three different ways to implement this validation, +with pros and cons of each +``` + +**Learn Patterns**: +``` +Show me the standard AL pattern for implementing a document posting routine +``` + +### Build Your Knowledge +Don't become dependent: +- Understand the code, don't just use it +- Learn the patterns being used +- Research unfamiliar APIs or techniques +- Practice writing code without AI assistance + +## Performance Considerations + +### AI and Code Performance +AI doesn't automatically write optimal code: + +```al +// AI might generate this: +for i := 1 to Customer.Count do begin + Customer.Get(i); + ProcessCustomer(Customer); +end; + +// You should refactor to: +if Customer.FindSet() then + repeat + ProcessCustomer(Customer); + until Customer.Next() = 0; +``` + +### Review for Performance +Always check AI-generated code for: +- Database query efficiency +- Unnecessary loops +- Proper use of filters +- Appropriate use of temporary tables + +## Security Considerations + +### Don't Share Sensitive Data +Be careful what's in your workspace: +- Production connection strings +- Customer data +- API keys or secrets +- Proprietary algorithms + +### Review Security Aspects +AI might not catch security issues: + +```al +// AI might generate this: +procedure ExecuteSQL(SQLStatement: Text) +begin + // Direct SQL execution - potential SQL injection! +end; + +// You need to catch security concerns +``` + +## Collaboration Best Practices + +### Team Standards +Establish team guidelines: +- When to use AI assistance +- Required review process for AI code +- Documentation requirements +- Testing standards + +### Code Review Process +For AI-generated code: +1. Mark commits that include AI-generated code +2. Extra scrutiny during review +3. Explain AI usage in PR descriptions +4. Share learnings with the team + +### Knowledge Sharing +Help your team: +- Share effective prompts +- Document successful patterns +- Discuss AI limitations found +- Teach AI-assisted techniques + +## When NOT to Use AI + +### AI is Not Ideal For: + +**Critical Security Code** +- Authentication and authorization +- Encryption implementations +- Security-sensitive validations + +**Highly Specialized Logic** +- Unique business rules requiring deep domain knowledge +- Complex calculations with many edge cases +- Industry-specific compliance requirements + +**Exploration and Learning** +- When you're trying to learn a new concept +- When you need to deeply understand the solution +- When the journey is as important as the destination + +**Quick, Simple Tasks** +- You can type it faster than explaining it +- It's simpler to do it yourself +- The prompt would be longer than the code + +## Measuring Success + +### Track Your Productivity +Monitor how AI affects your work: +- Time saved on boilerplate code +- Reduction in syntax errors +- Faster documentation creation +- More time for design and testing + +### Quality Metrics +Ensure quality isn't suffering: +- Bug rates in AI-assisted code +- Code review findings +- Test coverage +- Performance benchmarks + +### Continuous Improvement +- Refine your prompting skills +- Learn from unsuccessful attempts +- Share successes with your team +- Update your practices as AI tools evolve + +## Quick Reference: Do's and Don'ts + +### ✅ Do +- Review all AI-generated code +- Provide clear, specific prompts +- Use AI for boilerplate and repetitive tasks +- Learn from AI-generated examples +- Test AI-generated code thoroughly +- Keep documentation updated +- Share knowledge with your team + +### ❌ Don't +- Blindly accept AI suggestions +- Skip code review for AI code +- Include sensitive data in prompts +- Rely on AI for architectural decisions +- Use AI-generated code you don't understand +- Assume AI knows your business requirements +- Let AI replace your expertise + +## Next Steps + +- Understand [AI limitations](../limitations) to know when caution is needed +- Try the [practical examples](../../getting-more) to apply these best practices +- Explore [community resources](../../community-resources) for more tips and techniques diff --git a/content/docs/agentic-coding/GettingStarted/effective-prompting.md b/content/docs/agentic-coding/GettingStarted/effective-prompting.md new file mode 100644 index 00000000..390ba36d --- /dev/null +++ b/content/docs/agentic-coding/GettingStarted/effective-prompting.md @@ -0,0 +1,358 @@ +--- +title: "Effective Prompting" +linkTitle: "Effective Prompting" +weight: 3 +description: > + Learn how to communicate clearly with AI assistants to get the best results +--- + +## Overview + +The quality of AI-generated code depends heavily on how you communicate your needs. This guide teaches you how to write effective prompts that lead to better results. + +## The Basics of Good Prompts + +### Be Specific +Vague prompts lead to generic results. Provide clear, specific instructions. + +❌ **Vague**: "Create a page" +``` +Create a page +``` + +✅ **Specific**: "Create a card page for Customer with fields No, Name, Address, and Phone Number" +``` +Create a card page for the Customer table that displays these fields: +- No. +- Name +- Address +- Phone No. +Include FactBoxes for Sales Statistics and Contact Information. +``` + +### Provide Context +Help the AI understand what you're working on. + +❌ **No Context**: "Add a field" +``` +Add a field to store email +``` + +✅ **With Context**: "Add an email field to the Customer table extension for newsletter subscriptions" +``` +I'm extending the Customer table. Add a new field called "Newsletter Email" to store +the email address customers want to use for newsletters. This is separate from their +primary email. Make it a Text field with length 80. +``` + +### Include Examples +Show the AI what you want by providing examples. + +✅ **With Example**: +``` +Create an event subscriber for OnAfterValidate on Sales Header's "Sell-to Customer No." +field, similar to this pattern: + +[EventSubscriber(ObjectType::Table, Database::"Sales Header", 'OnAfterValidateEvent', 'Sell-to Customer No.', false, false)] +local procedure OnAfterValidateSellToCustomerNo(var Rec: Record "Sales Header") +begin + // Your implementation here +end; + +The subscriber should copy the Newsletter Email from the Customer to the Sales Header. +``` + +## Prompting Patterns for AL Development + +### 1. Code Generation + +**Pattern**: `Create a [object type] that [does what] with [specific requirements]` + +**Example**: +``` +Create a codeunit named "Sales Order Validator" that validates sales orders before posting. +It should: +- Check that all lines have quantities > 0 +- Verify customer credit limit is not exceeded +- Ensure all required fields are filled +- Return a list of validation errors +Use AL coding best practices. +``` + +### 2. Code Explanation + +**Pattern**: `Explain [what] in [level of detail]` + +**Examples**: +``` +// Simple explanation +Explain what this function does + +// Detailed explanation +Explain this procedure in detail, including the purpose of each parameter +and the business logic flow + +// For learning +Explain this code as if I'm new to AL development +``` + +### 3. Code Improvement + +**Pattern**: `Improve this code by [what to improve]` + +**Examples**: +``` +Improve this code to follow AL best practices + +Refactor this procedure to be more performant + +Add error handling to this code + +Make this code more testable by reducing dependencies +``` + +### 4. Code Review + +**Pattern**: `Review this code for [specific concerns]` + +**Examples**: +``` +Review this code for potential bugs and performance issues + +Check this code against AL coding guidelines + +Identify security concerns in this procedure + +Find opportunities to reduce database calls in this code +``` + +### 5. Documentation + +**Pattern**: `Generate [documentation type] for [what]` + +**Examples**: +``` +Generate XML documentation comments for all procedures in this file + +Create a README explaining what this extension does and how to install it + +Write user documentation for this new feature +``` + +### 6. Testing + +**Pattern**: `Create tests for [what] that [test scenarios]` + +**Example**: +``` +Create test codeunit for the Sales Order Validator that tests: +- Valid orders pass validation +- Orders with zero quantities fail +- Orders exceeding credit limit fail +- All validation error messages are correct +Use the AL Test framework with Given-When-Then pattern. +``` + +## Advanced Prompting Techniques + +### Chain of Thought +Break complex requests into steps: + +``` +I need to create a new feature for automatic discount calculation. Let's approach this step by step: + +1. First, create a table extension for Sales Line to store discount category +2. Then, create a discount setup table with categories and percentages +3. Next, create a codeunit to calculate discounts based on category +4. Finally, add an event subscriber to apply discounts automatically + +Let's start with step 1... +``` + +### Constraints and Requirements +Be explicit about what you do and don't want: + +``` +Create a procedure to import customer data from CSV. +Requirements: +- Use streams for large file handling +- Validate email format before importing +- Skip duplicate records (based on external ID) +- Log errors but continue processing +- Return summary of imported, skipped, and failed records +Do NOT: +- Use temporary files +- Import if any record fails validation +- Modify existing customer records +``` + +### Reference Standards +Point to specific coding standards or patterns: + +``` +Create a page extension following the AL coding standards in this repository. +Use the same XML documentation pattern as in CustomerProcessor.codeunit.al. +Follow the naming conventions in our README.md. +``` + +### Iterative Refinement +Start broad, then refine: + +``` +// First prompt +Create a codeunit to process sales orders + +// After seeing initial result, refine +Add error handling using try-catch pattern + +// Further refinement +Add logging using AL telemetry + +// Final touch +Add XML documentation comments +``` + +## AL-Specific Prompting Tips + +### Specify AL Version +``` +Create an AL procedure compatible with Business Central version 21 +``` + +### Mention Dependencies +``` +Create a page that uses the "Temp Blob" codeunit from the System Application +``` + +### Include Object Numbers (if applicable) +``` +Create table 50100 "Custom Discount Setup" with fields... +``` + +### Specify Application Area +``` +Create a page with ApplicationArea set to #Basic,#Suite +``` + +### Reference Standard BC Objects +``` +Create a table extension for table 18 "Customer" that adds... +``` + +## Common Mistakes to Avoid + +### ❌ Too Vague +``` +Make it better +Fix this +Create something for customers +``` + +### ❌ Asking Multiple Unrelated Things +``` +Create a customer page, fix the sales order bug, and document the project +``` +*Better*: Break into separate prompts + +### ❌ Assuming Too Much Context +``` +Add the field we discussed +``` +*Better*: Restate what you need + +### ❌ No Validation Criteria +``` +Create a validation function +``` +*Better*: Specify what to validate and how + +## Examples of Great Prompts + +### Example 1: Table Extension +``` +Create a table extension for Table 36 "Sales Header" that adds these fields: +- "Requested Delivery Date" (Date) +- "Special Instructions" (Text[250]) +- "Requires Approval" (Boolean) + +Add triggers: +- Set "Requires Approval" to true when amount exceeds $10,000 +- Validate "Requested Delivery Date" is not in the past + +Include XML documentation for all fields. +``` + +### Example 2: API Page +``` +Create an API page for the Item table that exposes: +- No. +- Description +- Unit Price +- Inventory + +Follow AL API best practices: +- Use API versioning (v1.0) +- Include OData annotations +- Handle GET, POST, PATCH methods +- Validate required fields on POST +``` + +### Example 3: Test Code +``` +Create a test codeunit for the "Sales Order Validator" codeunit. +Tests needed: +1. TestValidOrderPassesValidation - Create valid order, verify no errors +2. TestZeroQuantityFails - Create order with 0 quantity, verify error +3. TestCreditLimitExceeded - Create order exceeding limit, verify error +4. TestMissingRequiredField - Skip required field, verify error + +Use: +- [Test] attribute +- Given-When-Then pattern +- LibrarySales for test data +- Assert for verification +``` + +## Practice Exercise + +Try improving this vague prompt: + +❌ **Vague**: +``` +Create code for discounts +``` + +✅ **Improved Version** (your attempt): +``` +[Think about: What type of code? What discounts? What should it do? +What are the requirements? What standards should it follow?] +``` + +
+See Suggested Answer + +``` +Create a codeunit "Customer Discount Manager" that calculates volume-based discounts. + +Requirements: +- Accept parameters: Customer No., Item No., Quantity +- Return: Discount percentage (Decimal) +- Business logic: + * 0-10 units: No discount + * 11-50 units: 5% discount + * 51-100 units: 10% discount + * 100+ units: 15% discount +- Read discount tiers from a setup table +- Log calculation to telemetry +- Include error handling for invalid inputs +- Add XML documentation +- Follow AL best practices for procedure naming and structure +``` +
+ +## Next Steps + +Now that you know how to write effective prompts: +- Review the [best practices](../best-practices) for AI-assisted development +- Try the [practical examples](../../getting-more) with your new prompting skills +- Understand the [limitations](../limitations) of AI assistants diff --git a/content/docs/agentic-coding/GettingStarted/glossary.md b/content/docs/agentic-coding/GettingStarted/glossary.md new file mode 100644 index 00000000..ebd356af --- /dev/null +++ b/content/docs/agentic-coding/GettingStarted/glossary.md @@ -0,0 +1,213 @@ +--- +title: "Glossary" +linkTitle: "Glossary" +weight: 6 +description: > + Common terms and concepts in AI-assisted development +--- + +## AI & Coding Assistant Terms + +### Agent / Agentic AI +An AI system that can take actions autonomously, make decisions, and use tools to accomplish tasks. In coding, an agentic AI can read files, write code, run commands, and iterate on solutions without constant human intervention. + +### AI Assistant / Coding Assistant +Software that uses artificial intelligence to help you write code. Examples include GitHub Copilot, Claude, ChatGPT, Cursor, and Windsurf. + +### Context +Information the AI has access to when responding to your request. This can include: +- Your current file and selection +- Open files in your workspace +- Previous conversation messages +- Project structure and files +- Tools and external data sources + +**Why it matters**: The more relevant context the AI has, the better its responses. Limited context can lead to generic or incorrect suggestions. + +### Context Window +The maximum amount of text (measured in tokens) an AI can process at once. Think of it as the AI's "working memory." + +**Example**: A 200K token context window can hold roughly 150,000 words of text—about 300 pages. + +### Hallucination +When an AI generates information that sounds plausible but is incorrect or fabricated. This can include: +- Non-existent AL objects or methods +- Made-up API endpoints +- Incorrect syntax or patterns + +**How to avoid**: Always verify AI suggestions, especially for critical code or unfamiliar APIs. + +### Inference +The process of an AI model generating a response to your input. Each time you send a prompt and get a response, that's one inference. + +### Large Language Model (LLM) +The AI technology powering coding assistants. LLMs are trained on vast amounts of text (including code) to understand and generate human-like responses. + +**Examples**: GPT-4, Claude 3.5 Sonnet, Llama, Gemini + +### Model +The specific AI system you're interacting with. Different models have different capabilities, strengths, and context windows. + +**Examples**: +- Claude 3.5 Sonnet (good at code and reasoning) +- GPT-4o (fast, multimodal) +- o1 (optimized for complex reasoning) + +--- + +## Prompting & Communication + +### Prompt +Your input or question to the AI. A prompt can be: +- A question: "How do I post a sales invoice in AL?" +- A command: "Add error handling to this function" +- A request: "Refactor this code to use modern AL patterns" + +**Tip**: Clear, specific prompts get better results than vague ones. + +### System Prompt / Instructions +Background instructions that guide the AI's behavior and personality. You typically don't see these, but they tell the AI how to respond (e.g., "You are a Business Central expert," "Be concise," "Provide code examples"). + +### Few-Shot / One-Shot Prompting +Providing examples in your prompt to guide the AI's response format. + +**Example**: +``` +Create getter methods like this example: +procedure GetCustomerName(): Text[100] +begin + exit("Customer Name"); +end + +Now create a getter for "Customer Email" +``` + +### Chain of Thought +Asking the AI to explain its reasoning step-by-step before providing an answer. This often improves accuracy for complex problems. + +**Example**: "Let's think through how to design this posting routine step by step..." + +--- + +## Technical Terms + +### Token +The basic unit of text that AI models process. Roughly: +- 1 token ≈ 4 characters in English +- 1 token ≈ ¾ of a word +- 100 tokens ≈ 75 words + +**Why it matters**: Context windows, pricing, and API limits are measured in tokens. + +### Tool / Tool Calling / Function Calling +External capabilities the AI can use to perform actions beyond text generation: +- Read and write files +- Run terminal commands +- Search the web +- Query databases +- Execute MCP server tools + +**Example**: When you ask "What's in my app.json?", the AI uses a "read file" tool rather than guessing. + +### MCP (Model Context Protocol) +An open standard for connecting AI assistants to external tools and data sources. MCP servers expose capabilities (like AL symbol databases, Azure DevOps, time tracking) that AI assistants can use. + +**Example**: The AL Dependency MCP Server lets your AI assistant search compiled AL packages. + +### RAG (Retrieval-Augmented Generation) +A technique where the AI retrieves relevant information from external sources before generating a response. This helps provide accurate, up-to-date information beyond the AI's training data. + +**Example**: BC Code Intelligence MCP uses RAG to fetch specific Business Central knowledge topics. + +### Temperature +A setting that controls how creative or deterministic the AI's responses are: +- **Low temperature (0.0-0.3)**: Focused, consistent, predictable—good for code generation +- **High temperature (0.7-1.0)**: Creative, varied, exploratory—good for brainstorming + +### Embeddings +Mathematical representations of text that capture semantic meaning. Used to find relevant information by similarity rather than exact keyword matches. + +**Example**: Searching for "customer posting" would find content about "posting customer transactions" even without exact word matches. + +--- + +## AL & Business Central Specific + +### AL Language Server +A background service that provides intelligent code features for AL: +- Code completion +- Go to definition +- Find references +- Syntax checking + +**Note**: Some MCP servers (like Serena) integrate with the AL Language Server to give AI assistants these capabilities. + +### Symbol +In AL, a symbol is any named code element: +- Objects (tables, pages, codeunits) +- Fields +- Procedures +- Variables + +### .app Package +A compiled AL extension package containing symbols and metadata. AI assistants can't read these directly, which is why tools like AL Dependency MCP Server exist. + +### Object ID +The numeric identifier for AL objects (tables, pages, codeunits, etc.). Managing these IDs across teams requires coordination to avoid conflicts—that's where AL Object ID Ninja MCP helps. + +--- + +## Development Workflow + +### Pair Programming +A development practice where two people work together on the same code. With AI assistants, you're essentially pair programming with an AI partner. + +### Code Review +Examining code to find issues, ensure quality, and share knowledge. AI assistants can help with code review by analyzing patterns, suggesting improvements, and catching common mistakes. + +### Refactoring +Improving code structure and readability without changing its behavior. AI assistants excel at refactoring tasks like renaming, extracting methods, and modernizing patterns. + +### Test-Driven Development (TDD) +Writing tests before writing the code that satisfies them. AI assistants can help generate test cases and implementations. + +--- + +## Common Acronyms + +| Term | Meaning | +|------|---------| +| **AI** | Artificial Intelligence | +| **LLM** | Large Language Model | +| **MCP** | Model Context Protocol | +| **NLP** | Natural Language Processing | +| **RAG** | Retrieval-Augmented Generation | +| **TDD** | Test-Driven Development | +| **LSP** | Language Server Protocol | +| **IDE** | Integrated Development Environment | +| **API** | Application Programming Interface | +| **CRUD** | Create, Read, Update, Delete | +| **CLI** | Command Line Interface | +| **PAT** | Personal Access Token | + +--- + +## Tips for Learning the Language + +**Don't worry about knowing everything!** Start with these core concepts: +- **Prompt**: What you say to the AI +- **Context**: What information the AI can see +- **Token**: How AI text is measured +- **Hallucination**: When AI makes things up +- **Tool**: Actions the AI can take (like reading files) + +As you work with AI assistants, you'll naturally pick up more terminology. The important thing is understanding how to communicate effectively and knowing when to verify AI suggestions. + +--- + +## Related Resources + +- **[What is Agentic Coding](../what-is-agentic-coding)** - Core concepts explained +- **[Effective Prompting](../effective-prompting)** - How to communicate with AI +- **[Understanding Limitations](../limitations)** - What AI can and can't do +- **[Tools & MCP Servers](../../communityresources/tools)** - Extending AI capabilities diff --git a/content/docs/agentic-coding/GettingStarted/limitations.md b/content/docs/agentic-coding/GettingStarted/limitations.md new file mode 100644 index 00000000..5a447c5e --- /dev/null +++ b/content/docs/agentic-coding/GettingStarted/limitations.md @@ -0,0 +1,473 @@ +--- +title: "Understanding Limitations" +linkTitle: "Limitations" +weight: 5 +description: > + Know when to use (and not use) AI assistance in AL development +--- + +## Overview + +AI coding assistants are powerful tools, but they have limitations. Understanding these limitations helps you use AI effectively and avoid common pitfalls. + +## Knowledge Limitations + +### Training Data Cutoff +AI models are trained on data up to a specific date: + +**Implication**: +- May not know about the latest AL features +- Might suggest deprecated APIs +- Could miss recent Business Central updates +- May not be aware of new best practices + +**What to Do**: +- Verify suggestions against current documentation +- Check for deprecated features +- Stay updated on BC releases yourself +- Supplement AI with official Microsoft docs + +### Lack of Real-Time Information +AI doesn't know: +- Your specific BC version and configuration +- Your organization's custom extensions +- Your specific business requirements +- Current state of your codebase + +**What to Do**: +- Provide context in your prompts +- Specify BC version when relevant +- Describe dependencies and extensions +- Share organizational standards + +### Incomplete AL Knowledge +AI might not fully understand: +- Complex AL compiler behavior +- Subtle differences between AL versions +- Specific BC platform limitations +- Performance characteristics of certain operations + +**What to Do**: +- Test generated code thoroughly +- Verify with official documentation +- Profile performance-critical code +- Consult AL experts for complex scenarios + +## Code Quality Limitations + +### May Generate Suboptimal Code + +**Example 1: Inefficient Database Access** +```al +// AI might generate: +procedure CountCustomersInCity(CityName: Text): Integer +var + Customer: Record Customer; + Counter: Integer; +begin + Counter := 0; + if Customer.FindSet() then + repeat + if Customer.City = CityName then + Counter += 1; + until Customer.Next() = 0; + exit(Counter); +end; + +// Better approach: +procedure CountCustomersInCity(CityName: Text): Integer +var + Customer: Record Customer; +begin + Customer.SetRange(City, CityName); + exit(Customer.Count); +end; +``` + +**Example 2: Missing Error Handling** +```al +// AI might generate: +procedure GetCustomerEmail(CustomerNo: Code[20]): Text +var + Customer: Record Customer; +begin + Customer.Get(CustomerNo); + exit(Customer."E-Mail"); +end; + +// Should include error handling: +procedure GetCustomerEmail(CustomerNo: Code[20]): Text +var + Customer: Record Customer; +begin + if not Customer.Get(CustomerNo) then + Error('Customer %1 does not exist.', CustomerNo); + + if Customer."E-Mail" = '' then + Error('Customer %1 has no email address.', CustomerNo); + + exit(Customer."E-Mail"); +end; +``` + +### May Not Follow Your Standards +AI doesn't automatically know: +- Your naming conventions +- Your code organization preferences +- Your error handling patterns +- Your logging standards + +**What to Do**: +- Include standards in prompts +- Create prompt templates +- Maintain coding guidelines document +- Review and adapt generated code + +### May Create Inconsistent Code +AI might: +- Use different patterns across files +- Mix coding styles +- Apply inconsistent naming +- Vary error handling approaches + +**What to Do**: +- Establish clear patterns early +- Refactor for consistency +- Use linters and code analyzers +- Conduct thorough code reviews + +## Business Logic Limitations + +### No Domain Knowledge +AI doesn't understand: +- Your specific business processes +- Industry regulations you must follow +- Your customers' needs +- Your company's policies + +**Example**: +``` +You ask: "Create discount calculation logic" + +AI generates: 10% flat discount + +But you need: +- Tiered discounts by volume +- Special rates for preferred customers +- Regional pricing variations +- Promotional discounts +- Loyalty program integration +``` + +**What to Do**: +- Provide detailed business requirements +- Include business rules in prompts +- Review logic for business correctness +- Validate with business stakeholders + +### Can't Make Business Decisions +AI shouldn't decide: +- Which features to implement +- How to prioritize requirements +- What trade-offs to make +- Which approach best fits your needs + +**You must decide**: +- Architecture and design +- Feature scope +- Performance vs. complexity trade-offs +- User experience choices + +## Technical Limitations + +### Context Window Limitations +AI can only see: +- A limited amount of code at once +- Recently opened files +- Content you explicitly share + +**Implications**: +- Might miss dependencies in other files +- May not see full context of large codebases +- Could suggest code that conflicts with other parts + +**What to Do**: +- Keep related files open +- Provide context in prompts +- Reference specific files and procedures +- Review for integration issues + +### Can't Execute or Test Code +AI can't: +- Run your code +- Execute tests +- Connect to your database +- Verify actual behavior + +**Implications**: +- Might generate syntactically correct but broken code +- Can't verify business logic works +- Won't catch runtime errors +- Can't validate performance + +**What to Do**: +- Always test generated code +- Run your test suite +- Verify in actual BC environment +- Profile performance-critical code + +### Can't Access External Systems +AI doesn't know about: +- Your database state +- External APIs you integrate with +- Third-party extensions installed +- Network or security constraints + +**What to Do**: +- Document external dependencies +- Test integrations thoroughly +- Verify API compatibility +- Check security implications + +## Safety and Security Limitations + +### Limited Security Awareness +AI might not catch: +- SQL injection vulnerabilities +- Authorization bypass issues +- Data leakage risks +- Insecure data handling + +**Example**: +```al +// AI might generate: +procedure RunDynamicQuery(FilterText: Text) +begin + // Could be SQL injection risk if FilterText comes from user + Customer.SetFilter(City, FilterText); +end; + +// Need to add validation: +procedure RunDynamicQuery(FilterText: Text) +begin + ValidateFilterInput(FilterText); // Add validation + Customer.SetFilter(City, FilterText); +end; +``` + +**What to Do**: +- Security review all generated code +- Validate inputs from users +- Follow security best practices +- Consult security experts + +### Privacy Concerns +Be careful not to share: +- Customer data +- Production database content +- API keys or credentials +- Proprietary business logic + +**What to Do**: +- Use sample data in prompts +- Sanitize code before sharing +- Review organizational policies +- Use private AI instances if available + +## Reliability Limitations + +### Inconsistent Results +AI might: +- Give different answers to same question +- Vary quality across generations +- Make occasional "hallucinations" +- Provide confident but wrong information + +**What to Do**: +- Verify all suggestions +- Don't assume correctness +- Cross-check with documentation +- Regenerate if quality is poor + +### Can Make Mistakes +AI can: +- Misunderstand requirements +- Make logical errors +- Suggest deprecated features +- Create subtle bugs + +**Real Examples**: +```al +// AI might confuse similar concepts: +// You ask for "customer balance" +// It generates code for "customer credit limit" + +// AI might mix AL versions: +// Suggest AL syntax not available in your BC version + +// AI might misapply patterns: +// Use patterns from C# instead of AL conventions +``` + +**What to Do**: +- Treat AI as a junior developer +- Review everything carefully +- Test thoroughly +- Validate assumptions + +## Workflow Limitations + +### Can't Handle Complex Refactoring +AI struggles with: +- Large-scale architecture changes +- Multi-file refactoring +- Complex dependency updates +- Breaking changes across modules + +**What to Do**: +- Break into smaller steps +- Do complex refactoring manually +- Use AI for individual pieces +- Plan architecture yourself + +### Limited Long-Term Memory +AI doesn't remember: +- Previous conversations (in some tools) +- Decisions made earlier in project +- Your preferences over time +- Context from last week + +**What to Do**: +- Restate context when needed +- Document decisions +- Include relevant background in prompts +- Don't assume AI remembers + +### Can't Collaborate Directly +AI can't: +- Participate in code reviews +- Attend planning meetings +- Discuss with stakeholders +- Make consensus decisions + +**What to Do**: +- Use AI for preparation +- Review AI suggestions with team +- Make collaborative decisions yourself +- Document team agreements + +## When to Be Extra Careful + +### High-Risk Scenarios + +**Financial Calculations** +``` +Extra vigilance needed for: +- Payment processing +- Tax calculations +- Currency conversions +- Pricing logic +``` + +**Compliance and Audit** +``` +Careful review for: +- Regulatory compliance code +- Audit trail functionality +- Data retention policies +- Access control +``` + +**Data Integrity** +``` +Thorough testing for: +- Database modifications +- Data migrations +- Batch processing +- Transaction handling +``` + +**Integration Points** +``` +Extensive validation for: +- API integrations +- Web service calls +- External system connections +- Data synchronization +``` + +## Recognizing AI Limitations + +### Warning Signs + +**The AI:** +- Gives very generic solutions +- Doesn't ask clarifying questions +- Suggests deprecated features +- Provides inconsistent answers +- Seems overly confident about uncertain things +- Generates syntactically correct but illogical code + +**What to Do:** +- Seek second opinion +- Consult documentation +- Ask a colleague +- Test more thoroughly +- Provide more context +- Try rephrasing prompt + +## Complementing AI with Other Resources + +### Use Multiple Sources + +**For Learning:** +- Official Microsoft Learn +- BC documentation +- Community blogs +- Training courses + +**For Problem Solving:** +- Microsoft Docs +- Community forums +- Stack Overflow +- Colleague expertise + +**For Best Practices:** +- AL Guidelines (this site!) +- Microsoft patterns +- Community standards +- Team conventions + +**For Validation:** +- Code analyzers +- Test frameworks +- Peer review +- Static analysis tools + +## The Bottom Line + +### AI is a Tool, Not a Solution +- Use it to augment your skills +- Don't rely on it exclusively +- Maintain your expertise +- Stay critical and thoughtful + +### Your Responsibilities Remain +- Understand the code +- Ensure correctness +- Maintain quality +- Make decisions +- Own the results + +### Continuous Learning +- AI tools will improve +- Your skills must keep pace +- Learn from AI's mistakes +- Evolve your practices + +## Next Steps + +Now that you understand AI limitations: +- Apply this knowledge in the [practical examples](../../getting-more) +- See how to work within these limitations in [best practices](../best-practices) +- Explore [community resources](../../community-resources) for more insights diff --git a/content/docs/agentic-coding/GettingStarted/setup.md b/content/docs/agentic-coding/GettingStarted/setup.md new file mode 100644 index 00000000..e9349004 --- /dev/null +++ b/content/docs/agentic-coding/GettingStarted/setup.md @@ -0,0 +1,226 @@ +--- +title: "Setting Up Your Environment" +linkTitle: "Setup" +weight: 2 +description: > + Configure your development environment for optimal AI-assisted AL development +--- + +## Overview + +To get the most out of AI-powered coding assistance for AL development, you'll need to set up your environment properly. This guide covers the essential tools and configurations. + +## Prerequisites + +### Required +- **Visual Studio Code**: The primary IDE for AL development +- **AL Language Extension**: Microsoft's official AL extension for VS Code +- **AI Coding Assistant**: One of the following: + - GitHub Copilot + - GitHub Copilot Chat + - Other compatible AI assistants + +### Recommended +- **Git**: For version control and change tracking +- **AL Test Runner**: For running and managing tests +- **Business Central Docker Container**: For local development and testing + +## Installing GitHub Copilot + +GitHub Copilot is one of the most popular AI assistants for coding: + +1. **Sign up for GitHub Copilot** + - Visit [GitHub Copilot](https://github.com/features/copilot) + - Choose a subscription plan (free trial available) + +2. **Install the VS Code Extension** + - Open VS Code + - Go to Extensions (Ctrl+Shift+X) + - Search for "GitHub Copilot" + - Install both: + - GitHub Copilot + - GitHub Copilot Chat + +3. **Sign In** + - Click "Sign in to GitHub" when prompted + - Authorize the extension + +## Configuring VS Code for AL + AI + +### Workspace Settings + +Add these settings to your workspace `.vscode/settings.json`: + +```json +{ + // AL Language settings + "al.enableCodeAnalysis": true, + "al.codeAnalyzers": ["${CodeCop}", "${PerTenantExtensionCop}", "${UICop}"], + + // GitHub Copilot settings + "github.copilot.enable": { + "*": true, + "al": true + }, + + // Editor settings for better AI integration + "editor.inlineSuggest.enabled": true, + "editor.quickSuggestions": { + "other": true, + "comments": true, + "strings": true + } +} +``` + +### AL Project Structure + +Organize your AL project for better AI context: + +``` +MyExtension/ +├── .vscode/ +│ ├── settings.json +│ └── launch.json +├── src/ +│ ├── Tables/ +│ ├── Pages/ +│ ├── Codeunits/ +│ ├── Reports/ +│ └── ... +├── test/ +│ └── ... +├── app.json +└── README.md +``` + +Clear folder organization helps AI assistants understand your project structure and provide more relevant suggestions. + +## Optimizing Context for AI + +AI assistants work better when they have good context. Here's how to provide it: + +### 1. Use Descriptive File Names +``` +❌ Page1.al +✅ CustomerListPage.al + +❌ Cod50100.al +✅ SalesOrderProcessor.codeunit.al +``` + +### 2. Maintain a Good README +Create a `README.md` in your project root with: +- Project purpose and overview +- Key features and functionality +- Naming conventions +- Architecture decisions + +### 3. Use XML Documentation +Document your procedures and functions: +```al +/// +/// Calculates the total amount for a sales order including tax +/// +/// The sales header record +/// The total amount including tax +procedure CalculateTotalWithTax(var SalesHeader: Record "Sales Header"): Decimal +``` + +### 4. Keep Related Code Together +Place related functionality in the same files or nearby files. AI assistants can see open files and nearby code. + +## Testing Your Setup + +To verify everything is working: + +1. **Open an AL file** in your project +2. **Start typing** a procedure declaration +3. **Check for suggestions** - You should see inline suggestions appear +4. **Open Copilot Chat** (if using GitHub Copilot) + - Press Ctrl+Shift+I (or Cmd+Shift+I on Mac) + - Try asking: "Explain this AL code" + +## Recommended Extensions + +Install these VS Code extensions to complement your AI assistant: + +- **AL Language**: Microsoft's official AL extension (required) +- **AL Object Designer**: Navigate AL objects easily +- **AL Code Outline**: View code structure +- **AL Test Runner**: Run and manage AL tests +- **AL Variable Helper**: Manage variable declarations +- **GitLens**: Enhanced git integration + +## Workspace Best Practices + +### Open Relevant Files +- Keep related files open in tabs +- AI assistants can use open files for context + +### Use Multi-Root Workspaces (When Appropriate) +If you have dependencies or multiple related projects: +```json +{ + "folders": [ + { "path": "./MyMainExtension" }, + { "path": "./MyDependencyExtension" } + ] +} +``` + +### Organize by Feature +Consider organizing code by business feature rather than object type for complex projects: +``` +src/ +├── SalesOrderProcessing/ +│ ├── SalesOrder.table.al +│ ├── SalesOrderPage.page.al +│ ├── SalesOrderProcessor.codeunit.al +├── CustomerManagement/ +│ └── ... +``` + +## Security and Privacy Considerations + +### What Gets Sent to AI Services +- Code snippets from your workspace +- Currently open files +- Your prompts and questions + +### What You Should NOT Include +- Sensitive credentials or passwords +- Customer data +- Proprietary business logic (if restricted) + +### Best Practices +- Review your organization's AI usage policy +- Use `.gitignore` and `.copilotignore` files appropriately +- Be mindful of what code is in your workspace +- Consider using GitHub Copilot for Business for enterprise controls + +## Troubleshooting + +### AI Suggestions Not Appearing +- Verify the AI extension is installed and enabled +- Check you're signed in to your AI service +- Ensure `editor.inlineSuggest.enabled` is true +- Restart VS Code + +### Poor Quality Suggestions +- Improve code context (better file names, comments) +- Open related files for more context +- Use more descriptive variable and function names +- Add XML documentation comments + +### Performance Issues +- Close unnecessary tabs/files +- Disable AI for specific file types if needed +- Check your system resources + +## Next Steps + +Now that your environment is set up: +- Learn [effective prompting techniques](../effective-prompting) +- Review [best practices](../best-practices) for AI-assisted development +- Try the [practical examples](../../getting-more) to see AI assistance in action diff --git a/content/docs/agentic-coding/GettingStarted/what-is-agentic-coding.md b/content/docs/agentic-coding/GettingStarted/what-is-agentic-coding.md new file mode 100644 index 00000000..aecf4e19 --- /dev/null +++ b/content/docs/agentic-coding/GettingStarted/what-is-agentic-coding.md @@ -0,0 +1,128 @@ +--- +title: "What is Agentic Coding?" +linkTitle: "What is Agentic Coding" +weight: 1 +description: > + Understanding AI-powered coding assistance and how it transforms development +--- + +## Overview + +**Agentic coding** is a development approach where you work collaboratively with AI-powered assistants (agents) that can understand context, generate code, provide suggestions, and help maintain your codebase. Unlike simple code completion tools, these agents can: + +- Understand natural language instructions +- Analyze existing code and context +- Generate complete implementations +- Refactor and improve code +- Explain complex code segments +- Assist with debugging and problem-solving + +## How It Works + +AI coding assistants work by: + +1. **Understanding Context**: The agent analyzes your workspace, open files, and the surrounding code to understand what you're working on +2. **Processing Instructions**: You provide instructions in natural language (or through inline comments) +3. **Generating Solutions**: The agent creates code, documentation, or suggestions based on your needs +4. **Iterative Refinement**: You review, provide feedback, and the agent adjusts the output + +## Key Capabilities for AL Development + +### Code Generation +Generate AL code from natural language descriptions: +- Complete procedures and functions +- Table extensions and page extensions +- API pages and queries +- Event subscribers +- Test code + +### Code Understanding +Get help understanding existing code: +- Explanations of complex logic +- Documentation of dependencies +- Impact analysis of changes + +### Code Improvement +Enhance existing code: +- Refactoring for better performance +- Applying AL best practices +- Modernizing legacy code +- Adding error handling + +### Documentation +Automatically create and maintain: +- XML documentation comments +- README files +- API documentation +- Code comments + +## Benefits for AL Developers + +### Faster Development +- Quickly scaffold new objects and extensions +- Implement common patterns without repetitive typing +- Generate boilerplate code instantly + +### Higher Quality +- Consistent application of best practices +- Fewer common mistakes +- Better code organization + +### Learning Accelerator +- Learn AL patterns through examples +- Understand Business Central APIs +- Discover best practices in context + +### Reduced Cognitive Load +- Focus on business logic, not syntax +- Less context switching for documentation lookups +- Automated handling of repetitive tasks + +## The Human-AI Partnership + +It's important to understand that agentic coding is a **collaborative** approach: + +### You Bring: +- **Domain Knowledge**: Understanding of business requirements and Business Central functionality +- **Decision Making**: Architectural choices and business logic decisions +- **Quality Control**: Review and validation of generated code +- **Context**: Specific requirements, constraints, and organizational standards + +### The AI Brings: +- **Speed**: Rapid code generation and transformation +- **Consistency**: Adherence to patterns and best practices +- **Breadth**: Knowledge of many AL patterns and APIs +- **Assistance**: Help with routine tasks and documentation + +## Common Use Cases + +### Daily Development +- Creating new tables, pages, and codeunits +- Implementing event subscribers +- Writing test code +- Adding XML documentation + +### Code Maintenance +- Refactoring existing code +- Adding telemetry to extensions +- Improving error handling +- Updating deprecated APIs + +### Code Review +- Identifying potential issues +- Suggesting improvements +- Checking adherence to standards +- Finding security concerns + +### Documentation +- Generating README files +- Creating API documentation +- Writing user guides +- Documenting complex algorithms + +## Next Steps + +Now that you understand what agentic coding is, learn how to: +- [Set up your environment](../setup) for AI assistance +- [Write effective prompts](../effective-prompting) to get better results +- Follow [best practices](../best-practices) for AI-assisted development diff --git a/content/docs/agentic-coding/_index.md b/content/docs/agentic-coding/_index.md new file mode 100644 index 00000000..0c88856e --- /dev/null +++ b/content/docs/agentic-coding/_index.md @@ -0,0 +1,56 @@ +--- +title: "Agentic Coding" +linkTitle: "Agentic Coding" +weight: 50 +description: > + Learn how to effectively leverage AI-powered coding assistants for AL development in Business Central +--- + +{{% pageinfo %}} +This section provides guidance on working with AI-powered coding assistants (agents) to enhance your AL development workflow for Microsoft Dynamics 365 Business Central. +{{% /pageinfo %}} + +## What is Agentic Coding? + +Agentic coding refers to the collaborative approach of working with AI-powered assistants that can understand context, generate code, review implementations, and help maintain codebases. These AI agents act as intelligent partners in your development process, offering suggestions, automating repetitive tasks, and helping you follow best practices. + +## Why Use Agentic Assistance for AL Development? + +AI coding assistants can significantly enhance your AL development workflow by: + +- **Accelerating Development**: Generate boilerplate code, implement common patterns, and scaffold new features quickly +- **Improving Code Quality**: Get real-time suggestions for code improvements and adherence to AL best practices +- **Knowledge Augmentation**: Access contextual help about AL syntax, Business Central APIs, and development patterns +- **Documentation**: Automatically generate and maintain code documentation +- **Code Review**: Get automated reviews highlighting potential issues, performance concerns, and style violations +- **Learning Tool**: Learn AL best practices and patterns through interactive assistance + +## What You'll Find Here + +This hub is organized into three main sections: + +### Getting Started +Learn the fundamentals of working with AI coding assistants: +- Understanding agentic coding concepts +- Setting up your environment +- Effective prompting techniques +- Best practices for collaboration with AI + +### Getting More +Practical examples and advanced techniques: +- Conducting AI-assisted code reviews +- Generating and maintaining documentation +- Adding telemetry to your extensions +- Refactoring legacy code +- Testing strategies + +### Community Resources +Curated resources from the AL and Business Central community: +- Articles and blog posts +- Video tutorials +- Tools and extensions +- Community discussions + +## Getting Help + +As you explore agentic coding, remember that AI assistants are tools to augment your capabilities, not replace your expertise. Always review generated code, understand what it does, and ensure it meets your specific requirements and follows your organization's standards. From 648d1b0bf46eaa89d2fac6eb5a684a1c7e2833e7 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 10 Oct 2025 12:35:23 +0200 Subject: [PATCH 39/60] Fixing menu order --- content/docs/NAVPatterns/_index.md | 2 +- content/docs/vibe-coding/_index.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/content/docs/NAVPatterns/_index.md b/content/docs/NAVPatterns/_index.md index 644ec7ec..22ecc24f 100644 --- a/content/docs/NAVPatterns/_index.md +++ b/content/docs/NAVPatterns/_index.md @@ -1,6 +1,6 @@ +++ title = "NAV Patterns Archive" -weight = 20 +weight = 4 tags = ["C/AL"] +++ diff --git a/content/docs/vibe-coding/_index.md b/content/docs/vibe-coding/_index.md index b002939d..8fa25383 100644 --- a/content/docs/vibe-coding/_index.md +++ b/content/docs/vibe-coding/_index.md @@ -1,5 +1,6 @@ --- title: "Vibe Coding for AL" +weight: 90 tags: ["AL", "Vibe Coding"] categories: ["Vibe Coding"] description: > From 18938a0e8882b9d50f4369d12f1fdf967e6074f6 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 10 Oct 2025 12:40:04 +0200 Subject: [PATCH 40/60] Update Docsy to v0.12.0 for Hugo v0.151.0 compatibility --- go.mod | 2 +- go.sum | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c8b8727f..318448e4 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/microsoft/alguidelines go 1.23.0 -require github.com/google/docsy v0.10.0 // indirect +require github.com/google/docsy v0.12.0 // indirect diff --git a/go.sum b/go.sum index 78bc9349..963e3a5b 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,8 @@ github.com/FortAwesome/Font-Awesome v0.0.0-20240402185447-c0f460dca7f7/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= +github.com/FortAwesome/Font-Awesome v0.0.0-20241216213156-af620534bfc3/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= github.com/google/docsy v0.10.0 h1:6tMDacPwAyRWNCfvsn/9qGOZDQ8b0aRzjRZvnZPY5dg= github.com/google/docsy v0.10.0/go.mod h1:c0nIAqmRTOuJ01F85U/wJPQtc3Zj9N58Kea9bOT2AJc= +github.com/google/docsy v0.12.0 h1:CddZKL39YyJzawr8GTVaakvcUTCJRAAYdz7W0qfZ2P4= +github.com/google/docsy v0.12.0/go.mod h1:1bioDqA493neyFesaTvQ9reV0V2vYy+xUAnlnz7+miM= github.com/twbs/bootstrap v5.3.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= +github.com/twbs/bootstrap v5.3.6+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= From 9794f220a3053348f56ee4eec3a4f3d8a4d5ffd1 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 10 Oct 2025 12:50:12 +0200 Subject: [PATCH 41/60] Update GitHub Actions workflow to use Hugo v0.151.0 --- .github/workflows/hugo.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index c833b917..149fb31b 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -31,7 +31,7 @@ jobs: build: runs-on: ubuntu-latest env: - HUGO_VERSION: 0.133.1 + HUGO_VERSION: 0.151.0 steps: - name: Install Hugo CLI run: | From 28adab2c0abe968223c76912a44219dbd85216c2 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska <35526546+JeremyVyska@users.noreply.github.com> Date: Sat, 11 Oct 2025 17:50:06 +0200 Subject: [PATCH 42/60] Update creator information in documentation --- .../CommunityResources/Tools/al-objid-mcp-server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md b/content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md index 8f5d27f2..a520f6ed 100644 --- a/content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md +++ b/content/docs/agentic-coding/CommunityResources/Tools/al-objid-mcp-server.md @@ -10,7 +10,7 @@ description: > The AL Object ID Ninja MCP Server manages AL object IDs to prevent collisions in Business Central development. It provides two modes: LITE for individual developers and STANDARD for teams with shared ID pools and backend integration. -**Created by**: [SShadowS (Vjeko Kundačina)](https://github.com/SShadowS) +**Created by**: [SShadowS (Torben Leth)](https://github.com/SShadowS) --- From e6477e447dcce97111730d2c407108a8a84aa79e Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 09:05:07 +0200 Subject: [PATCH 43/60] Add BC Telemetry Buddy (Waldo) to Tools list --- .../CommunityResources/Tools/_index.md | 9 ++++++ .../Tools/waldo-bctelemetrybuddy.md | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md diff --git a/content/docs/agentic-coding/CommunityResources/Tools/_index.md b/content/docs/agentic-coding/CommunityResources/Tools/_index.md index b8b267fd..f0fbd82c 100644 --- a/content/docs/agentic-coding/CommunityResources/Tools/_index.md +++ b/content/docs/agentic-coding/CommunityResources/Tools/_index.md @@ -84,6 +84,15 @@ Each MCP server below has its own dedicated page with detailed information, setu --- +### [BC Telemetry Buddy (Waldo)](waldo-bctelemetrybuddy.md) + +**Key Features**: +- Simple helpers for collecting Business Central telemetry +- Forward telemetry events to a custom endpoint for analysis +- Lightweight and easy to add to development workflows + +--- + ## Contributing Tools **Created a tool for AI-assisted AL development?** diff --git a/content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md b/content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md new file mode 100644 index 00000000..8a45217c --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md @@ -0,0 +1,28 @@ +--- +title: "BC Telemetry Buddy (Waldo)" +linkTitle: "BC Telemetry Buddy" +weight: 7 +description: > + A small utility to help collect and forward Business Central telemetry for analysis and debugging. +--- + +## Overview + +BC Telemetry Buddy (by Waldo) is a community tool that simplifies collecting telemetry from Business Central extensions and forwarding events to analysis endpoints. It's useful for teams who want lightweight telemetry during development or targeted diagnostics in production-like environments. + +**Publisher**: [waldo1001](https://github.com/waldo1001) + +--- + +## Key Features + +- Easy instrumentation helpers for common telemetry scenarios +- Lightweight forwarding to custom endpoints +- Works well in development environments and with local testing setups +- Simple configuration and minimal dependencies + +--- + +## Links + +- **GitHub**: https://github.com/waldo1001/waldo.BCTelemetryBuddy From 103ce14426b74ed864e07c69f0953e3d57b984dc Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 09:22:35 +0200 Subject: [PATCH 44/60] Add NAB AL Tools MCP server to Tools list --- .../CommunityResources/Tools/_index.md | 9 +++ .../Tools/nab-al-tools-mcp.md | 79 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md diff --git a/content/docs/agentic-coding/CommunityResources/Tools/_index.md b/content/docs/agentic-coding/CommunityResources/Tools/_index.md index f0fbd82c..9f334a79 100644 --- a/content/docs/agentic-coding/CommunityResources/Tools/_index.md +++ b/content/docs/agentic-coding/CommunityResources/Tools/_index.md @@ -93,6 +93,15 @@ Each MCP server below has its own dedicated page with detailed information, setu --- +### [NAB AL Tools MCP](nab-al-tools-mcp.md) + +**Key Features**: +- XLIFF/XLF translation tooling exposed as MCP tools +- Rich validation and annotations (Zod schemas) +- Multiple invocation options (npx, global, local) + +--- + ## Contributing Tools **Created a tool for AI-assisted AL development?** diff --git a/content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md b/content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md new file mode 100644 index 00000000..3faa97bb --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md @@ -0,0 +1,79 @@ +--- +title: "NAB AL Tools MCP" +linkTitle: "NAB AL Tools" +weight: 8 +description: > + XLIFF translation and localization tools exposed as an MCP server for AL projects. +--- + +## Overview + +The NAB AL Tools MCP Server exposes XLIFF translation management capabilities (the same core features used by the NAB AL Tools VS Code extension) as a standalone MCP server. It lets AI assistants and other MCP-compatible clients inspect, create, refresh and save XLF files used for AL localization workflows. + +**Publisher**: [nabsolutions / jwikman](https://github.com/jwikman) + +--- + +## Key Features + +- Comprehensive XLF/XLIFF tooling: refresh, create language XLFs, search by keyword, get untranslated texts, and more +- Proper MCP annotations and Zod input validation for robust error handling +- Configurable: works with npx, global install, or local project install +- Supports pagination, batch saves and performant parsing for large translation files +- Designed to work locally (openWorldHint: false) and respects workspace boundaries + +--- + +## Installation & Usage + +Recommended via npx (no install required): + +```bash +npx -y @nabsolutions/nab-al-tools-mcp +``` + +Or install globally: + +```bash +npm install -g @nabsolutions/nab-al-tools-mcp +``` + +MCP client example (npx): + +```json +{ + "mcpServers": { + "nab-al-tools": { + "command": "npx", + "args": ["-y", "@nabsolutions/nab-al-tools-mcp"] + } + } +} +``` + +--- + +## Notable Tools (summary) + +- `refreshXlf` — synchronize generated .g.xlf with target XLF +- `getTextsToTranslate` — list untranslated units with pagination +- `getTranslatedTextsMap` — fetch existing translations grouped by source +- `getTranslatedTextsByState` — filter translations by state (needs-review, translated, final) +- `saveTranslatedTexts` — batch save translated units (up to configured limits) +- `createLanguageXlf` — generate new language XLFs (can optionally match base app translations) +- `getTextsByKeyword` — search XLF content by keyword or regex +- `getGlossaryTerms` — return builtin BC glossary pairs for consistent terminology + +--- + +## Requirements + +- Node.js >= 20 +- npm (if installing) + +--- + +## Links + +- **GitHub**: https://github.com/jwikman/nab-al-tools +- **MCP readme (source)**: https://github.com/jwikman/nab-al-tools/blob/main/extension/MCP_SERVER.md From 8a583c8edce24f5ea2c7e384a0499d888082a63d Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 12:18:50 +0200 Subject: [PATCH 45/60] Curate videos.md: add 4 starter videos, contributor CTA, and quality criteria --- .../CommunityResources/articles.md | 48 +- .../CommunityResources/videos.md | 412 ++---------------- 2 files changed, 70 insertions(+), 390 deletions(-) diff --git a/content/docs/agentic-coding/CommunityResources/articles.md b/content/docs/agentic-coding/CommunityResources/articles.md index f553b972..06582916 100644 --- a/content/docs/agentic-coding/CommunityResources/articles.md +++ b/content/docs/agentic-coding/CommunityResources/articles.md @@ -14,34 +14,50 @@ This page curates blog posts, articles, and written guides from the Business Cen ### Getting Started -#### "My First Month with GitHub Copilot for AL Development" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: A developer's experience adopting GitHub Copilot for AL development, including lessons learned, productivity gains, and common pitfalls. +#### "Vibe Coding — yes or no?" — Demiliani +**Author**: Demiliani +**Published**: 2025-08-21 +**Summary**: A thoughtful exploration of the Vibe Coding approach and whether its rules and conventions help or hinder real-world AL development. **Key Takeaways**: -- How to configure Copilot for optimal AL suggestions -- Prompting patterns that work well for AL -- Mistakes to avoid when starting out +- Pros and cons of strict Vibe Coding rules +- When to adopt vs. adapt guidance for your team +- Practical examples and trade-offs -**Link**: [Example - Replace with actual link when available] +**Link**: https://demiliani.com/2025/08/21/vibe-coding-yes-or-no/ --- -#### "Effective Prompting for Business Central Extensions" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Deep dive into writing effective prompts specifically for AL and Business Central development scenarios. +#### "Gestión de contexto y estados en servidores MCP" — TechSphere Dynamics +**Author**: TechSphere Dynamics +**Published**: 2025-08-15 +**Summary**: A Spanish-language deep dive into context handling and state management patterns for MCP servers, including practical patterns used in production systems. **Key Takeaways**: -- AL-specific prompting patterns -- How to provide context for better results -- Examples of before/after prompt improvements +- Context lifecycle and state management strategies +- Common pitfalls when preserving or discarding context +- Examples of robust MCP server patterns -**Link**: [Example - Replace with actual link when available] +**Link**: https://techspheredynamics.com/2025/08/15/gestion-de-contexto-y-estados-en-servidores-mcp/ --- +#### "Testing GitHub Copilot: knowledge engineering — what actually works and what doesn't" — Nubimancy +**Author**: Nubimancy +**Published**: 2025-09-09 +**Summary**: An empirical look at how well GitHub Copilot handles knowledge-engineering tasks, with experiments and practical recommendations for prompt authors. + +**Key Takeaways**: +- Which prompting patterns produce reliable results +- When Copilot is prone to hallucination or brittle outputs +- Strategies to validate and refine AI-suggested knowledge artifacts + +**Link**: https://nubimancy.com/2025/09/09/testing-github-copilot-knowledge-engineering-what-actually-works-and-what-doesnt/ + +--- + +Each of these are just "great examples" from those blogs, so make sure to explore around! + ### Advanced Techniques #### "Using AI to Modernize Legacy NAV Code" diff --git a/content/docs/agentic-coding/CommunityResources/videos.md b/content/docs/agentic-coding/CommunityResources/videos.md index 1c0139bd..dc114325 100644 --- a/content/docs/agentic-coding/CommunityResources/videos.md +++ b/content/docs/agentic-coding/CommunityResources/videos.md @@ -1,402 +1,66 @@ --- +--- title: "Video Tutorials" linkTitle: "Videos" weight: 2 description: > - Video content demonstrating AI-assisted AL development techniques + Curated videos demonstrating AI-assisted AL development techniques --- ## Overview -Visual learning resources showing AI coding assistants in action for Business Central development. These videos demonstrate real workflows, techniques, and best practices. +Short, curated videos that show AI coding assistants in practical AL/Business Central workflows. The list below is a starting point — contribute more quality content via the contributing process. -## Getting Started Videos +## Curated Videos (starter list) -### Introduction to AI Coding for AL -**Channel**: Community Channel -**Duration**: ~15 minutes -**Level**: Beginner +1. "Vibe Coding: Yes or No?" — demiliani + - Link: https://www.youtube.com/watch?v=vY5WfipEK8M + - Quick: discussion and viewpoints on the "vibe coding" approach when using AI assistants -**What You'll Learn**: -- Setting up GitHub Copilot for AL development -- First steps with AI assistance -- Basic prompting techniques -- Common mistakes to avoid +2. "Gestion de Contexto y Estados en Servidores MCP" — techspheredynamics + - Link: https://www.youtube.com/watch?v=PzEbaPw-E1o + - Quick: context and state management patterns for MCP servers (Spanish) -**Topics Covered**: -- Installation and configuration -- Writing your first AI-assisted AL code -- Understanding suggestions -- Accepting and modifying completions +3. "Testing GitHub Copilot Knowledge Engineering" — nubimancy + - Link: https://www.youtube.com/watch?v=K8nFVw5M-Po + - Quick: experiments and lessons around prompting and knowledge engineering for Copilot -**Link**: [Example - Replace with actual link when available] - ---- - -### Configuring VS Code for Optimal AI Assistance -**Channel**: Community Channel -**Duration**: ~10 minutes -**Level**: Beginner - -**What You'll Learn**: -- VS Code settings for AL + AI -- Workspace configuration -- Extension setup -- Optimizing for better suggestions - -**Link**: [Example - Replace with actual link when available] - ---- - -## Technique Demonstrations - -### Effective Prompting for AL Development -**Channel**: Community Channel -**Duration**: ~20 minutes -**Level**: Intermediate - -**Demonstrations**: -- Writing clear, specific prompts -- Providing context for better results -- Iterative refinement -- Prompt patterns that work for AL - -**Example Scenarios**: -- Creating table extensions -- Generating page code -- Writing codeunit logic -- Building API pages - -**Link**: [Example - Replace with actual link when available] - ---- - -### Live Coding: Building a Feature with AI -**Channel**: Community Channel -**Duration**: ~30 minutes -**Level**: Intermediate - -**Watch As**: -- Complete feature built with AI assistance -- Real-time problem solving -- Code review and refinement -- Testing and debugging - -**Feature Built**: Customer loyalty points system - -**Link**: [Example - Replace with actual link when available] - ---- - -## Advanced Workflows - -### AI-Assisted Code Refactoring -**Channel**: Community Channel -**Duration**: ~25 minutes -**Level**: Advanced - -**Demonstrations**: -- Analyzing legacy code -- Planning refactoring with AI -- Executing transformations -- Validating changes - -**Before/After**: Real code transformation examples - -**Link**: [Example - Replace with actual link when available] - ---- - -### Adding Telemetry with AI Assistance -**Channel**: Community Channel -**Duration**: ~20 minutes -**Level**: Advanced - -**Step-by-Step**: -- Planning telemetry strategy -- Generating telemetry code -- Creating custom dimensions -- Testing telemetry output - -**Link**: [Example - Replace with actual link when available] - ---- - -### Building Test Coverage with AI -**Channel**: Community Channel -**Duration**: ~30 minutes -**Level**: Advanced - -**Covers**: -- Test planning with AI -- Generating test codeunits -- Creating test data -- Running and debugging tests - -**Link**: [Example - Replace with actual link when available] - ---- - -## Real-World Projects - -### Case Study: Migrating NAV to BC with AI -**Channel**: Company Channel -**Duration**: ~45 minutes -**Level**: Advanced - -**Complete Walkthrough**: -- Project scope and planning -- AI-assisted code conversion -- Manual review process -- Quality assurance -- Results and lessons learned - -**Metrics Shared**: Time savings, accuracy rates - -**Link**: [Example - Replace with actual link when available] - ---- - -### Building a Complete Extension from Scratch -**Channel**: Community Channel -**Duration**: ~60 minutes (multi-part) -**Level**: Intermediate - -**Full Development Cycle**: -- Requirements gathering -- Architecture design -- Implementation with AI -- Testing -- Documentation -- Deployment - -**Extension Built**: Warehouse management enhancement - -**Link**: [Example - Replace with actual link when available] - ---- - -## Tips & Tricks - -### "5-Minute AL AI Tips" Series -**Channel**: Community Channel -**Episodes**: 20+ -**Duration**: ~5 minutes each -**Level**: All - -**Topics Include**: -- Quick productivity hacks -- Useful prompt templates -- Keyboard shortcuts -- Common pitfalls to avoid -- Integration tips - -**Link**: [Playlist - Replace with actual link when available] - ---- - -### AI Shortcuts Every AL Developer Should Know -**Channel**: Community Channel -**Duration**: ~15 minutes -**Level**: All - -**Quick Wins**: -- Fast code generation -- Smart completions -- Context switching -- Multi-file operations - -**Link**: [Example - Replace with actual link when available] - ---- - -## Tool-Specific Tutorials - -### GitHub Copilot for AL Developers -**Channel**: GitHub or Community -**Duration**: ~25 minutes -**Level**: Beginner to Intermediate - -**Specific to GitHub Copilot**: -- Installation and setup -- Chat vs inline suggestions -- Slash commands -- Best practices for AL - -**Link**: [Example - Replace with actual link when available] - ---- - -### Using AI in VS Code for Business Central -**Channel**: Microsoft or Community -**Duration**: ~20 minutes -**Level**: Beginner - -**VS Code Integration**: -- Extension setup -- Keyboard shortcuts -- Chat interface -- Multi-file context - -**Link**: [Example - Replace with actual link when available] - ---- - -## Conference Talks & Webinars - -### "The Future of AL Development with AI" -**Event**: BC TechDays / Directions -**Speaker**: Industry Expert -**Duration**: ~45 minutes -**Level**: All - -**Topics**: -- Current state of AI assistance -- Emerging trends -- Impact on development teams -- Future predictions - -**Link**: [Example - Replace with actual link when available] - ---- - -### "Practical AI for BC Developers" Workshop -**Event**: Community Webinar -**Duration**: ~90 minutes -**Level**: Intermediate - -**Hands-On Workshop**: -- Interactive exercises -- Real-world scenarios -- Q&A session -- Best practices discussion - -**Link**: [Example - Replace with actual link when available] - ---- - -## Series & Playlists - -### "AI-Powered AL Development" Complete Course -**Creator**: Community Educator -**Videos**: 15 -**Total Duration**: ~6 hours -**Level**: Beginner to Advanced - -**Curriculum**: -1. Introduction and Setup (3 videos) -2. Basic Techniques (4 videos) -3. Advanced Patterns (4 videos) -4. Real Projects (3 videos) -5. Best Practices (1 video) - -**Link**: [Course playlist - Replace with actual link when available] - ---- - -### "Code Review with AI" Series -**Creator**: Community Contributor -**Videos**: 10 -**Duration**: ~20 minutes each -**Level**: Intermediate - -**Each Episode**: Reviews real AL code with AI assistance, showing improvements and best practices - -**Link**: [Series - Replace with actual link when available] - ---- - -## Live Streams & Recordings - -### Weekly AL Development with AI -**Stream**: Live on [Platform] -**Schedule**: Weekly -**Duration**: ~60 minutes -**Level**: All - -**Format**: -- Live coding with AI -- Community Q&A -- Tip sharing -- Problem solving - -**Link**: [Channel - Replace with actual link when available] - ---- +4. "Live Feature Build with AI Assistance" — community live stream + - Link: https://www.youtube.com/watch?v=SP1UJNjTN7s + - Quick: live coding session demonstrating end-to-end feature development with AI help ## How to Use These Videos -### For Learning -- **Beginners**: Start with "Getting Started" videos -- **Intermediate**: Focus on technique demonstrations -- **Advanced**: Watch real-world projects and case studies +- Start with the shorter discussion/intro videos to build context +- Watch demos and live coding to see practical workflows and gotchas +- Rewatch technical deep dives for specific patterns or tools -### For Reference -- Bookmark specific technique videos -- Use during development as guidance -- Share with team members -- Include in training materials +## Contribute a Video -### For Practice -- Code along with demonstrations -- Pause and try techniques yourself -- Apply patterns to your own projects -- Experiment with variations +If you've created a high-quality video about AI-assisted AL development, please contribute it. -## Creating Your Own Content +Submission checklist: +- Publicly accessible (YouTube, Vimeo, etc.) +- Focused on AL / Business Central development +- Provides clear, actionable content or valuable discussion -**Interested in creating AL + AI video content?** +How to submit: +1. Review the [Contributing](../../../contributing) guidelines +2. Open a pull request adding your video to this page +3. Provide: Title, Creator, Short Summary (1–2 lines), and Link -We encourage community members to create and share! +## Video Quality Criteria -**Tips for Creating Good Content**: -- Show real code and workflows -- Explain your thinking process -- Include mistakes and corrections -- Provide downloadable examples -- Keep audio quality high -- Use clear screen recordings - -**To Get Listed**: -1. Create quality content -2. Make it publicly accessible -3. Submit via [Contributing](../../../contributing) process - -## Video Quality Standards - -Listed videos meet these criteria: -- ✅ Clear audio and video -- ✅ Accurate information -- ✅ Relevant to AL/BC development -- ✅ Good demonstration quality -- ✅ Publicly accessible - -## Language & Accessibility - -Most videos are in English, but we welcome content in other languages. Please indicate language in submissions. - -**Accessibility**: -- Look for videos with closed captions -- Many creators provide transcripts -- Some include downloadable code samples - -## Updates - -**Latest Additions**: Check back regularly for new videos - -**To Suggest Videos**: See [Contributing](../../../contributing) section - ---- - -## Placeholder Notice - -> **Note to Contributors**: This page uses example placeholders for community video resources. As actual video content about AI-assisted AL development is published, it should be added here with proper attribution and links. Please contribute by submitting pull requests with real resources that meet the quality criteria above. +Videos listed here should meet these standards: +- Clear audio and video +- Accurate and relevant to AL development +- Demonstrates techniques, patterns, or practical workflows +- Publicly accessible --- ## Related Resources -- [Blog Posts & Articles](../articles) - Written content -- [Tools & Extensions](../tools) - Development utilities -- [Discussions](../discussions) - Community conversations -- [Getting Started](../../getting-started) - Foundational concepts +- [Blog Posts & Articles](../articles) +- [Tools & Extensions](../tools) +- [Discussions](../discussions) From 0f61791734afa5336fd341a56929af41c5dfe216 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 12:20:39 +0200 Subject: [PATCH 46/60] Add NAB AL Tools MCP page (summary, features, links) --- .../agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md b/content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md index 3faa97bb..a80c09c6 100644 --- a/content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md +++ b/content/docs/agentic-coding/CommunityResources/Tools/nab-al-tools-mcp.md @@ -10,7 +10,7 @@ description: > The NAB AL Tools MCP Server exposes XLIFF translation management capabilities (the same core features used by the NAB AL Tools VS Code extension) as a standalone MCP server. It lets AI assistants and other MCP-compatible clients inspect, create, refresh and save XLF files used for AL localization workflows. -**Publisher**: [nabsolutions / jwikman](https://github.com/jwikman) +**Publisher**: [nabsolutions / Johannes Wikman](https://github.com/jwikman) --- From 784ef6d58dcbfb0da505607d2af4856b01236b7b Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 12:20:41 +0200 Subject: [PATCH 47/60] Add Waldo BC Telemetry Buddy page (summary, links) --- .../CommunityResources/Tools/waldo-bctelemetrybuddy.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md b/content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md index 8a45217c..56ae5d8c 100644 --- a/content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md +++ b/content/docs/agentic-coding/CommunityResources/Tools/waldo-bctelemetrybuddy.md @@ -1,5 +1,5 @@ --- -title: "BC Telemetry Buddy (Waldo)" +title: "BC Telemetry Buddy (waldo)" linkTitle: "BC Telemetry Buddy" weight: 7 description: > @@ -8,7 +8,7 @@ description: > ## Overview -BC Telemetry Buddy (by Waldo) is a community tool that simplifies collecting telemetry from Business Central extensions and forwarding events to analysis endpoints. It's useful for teams who want lightweight telemetry during development or targeted diagnostics in production-like environments. +BC Telemetry Buddy (by waldo) is a community tool that simplifies collecting telemetry from Business Central extensions and forwarding events to analysis endpoints. It's useful for teams who want lightweight telemetry during development or targeted diagnostics in production-like environments. **Publisher**: [waldo1001](https://github.com/waldo1001) @@ -26,3 +26,4 @@ BC Telemetry Buddy (by Waldo) is a community tool that simplifies collecting tel ## Links - **GitHub**: https://github.com/waldo1001/waldo.BCTelemetryBuddy +- **Marketplace**: [BC Telemetry Buddy](https://marketplace.visualstudio.com/items?itemName=waldoBC.bc-telemetry-buddy) \ No newline at end of file From 907a8f3415e060c57d66712c1826debce9fdf7ed Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 12:20:43 +0200 Subject: [PATCH 48/60] Clean up Articles page: remove placeholders, add CTA and quality checklist --- .../CommunityResources/articles.md | 208 ++---------------- 1 file changed, 16 insertions(+), 192 deletions(-) diff --git a/content/docs/agentic-coding/CommunityResources/articles.md b/content/docs/agentic-coding/CommunityResources/articles.md index 06582916..02c52e86 100644 --- a/content/docs/agentic-coding/CommunityResources/articles.md +++ b/content/docs/agentic-coding/CommunityResources/articles.md @@ -56,213 +56,37 @@ This page curates blog posts, articles, and written guides from the Business Cen --- -Each of these are just "great examples" from those blogs, so make sure to explore around! - -### Advanced Techniques - -#### "Using AI to Modernize Legacy NAV Code" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Strategies for using AI assistants to migrate and modernize code from NAV to Business Central AL. - -**Key Takeaways**: -- Approach for large-scale code conversion -- Handling NAV-specific patterns -- Quality assurance strategies - -**Link**: [Example - Replace with actual link when available] +Each of these are just great examples from those blogs, so make sure to explore around! --- -#### "AI-Assisted Test Development for AL" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: How to leverage AI to create comprehensive test coverage for Business Central extensions. - -**Key Takeaways**: -- Generating test codeunits with AI -- Creating test data setup -- Ensuring test quality - -**Link**: [Example - Replace with actual link when available] - ---- - -### Real-World Case Studies - -#### "How We Used AI to Accelerate Extension Development" -**Author**: Development Team -**Published**: Example Date -**Summary**: Case study from a development team that integrated AI assistants into their workflow, with metrics and results. - -**Key Takeaways**: -- Productivity metrics before and after -- Team adoption strategies -- ROI analysis - -**Link**: [Example - Replace with actual link when available] - ---- - -#### "Building a Complex Integration with AI Assistance" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Detailed walkthrough of using AI to build a complex integration between Business Central and external systems. - -**Key Takeaways**: -- Approach for complex projects -- What AI handled well vs. manual effort -- Lessons learned - -**Link**: [Example - Replace with actual link when available] - ---- - -## Best Practices & Guidelines - -#### "Code Review Checklist for AI-Generated AL Code" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Comprehensive checklist for reviewing AI-generated AL code before production. - -**Key Takeaways**: -- Specific AL concerns to check -- Performance review criteria -- Security considerations - -**Link**: [Example - Replace with actual link when available] - ---- - -#### "When NOT to Use AI for AL Development" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Important discussion of scenarios where AI assistance is not appropriate or effective. - -**Key Takeaways**: -- Limitation awareness -- Risk scenarios -- Alternative approaches - -**Link**: [Example - Replace with actual link when available] - ---- - -## Specialized Topics - -#### "Generating API Documentation with AI" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Techniques for using AI to create and maintain API documentation for AL extensions. - -**Link**: [Example - Replace with actual link when available] - ---- - -#### "AI-Assisted Performance Optimization" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Using AI to identify and resolve performance issues in AL code. - -**Link**: [Example - Replace with actual link when available] - ---- - -#### "Telemetry Instrumentation with AI Help" -**Author**: Community Contributor -**Published**: Example Date -**Summary**: Systematically adding Application Insights telemetry using AI assistance. - -**Link**: [Example - Replace with actual link when available] - ---- - -## Series & Multi-Part Articles - -### "AI for AL Developers" Series -**Author**: Community Contributor -**Parts**: 5 - -1. **Part 1**: Introduction and Setup -2. **Part 2**: Basic Prompting Techniques -3. **Part 3**: Advanced Workflows -4. **Part 4**: Team Integration -5. **Part 5**: Measuring Success - -**Link**: [Series homepage - Replace with actual link when available] - ---- - -## Tips & Tricks Collections - -#### "50 AI Prompts Every AL Developer Should Know" -**Summary**: Collection of tried-and-tested prompts for common AL development tasks. - -**Link**: [Example - Replace with actual link when available] - ---- - -#### "Quick Wins with GitHub Copilot in AL" -**Summary**: Short, actionable tips for immediate productivity gains. - -**Link**: [Example - Replace with actual link when available] - ---- - -## How to Use These Articles - -### For Learning -- Start with "Getting Started" articles if you're new -- Move to "Advanced Techniques" as you gain experience -- Reference "Best Practices" regularly - -### For Reference -- Bookmark articles relevant to your current work -- Use case studies for project planning -- Check specialized topics when needed - -### For Sharing -- Share articles with team members -- Use in training and onboarding -- Reference in documentation - ## Contributing Articles -Have you written about AI-assisted AL development? +Have you written about AI-assisted AL development? We'd love to include high-quality, publicly accessible content from the community. -**We'd love to include your content!** - -**Submission Guidelines**: -- Must be publicly accessible -- Focused on AL/Business Central development -- High-quality, accurate content +Submission checklist: +- Publicly accessible article or blog post +- Clearly focused on AL / Business Central development +- Accurate, well-written, and actionable - Original work or properly attributed -**How to Submit**: +How to submit: 1. Review the [Contributing](../../../contributing) guidelines -2. Submit a pull request adding your article -3. Include: Title, Author, Summary, Key Takeaways, Link +2. Open a pull request adding your article to this list +3. Provide: Title, Author, Short Summary (1–2 lines), and Link ## Article Quality Criteria -Listed articles meet these standards: -- ✅ Technically accurate -- ✅ Relevant to AL development -- ✅ Clear and well-written -- ✅ Provides actionable insights -- ✅ Publicly accessible +Items listed on this page should meet these standards: +- Technically accurate +- Relevant to AL development +- Clear and well-written +- Provides actionable insights +- Publicly accessible ## Updates -**Note**: This is a living document. As community members publish new content, this page will be updated. - -**To suggest additions**: See [Contributing](../../../contributing) section. - ---- - -## Placeholder Notice - -> **Note to Contributors**: This page uses example placeholders for community resources. As actual articles and blog posts about AI-assisted AL development are published by the community, they should be added here with proper attribution and links. Please contribute by submitting pull requests with real resources that meet the quality criteria above. +This is a living document — new resources will be added as the community publishes them. To suggest an addition, open a PR against this repository and follow the submission checklist above. --- From 86d86c326b2eaa07c25bf9497f230b93db7879c5 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 14:27:13 +0200 Subject: [PATCH 49/60] Fixing broken internal links --- .../InstallHugo/ManuallyOnWindows11/index.md | 2 +- content/docs/Contributing/InstallHugo/_index.md | 2 +- .../CommunityResources/Agents/_index.md | 14 +++++++------- .../CommunityResources/Agents/claude-agent.md | 6 +++--- .../CommunityResources/Agents/cursor-agent.md | 6 +++--- .../Agents/github-copilot-agent.md | 10 +++++----- .../Agents/github-copilot-chat-agent.md | 6 +++--- .../CommunityResources/Tools/_index.md | 2 +- .../agentic-coding/CommunityResources/_index.md | 2 +- .../agentic-coding/CommunityResources/tools.md | 2 +- content/docs/agentic-coding/GettingMore/_index.md | 2 +- .../GettingStarted/best-practices.md | 2 +- .../GettingStarted/effective-prompting.md | 2 +- .../agentic-coding/GettingStarted/limitations.md | 2 +- .../docs/agentic-coding/GettingStarted/setup.md | 2 +- 15 files changed, 31 insertions(+), 31 deletions(-) diff --git a/content/docs/Contributing/InstallHugo/ManuallyOnWindows11/index.md b/content/docs/Contributing/InstallHugo/ManuallyOnWindows11/index.md index 671484d5..7e4b8105 100644 --- a/content/docs/Contributing/InstallHugo/ManuallyOnWindows11/index.md +++ b/content/docs/Contributing/InstallHugo/ManuallyOnWindows11/index.md @@ -2,7 +2,7 @@ title: "Manually on Windows 11" --- -This guide will walk You thrugh installing Hugo on a Windows 11 PC. For the official install guide, You can wisit . +This guide will walk You thrugh installing Hugo on a Windows 11 PC. For the official install guide, You can wisit . ## Download Binaries diff --git a/content/docs/Contributing/InstallHugo/_index.md b/content/docs/Contributing/InstallHugo/_index.md index b59eb861..30a2f7f6 100644 --- a/content/docs/Contributing/InstallHugo/_index.md +++ b/content/docs/Contributing/InstallHugo/_index.md @@ -4,6 +4,6 @@ title: Install Hugo There are multiple ways to install Hugo for you to properly preview your contributions. Please select the scenario that matches your setup. -For the official install guide, you can visit +For the official install guide, you can visit {{< youtube G7umPCU-8xc >}} diff --git a/content/docs/agentic-coding/CommunityResources/Agents/_index.md b/content/docs/agentic-coding/CommunityResources/Agents/_index.md index bd6e0f45..b463099f 100644 --- a/content/docs/agentic-coding/CommunityResources/Agents/_index.md +++ b/content/docs/agentic-coding/CommunityResources/Agents/_index.md @@ -159,8 +159,8 @@ Many developers use multiple agents for different tasks: ### New to AI Coding? 1. **Start Simple**: [GitHub Copilot](github-copilot-agent) -2. **Learn the Basics**: [Effective Prompting](../../getting-started/effective-prompting) -3. **Try Examples**: [Getting More](../../getting-more) +2. **Learn the Basics**: [Effective Prompting](../../gettingstarted/effective-prompting) +3. **Try Examples**: [Getting More](../../gettingmore) 4. **Explore Others**: Try Claude or Cursor for comparison ### Already Using AI? @@ -202,15 +202,15 @@ See individual agent pages for specific privacy information. 1. **Read agent pages** to understand capabilities 2. **Choose one** to start with 3. **Follow setup** instructions -4. **Practice** with examples from [Getting More](../../getting-more) +4. **Practice** with examples from [Getting More](../../gettingmore) 5. **Experiment** with others as needed ## Resources -- [Setup Guide](../../getting-started/setup) - Environment configuration -- [Effective Prompting](../../getting-started/effective-prompting) - Get better results -- [Best Practices](../../getting-started/best-practices) - Use AI effectively -- [Limitations](../../getting-started/limitations) - Understand constraints +- [Setup Guide](../../gettingstarted/setup) - Environment configuration +- [Effective Prompting](../../gettingstarted/effective-prompting) - Get better results +- [Best Practices](../../gettingstarted/best-practices) - Use AI effectively +- [Limitations](../../gettingstarted/limitations) - Understand constraints --- diff --git a/content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md index 806ce4f4..828c5674 100644 --- a/content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md +++ b/content/docs/agentic-coding/CommunityResources/Agents/claude-agent.md @@ -743,9 +743,9 @@ with pros and cons of each." - [API Documentation](https://docs.anthropic.com/claude/reference) ### AL Guidelines -- [Effective Prompting](../../getting-started/effective-prompting) -- [Best Practices](../../getting-started/best-practices) -- [Code Review Examples](../../getting-more/code-review) +- [Effective Prompting](../../gettingstarted/effective-prompting) +- [Best Practices](../../gettingstarted/best-practices) +- [Code Review Examples](../../gettingmore/code-review) --- diff --git a/content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md index e6e25c23..4e5fdfd1 100644 --- a/content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md +++ b/content/docs/agentic-coding/CommunityResources/Agents/cursor-agent.md @@ -640,9 +640,9 @@ Poor: - [Community Discord](https://discord.gg/cursor) ### AL Guidelines -- [Effective Prompting](../../getting-started/effective-prompting) -- [Best Practices](../../getting-started/best-practices) -- [Getting More Examples](../../getting-more) +- [Effective Prompting](../../gettingstarted/effective-prompting) +- [Best Practices](../../gettingstarted/best-practices) +- [Getting More Examples](../../gettingmore) ## Learning Cursor diff --git a/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md index b688f7c1..d7f62dce 100644 --- a/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md +++ b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-agent.md @@ -503,13 +503,13 @@ Before accepting Copilot suggestions: ### Official Resources - [GitHub Copilot Documentation](https://docs.github.com/copilot) - [VS Code Extension Page](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) -- [Getting Started Guide](https://docs.github.com/copilot/getting-started-with-github-copilot) +- [Getting Started Guide](https://docs.github.com/copilot/gettingstarted-with-github-copilot) ### AL Guidelines Resources -- [Setup Guide](../../getting-started/setup) -- [Effective Prompting](../../getting-started/effective-prompting) -- [Best Practices](../../getting-started/best-practices) -- [Code Review Examples](../../getting-more/code-review) +- [Setup Guide](../../gettingstarted/setup) +- [Effective Prompting](../../gettingstarted/effective-prompting) +- [Best Practices](../../gettingstarted/best-practices) +- [Code Review Examples](../../gettingmore/code-review) ## When to Use GitHub Copilot diff --git a/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md index ebc73ce8..378bbd5f 100644 --- a/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md +++ b/content/docs/agentic-coding/CommunityResources/Agents/github-copilot-chat-agent.md @@ -600,9 +600,9 @@ No separate charge - comes with Copilot subscription. - [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) ### AL Guidelines Resources -- [Effective Prompting](../../getting-started/effective-prompting) -- [Best Practices](../../getting-started/best-practices) -- [Getting More Examples](../../getting-more) +- [Effective Prompting](../../gettingstarted/effective-prompting) +- [Best Practices](../../gettingstarted/best-practices) +- [Getting More Examples](../../gettingmore) ## Complementary Tools diff --git a/content/docs/agentic-coding/CommunityResources/Tools/_index.md b/content/docs/agentic-coding/CommunityResources/Tools/_index.md index 9f334a79..8bddcda3 100644 --- a/content/docs/agentic-coding/CommunityResources/Tools/_index.md +++ b/content/docs/agentic-coding/CommunityResources/Tools/_index.md @@ -145,7 +145,7 @@ Share it with the community! ## Related Resources -- [Setup Guide](../../getting-started/setup) - Environment configuration +- [Setup Guide](../../gettingstarted/setup) - Environment configuration - [Blog Posts](../articles) - Tool reviews and comparisons - [Videos](../videos) - Tool demonstrations - [GitHub Discussions](https://github.com/microsoft/alguidelines/discussions) - Tool recommendations and support diff --git a/content/docs/agentic-coding/CommunityResources/_index.md b/content/docs/agentic-coding/CommunityResources/_index.md index bcc2926c..eba32316 100644 --- a/content/docs/agentic-coding/CommunityResources/_index.md +++ b/content/docs/agentic-coding/CommunityResources/_index.md @@ -95,7 +95,7 @@ The community is grateful to developers who regularly share their knowledge abou ## Learning Paths ### For Beginners -1. Start with [Getting Started](../getting-started) in this hub +1. Start with [Getting Started](../gettingstarted) in this hub 2. Watch introductory videos about AI coding assistants 3. Read beginner-friendly blog posts 4. Try simple prompts with your own code diff --git a/content/docs/agentic-coding/CommunityResources/tools.md b/content/docs/agentic-coding/CommunityResources/tools.md index 368ad700..41e86422 100644 --- a/content/docs/agentic-coding/CommunityResources/tools.md +++ b/content/docs/agentic-coding/CommunityResources/tools.md @@ -563,7 +563,7 @@ Extensions are frequently updated. Check for updates regularly: ## Related Resources -- [Setup Guide](../../getting-started/setup) - Environment configuration +- [Setup Guide](../../gettingstarted/setup) - Environment configuration - [Blog Posts](../articles) - Tool reviews and comparisons - [Videos](../videos) - Tool demonstrations - [Discussions](../discussions) - Tool recommendations and support diff --git a/content/docs/agentic-coding/GettingMore/_index.md b/content/docs/agentic-coding/GettingMore/_index.md index 9d93daa1..432eea27 100644 --- a/content/docs/agentic-coding/GettingMore/_index.md +++ b/content/docs/agentic-coding/GettingMore/_index.md @@ -28,7 +28,7 @@ Each guide follows a practical, scenario-based approach: ## Before You Start -Make sure you've completed the [Getting Started](../getting-started) section to: +Make sure you've completed the [Getting Started](../gettingstarted) section to: - Understand agentic coding concepts - Set up your environment - Learn effective prompting diff --git a/content/docs/agentic-coding/GettingStarted/best-practices.md b/content/docs/agentic-coding/GettingStarted/best-practices.md index af52ca2b..28698b30 100644 --- a/content/docs/agentic-coding/GettingStarted/best-practices.md +++ b/content/docs/agentic-coding/GettingStarted/best-practices.md @@ -411,5 +411,5 @@ Ensure quality isn't suffering: ## Next Steps - Understand [AI limitations](../limitations) to know when caution is needed -- Try the [practical examples](../../getting-more) to apply these best practices +- Try the [practical examples](../../gettingmore) to apply these best practices - Explore [community resources](../../community-resources) for more tips and techniques diff --git a/content/docs/agentic-coding/GettingStarted/effective-prompting.md b/content/docs/agentic-coding/GettingStarted/effective-prompting.md index 390ba36d..d91ba1ab 100644 --- a/content/docs/agentic-coding/GettingStarted/effective-prompting.md +++ b/content/docs/agentic-coding/GettingStarted/effective-prompting.md @@ -354,5 +354,5 @@ Requirements: Now that you know how to write effective prompts: - Review the [best practices](../best-practices) for AI-assisted development -- Try the [practical examples](../../getting-more) with your new prompting skills +- Try the [practical examples](../../gettingmore) with your new prompting skills - Understand the [limitations](../limitations) of AI assistants diff --git a/content/docs/agentic-coding/GettingStarted/limitations.md b/content/docs/agentic-coding/GettingStarted/limitations.md index 5a447c5e..3d78b238 100644 --- a/content/docs/agentic-coding/GettingStarted/limitations.md +++ b/content/docs/agentic-coding/GettingStarted/limitations.md @@ -468,6 +468,6 @@ Extensive validation for: ## Next Steps Now that you understand AI limitations: -- Apply this knowledge in the [practical examples](../../getting-more) +- Apply this knowledge in the [practical examples](../../gettingmore) - See how to work within these limitations in [best practices](../best-practices) - Explore [community resources](../../community-resources) for more insights diff --git a/content/docs/agentic-coding/GettingStarted/setup.md b/content/docs/agentic-coding/GettingStarted/setup.md index e9349004..cd5b007f 100644 --- a/content/docs/agentic-coding/GettingStarted/setup.md +++ b/content/docs/agentic-coding/GettingStarted/setup.md @@ -223,4 +223,4 @@ src/ Now that your environment is set up: - Learn [effective prompting techniques](../effective-prompting) - Review [best practices](../best-practices) for AI-assisted development -- Try the [practical examples](../../getting-more) to see AI assistance in action +- Try the [practical examples](../../gettingmore) to see AI assistance in action From 86ee402b1b3c83808a64648e10e2c9121f89660f Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 14:30:58 +0200 Subject: [PATCH 50/60] Reorganizing Agentic/Vibe Section --- content/docs/agentic-coding/CommunityResources/_index.md | 2 +- .../vibe-coding-rules}/README.md | 0 .../vibe-coding-rules}/_index.md | 6 +++--- .../vibe-coding-rules}/al-code-style.md | 0 .../vibe-coding-rules}/al-error-handling.md | 0 .../vibe-coding-rules}/al-events.md | 0 .../vibe-coding-rules}/al-guidelines-rules.md | 0 .../vibe-coding-rules}/al-naming-conventions.md | 0 .../vibe-coding-rules}/al-performance.md | 0 .../vibe-coding-rules}/al-testing.md | 0 10 files changed, 4 insertions(+), 4 deletions(-) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/README.md (100%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/_index.md (93%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/al-code-style.md (100%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/al-error-handling.md (100%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/al-events.md (100%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/al-guidelines-rules.md (100%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/al-naming-conventions.md (100%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/al-performance.md (100%) rename content/docs/{vibe-coding => agentic-coding/vibe-coding-rules}/al-testing.md (100%) diff --git a/content/docs/agentic-coding/CommunityResources/_index.md b/content/docs/agentic-coding/CommunityResources/_index.md index eba32316..c98ceb4c 100644 --- a/content/docs/agentic-coding/CommunityResources/_index.md +++ b/content/docs/agentic-coding/CommunityResources/_index.md @@ -1,7 +1,7 @@ --- title: "Community Resources" linkTitle: "Community Resources" -weight: 30 +weight: 100 description: > Curated resources from the AL and Business Central community for agentic coding --- diff --git a/content/docs/vibe-coding/README.md b/content/docs/agentic-coding/vibe-coding-rules/README.md similarity index 100% rename from content/docs/vibe-coding/README.md rename to content/docs/agentic-coding/vibe-coding-rules/README.md diff --git a/content/docs/vibe-coding/_index.md b/content/docs/agentic-coding/vibe-coding-rules/_index.md similarity index 93% rename from content/docs/vibe-coding/_index.md rename to content/docs/agentic-coding/vibe-coding-rules/_index.md index 8fa25383..4e4060e4 100644 --- a/content/docs/vibe-coding/_index.md +++ b/content/docs/agentic-coding/vibe-coding-rules/_index.md @@ -1,5 +1,5 @@ --- -title: "Vibe Coding for AL" +title: "Vibe Coding Rules for AL" weight: 90 tags: ["AL", "Vibe Coding"] categories: ["Vibe Coding"] @@ -9,9 +9,9 @@ description: > _Created by the Business Central Community, Enhanced for AI-powered AL Development_ -# Vibe Coding for AL +# Vibe Coding Rules for AL -Welcome to the **Vibe Coding for AL** initiative! This section contains AI-optimized coding rules and guidelines specifically designed to enhance the AL developer experience in modern AI-powered IDEs like VS Code and Cursor. +Welcome to the **Vibe Coding Rules for AL** initiative! This section contains AI-optimized coding rules and guidelines specifically designed to enhance the AL developer experience in modern AI-powered IDEs like VS Code and Cursor. ## What is Vibe Coding? diff --git a/content/docs/vibe-coding/al-code-style.md b/content/docs/agentic-coding/vibe-coding-rules/al-code-style.md similarity index 100% rename from content/docs/vibe-coding/al-code-style.md rename to content/docs/agentic-coding/vibe-coding-rules/al-code-style.md diff --git a/content/docs/vibe-coding/al-error-handling.md b/content/docs/agentic-coding/vibe-coding-rules/al-error-handling.md similarity index 100% rename from content/docs/vibe-coding/al-error-handling.md rename to content/docs/agentic-coding/vibe-coding-rules/al-error-handling.md diff --git a/content/docs/vibe-coding/al-events.md b/content/docs/agentic-coding/vibe-coding-rules/al-events.md similarity index 100% rename from content/docs/vibe-coding/al-events.md rename to content/docs/agentic-coding/vibe-coding-rules/al-events.md diff --git a/content/docs/vibe-coding/al-guidelines-rules.md b/content/docs/agentic-coding/vibe-coding-rules/al-guidelines-rules.md similarity index 100% rename from content/docs/vibe-coding/al-guidelines-rules.md rename to content/docs/agentic-coding/vibe-coding-rules/al-guidelines-rules.md diff --git a/content/docs/vibe-coding/al-naming-conventions.md b/content/docs/agentic-coding/vibe-coding-rules/al-naming-conventions.md similarity index 100% rename from content/docs/vibe-coding/al-naming-conventions.md rename to content/docs/agentic-coding/vibe-coding-rules/al-naming-conventions.md diff --git a/content/docs/vibe-coding/al-performance.md b/content/docs/agentic-coding/vibe-coding-rules/al-performance.md similarity index 100% rename from content/docs/vibe-coding/al-performance.md rename to content/docs/agentic-coding/vibe-coding-rules/al-performance.md diff --git a/content/docs/vibe-coding/al-testing.md b/content/docs/agentic-coding/vibe-coding-rules/al-testing.md similarity index 100% rename from content/docs/vibe-coding/al-testing.md rename to content/docs/agentic-coding/vibe-coding-rules/al-testing.md From 9055fcbbd4426086b04c83f01af402e44acbe3f7 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Fri, 17 Oct 2025 15:16:55 +0200 Subject: [PATCH 51/60] Adding vibe coding to the index --- content/docs/agentic-coding/_index.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/content/docs/agentic-coding/_index.md b/content/docs/agentic-coding/_index.md index 0c88856e..44002af2 100644 --- a/content/docs/agentic-coding/_index.md +++ b/content/docs/agentic-coding/_index.md @@ -44,6 +44,15 @@ Practical examples and advanced techniques: - Refactoring legacy code - Testing strategies +### Vibe Coding Rules +Comprehensive AI-specific coding guidelines and instructions: +- AL code style and formatting rules +- Error handling patterns +- Event-driven architecture guidelines +- Performance optimization techniques +- Testing and upgrade code best practices +- Naming conventions and standards + ### Community Resources Curated resources from the AL and Business Central community: - Articles and blog posts From 8afc5570dbdefbcceb6eab4ec5080b14dcd084e3 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Sat, 18 Oct 2025 13:35:27 +0200 Subject: [PATCH 52/60] Fix #150: Replace unavailable video with note about missing content --- content/docs/NAVPatterns/patterns/blocked-entity/_index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/docs/NAVPatterns/patterns/blocked-entity/_index.md b/content/docs/NAVPatterns/patterns/blocked-entity/_index.md index 79b0f5ac..402ba137 100644 --- a/content/docs/NAVPatterns/patterns/blocked-entity/_index.md +++ b/content/docs/NAVPatterns/patterns/blocked-entity/_index.md @@ -92,7 +92,9 @@ Entities where the Blocked Entity has been implemented include: The [Released Entity][anchor4]. -{{< youtube O2R-fTSup1o >}} +{{% alert title="Note" %}} +There was previously a video demonstration of this pattern, but it is no longer available. +{{% /alert %}} [anchor0]: 2260.BlockedEntityPattern.png [anchor1]: /navpatterns/1-patterns/blocked-entity/data-driven-blocked-entity/ From 77b968ae1f5e4b15e655a75eaa0e9a0663082714 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Sat, 18 Oct 2025 13:42:14 +0200 Subject: [PATCH 53/60] Fix #270: Add CAL Coding Guidelines PDF and update broken link --- .../3-cal-coding-guidelines/_index.md | 2 +- ...Microsoft-Development-Center-Copenhagen.pdf | Bin 0 -> 753377 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 static/files/CAL-Coding-Guidelines-at-Microsoft-Development-Center-Copenhagen.pdf diff --git a/content/docs/NAVPatterns/3-cal-coding-guidelines/_index.md b/content/docs/NAVPatterns/3-cal-coding-guidelines/_index.md index 84612f77..54e113cf 100644 --- a/content/docs/NAVPatterns/3-cal-coding-guidelines/_index.md +++ b/content/docs/NAVPatterns/3-cal-coding-guidelines/_index.md @@ -23,6 +23,6 @@ We're looking forward to your comments. Where you can, do provide concrete examp -[anchor0]: https://blogs.msdn.microsoft.com/nav/2015/01/09/cal-coding-guidelines-used-at-microsoft-development-center-copenhagen "download the C/AL coding guidelines as pdf" +[anchor0]: /files/CAL-Coding-Guidelines-at-Microsoft-Development-Center-Copenhagen.pdf "download the C/AL coding guidelines as pdf" [anchor1]: /members/waldo/default.aspx "waldo" [anchor2]: https://www.youtube.com/watch?v=z6skKy0pkmU&list=PLhZ3P-LY7CqmVszuvtJLujFyHpsVN0U_w&index=26 diff --git a/static/files/CAL-Coding-Guidelines-at-Microsoft-Development-Center-Copenhagen.pdf b/static/files/CAL-Coding-Guidelines-at-Microsoft-Development-Center-Copenhagen.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59ff826626c942f96cda472f8c5d8c305980f471 GIT binary patch literal 753377 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 iX`5~Ho$AVzm@zkj$9P*d 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

X%V$ksIr2l_A$QL=QA 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

KMr2seT;-KjF>f30K*x~{N)Hc~t5Gxs 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 )y);rHTOZZ{J?+`hf;!>gO;%{E70n183w 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 O1(BLsQdtTG@&5q$t_BzY literal 0 HcmV?d00001 From aba9b11f07f5eea760c14eb13d2ea0102747ac40 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Sat, 18 Oct 2025 13:45:00 +0200 Subject: [PATCH 54/60] Fix #250: Clarify case sensitivity of APIPublisher and APIGroup for subscriptions --- content/docs/BestPractices/api-page/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/BestPractices/api-page/index.md b/content/docs/BestPractices/api-page/index.md index b1dc4488..cc23701e 100644 --- a/content/docs/BestPractices/api-page/index.md +++ b/content/docs/BestPractices/api-page/index.md @@ -35,7 +35,7 @@ The properties that must be defined are: - ODataKeyFields ### APIPublisher -The name of the API publisher is usually the company creating the API. It is the first custom part in the URL for a given endpoint. The value is case insensitive. +The name of the API publisher is usually the company creating the API. It is the first custom part in the URL for a given endpoint. While the value is case insensitive for HTTP operations (GET, POST, etc.), it is case sensitive when checking for active subscriptions. Example: @@ -44,7 +44,7 @@ APIPublisher = 'contoso'; ``` ### APIGroup -Sets the group of the API endpoint that page or query is exposed in. In the URL the APIGroup comes after the APIPublisher. It can be used to distinguish different API apps or groups of APIs from each other. The value is case insensitive. +Sets the group of the API endpoint that page or query is exposed in. In the URL the APIGroup comes after the APIPublisher. It can be used to distinguish different API apps or groups of APIs from each other. While the value is case insensitive for HTTP operations (GET, POST, etc.), it is case sensitive when checking for active subscriptions. Example: From 9ea56d58438985ede910ad8c84aba240f07bc78b Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Mon, 10 Nov 2025 12:39:14 +0100 Subject: [PATCH 55/60] Fixing broken front page link --- content/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/_index.md b/content/_index.md index 776ca694..43cf6d7e 100644 --- a/content/_index.md +++ b/content/_index.md @@ -131,7 +131,7 @@ images: ["images/og-image-fission.png"]

AI-optimized coding rules and guidelines designed to enhance the AL developer experience in modern AI-powered IDEs like VS Code and Cursor.

- +

m{hQ&qt~#0-9CAgoYB>=#Xq0Y$!yV!^46NIp>y4 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 z z1{RTYn32g*-vyx~D&{UJWLjD&3(e}hF8sIsP~Fyu+NN?VEL8~^fWYKZc!5=iw==?B z-D32#vDeG&CKCtbGIPHjuJAX3*}x)r(_C5(#S)9w10uZFp!-kay^cx5>~}>C5<%=l z2_Os4ea{53U=a1i3#~{AG?k>06;FxltmHWMu#H4O@;FaE`vJpK9Py1Sm1#X47c!?Jnh!t@HxTCi6s4z!>5q6I_yrD z@XH5Z9!7oFLq*U1hIOrJNl_HwlD_S5y+Y|4R&vW76}rMbPs7-R3nhe>PUX@)k<*F>3A>_wFhYgBnsAS!1aWBFmrm|;|evoZSM&J z!WqBay1gk?kZl|}k7iZ~hIA4M6Yb)y9U>f@i<(EfL%!zInCpyb3PJ*-hKpCHR71zY zEi>oZf#re#GfY^&XT*eBJMw@^pT=S4Jolh-f)&cVEhcJ(0?8jlHcY#m5quyleW^PN zNJ2eX&WI_jPgGe_K%B!4H=5$Rh03ao6^DaUXcvHyi~37T)w&|rb9uMozGQr`$kvBDXr=g5^vnkf`(x-}RU2oiF;WkX4(VJsU}8JJL# zCN)OD2!#N^N>Pt5BsO46rrH9js#qw9AC@4T>-bFajH17N_xj>9i;ysmv_sz~sfeo# ziQY;W02?v2B&c_2WsOaWqh`}3vEWN2)1N_;Q@la6Z2d?))D&dqe zil==grn&oH2SgafG5gFw^V?OZ(}jp4inypBRP2D|I4sc|w6$iW==Wl?$82jWEq)sj z*@6-EHA>h3?`{^y9b_79l{vMo%Hs%BVumZ)@q_W19gUN^-5MJ*y2cqG&FDB%`*Bwj@+))B!dIKZ1!eUl4 z|3#1ta$MvjmxgpA18z}d1O`vs0i|MssnWL?Y$WGCZ{Fr?Tpz;`3odkK@dgX#G@kKd7p}FiSkt89tr!LusU#l^@>aH#4F=q(JEn zp9Qsxv`FeHgDJ1yIKM2IEI+3D;t%~<27{XQvjw`%j!G8?PD56gy@_d4chjD(UB{Ip zn`g`1%*~qRGY1`!21uJGhj}Krb70t%v^%Mo@BC>ro+g&C=KD!4bR> z69&P61;Y5tM!vn;{B0Cj;HL9L>Ez%8bJs;9ceF1KzidoZfniFsr-XT5^dj4rDA2#?kIJU7) z`tO&vK$WJ1BlD|3Zp;{WIDu_Gmvbv`>~95lYS;nDLgd1^DqG$vENh|>rnq!e@PTOG zZb02Erp0db+#!p8Rm7}2^AK6*88&x0a@`?BJuKxc(kAYRuXMC42@_XroT{ z%4{o7fpaedH@=-|1Dyk~hW0BoYX@7GZZY6lCVhKBfmALHu}TwrFk@kF?dA*cX%r2r zcQqOkdt}2~`*3dbX>I2$D=)bD4RUkw2SJITmZu&Fj5ilo1}bOf9Tr@j9=I}ZW;!iK z4=8vVbQJzHV;{70+bC8o8R}@i@TCFqMg25LhOc8Q2*c(Ip zr_f^ywAnTX=U%r)J~=d3KJ)auI)?P+m*|Y|;HA21^DKB!Y|;7{JogyPQhhz=XqLNu z@wVKAcoeJf?4=%=9CA)~Tphq5Y*Oq~A zHK~x!|LKOXlm}tq`qZD>14~(8f(51uDW8+Gn&NF7Q~_d6eLaNr^qV=uh9xl#KlcrP ze%`PE!r5ZLxcMDt-{C}2@e4%%KopEm6q-{ryY`o~^@Lu%+qD?o-d<|UcjEHiMXjhj z;0lJOM>>u#Gek>A-{{-&n;NAjH0?T`grQcivU4Y$Cw5)d|DQ zH13%e;rEy!rlNaxYP!v9b#$ouwOO4sS{S$1BS9bo*)=_0(jJTElnV|Vk%grr32~}l z4MD?IE?g_#3S(xj!Qc!FMN{8*l>Wx`LHY<_r9ZwwA;K>vZAVVwS~?w0b3;cB5k3f( zMpo_psbfiAz5575*htyc%tRD=Qsz7$*=z(b*8U5gZTC(Xr975=x-@+FLGsw2exj0O zqIN7J{n3N0BZIk-E<)>}&WbKE6tNL+D3(Tccf*a6nq5T@3&TJl$qXa2Ac`LIv2)1L zKYu34d2CKqhgDi2t(VLGA~L7yx`AA+W`dNJ4{Jsx&$`)2%lQ7I>=l~Iq+sm^a>jTN z9MC4mL#aot{6kvUWzD`l5U&M{n(jbNx7XHL5Azz3zE(6d@w1cH>>rb& zrBu=jNP?{UBQi`K5~}R{3J}@as8_C}6Mcj7AF2U$Vo)ZiP*ZCBFXk`(Lw5WBZ7}`g zW$_n;_%8_YUk=k>4%1%_)Bmx<#LV=skTc9oe=%nm|N9Jz|G}JLX5;wsnEu|T`nMhv z+rROc{_$M@m(&?nZsz~MA#T>!cEROD@z+fK80-q0s+DMCUYjnJX*nWIwKcWB453Ag zmD{Xr5Z5kkrTO#^0uCR7o41-uEFOr&!`o$>Gvw?j8=tHiec$e!zU+Cu>YS{4_jh?S zerxe|@oMz>{eE{m8*zE`Bm3FoIs1M4>f`QlRq*MmD1CE!^YZX{S5q;Mzb0=hCtqKn zOkEXKdAo~Oun4{Wb0He#4Y{hx+D3ibx1q+MYi0S3@x-z?EnI!b-|n-h+S@nab={G1 zW_G8#^6`3k8u7$()ji39L?(ijdB85;ib6%zxbk_M@KQ;zhVl2=mHT!zfrp{{^;V}} zbLqE7J3nI0%};wsReXrmN{rh*M-4&`#Qc?(*>`_>I(=K055o64j;iVRtfb}D>BD@7ffigBsxh6K@;6ZsD6yh5fj}*~{Mp$LKeX=^acAS< zRWh6n7)G;auVrP+Jye*j1 z#$RBwptdlU)fjC<`Fr&8Wj&y`=4y79?f!5xrg9t79Wtu4!>#i7S@L$aTKU;}?HPx# z+e?-1M}A(9w?<-J>5?@vW^>bajnV~OQbm^LlmoTkYNsRW_NkGqRv3YUOv#y3tA=#; zNF~2LbYHi(2$sLM3^e6^gVoNUS*Zm{9^z84Cs`g6P?>w!caQ{m36Mfc;LM~zqGoFr z6wgL)n~Fo5FGummrR)*cKxO%IZ?l2lc$Dz*@O6gv$UUaC7&)0pCVChq6#F`Ufhz5x zL>+FFd6-jkj}x7(*W(0oS?Vyj?JlHtlNn95(9l^3>io>zspj+OXsg2L_Q~6H(TUIM z7Gg_9wUpq_dhgYCi9M~++imCj%Exv6Mu5}e@AykNMBe9D@+p_+(QV1+-uHa>V4hYK z`LmWwfh4vbH#5!bpG1WYYts}XVbhho%H5)hh|4Dwm4OlS!db0 zv3a%`vAb65Rd;5!jr>P)x>Y5Ne9odaA+lSSFRyA0kBjz_R1QfC+^njFiDXiUDqoS3 zsD_jq7BaFp@k7J8?L*0FeQq{;I&>#Z4H0*@^X=#+2H$UW2q6_gRLc&Z>!h6Ok#{qy)(k#e;HY>4#Zgj-?`U!Tt zg5QtNaN$%3o??fV>iwI93h&ech~A%aM;{QukQK2C6Ct0ZwEFS)plE3wc zA+e4z=|R)7VQAI?E&fbm5;i?a-x|h=@tEjkk}?q>8-|o+mms^BPNO-bQ>+(J4Yp<@ zRBWRJz)4>iI^}*u5oalOEtLmlMC+$h=S6Wg?xZcE%I5dLWO(hseZTV~bFYSIIq((W z<)u}?6|=!>JTT#-F00{!0bk^1&d=ke^&esxiH>>U+tR*;64E%$H{xMDc5$&BE&|Uo z9UcZ*!mIZ5{<>gHz_HQr8%n12*Rcz{>fdbbbbZ79(dk!cQ(xb9aJC#Si!u`!ch~4r zE1(``(_z>Hhom)VQ^-J1hyDF^VmvztY7N)Xcfk%(e%!oY1(W;bmyCoYuopw{KoO(0 z5vP}ZB$!G-xIlT~W}|_@OADt|X^d9c^GUuzKS?33-SDtL0E~Hz330XN?yFsE?Y{jp zI+%vmt*&b+g~05_K}m8knguDe>`;tW<$XW4C$G^id|x z*fB$wyUJ|`s$kxmeIns!8#-i2C4=3!=-~xt+fa)sZNvW3QY;a!i)W&#n04E=UuZ>V zzXS|QxljDyvjHY@`+b7`=e~JT#s;E6OoUG8Mo`<@9ikcW8Eo=7?qTvvRF7q7sJJ-C zi**$^6(3w!a?eeA3h$(B{Ew2*LX1Mw;kt|bTKO+QWc)!D#H%n!h~Y-S{#SZcL3X8( z$qyj0+uXW~Lko0$GsHtHqD-vxOLW3>E4M178nCd`>^HXnJXO)~!dKh4@DsN&tKuIZ z5=BwLG=P%p~M+x;1-%$(0X}IwBSZc?|Oj?A^K7CvCg#F;BCBZ zsr*p)NmA1wz64tnJ1o;*N6CL}b*3J+&WMFW;lMC~{q43`eUZ8l$@BR+V3m4Efy|lu zrDK7nz)BTSfe;`T1sVf;w~>WHEpkk)F^Ep~w4TIRcI(+-e{c8KhYp1hYXugBm~y8~ zyN)i)wLGJ4~%0im4;B%EB?vbSk`3+tzcA~Sli(A z5W`=LgTm^bo)_L31{=IHKWXni95d=r-Db8Pr8u%80MQ$~#dcV?-(DufdakngTD@o6A~Py`dzN zi9D)AMM zvSfU4ZILE>;VzTvVuiDsP16YOl!o!xB^h(`Z~SjpC`;G@1Hroa(s$ytERbRTTrI-V z7Qn?xNmHV6hMh3(h#3o6Q^NKJo9*Lh=HEnY+_Aa=R4z&$9?=SCNuoHEQ|ccxRTFqA z8|cQ;c?&Re0Q1a{%1-HE=+P!Dg`ZBn-rqy^?uFYxKY_%aGTfVY{Y0FjUfKrkYee+` zi|-KNB|c(ETJ^kW!8$-7q*qKTbm_eXfCm&n3UBPg&jsL91P780F*NXHI-m){ z`xx>^UKpDGmP6r+{T2e}u~J`Pfzn`jPG=1Ut&5;L=pi^TLW)UqU>=0|h<=J0F~XkF zV8j$gp}GCj%kd=b;21w3ut2B#I~?$Ou;*9E5nv?2!(gpIU+jVzc1DggMovTjt?u5= zZQnmf#&2!w*L9L8)P{j^nbv0#3cJj(PK=a=7G=R%1bfB4z;{P0zR9P-$gl~Ft;f27 zNDlsQvu-{JBlUEB?Ru@u%>w)2NwA@qJ1^qi-`)?FXQ}GIGqkkWae;8}`K&*%!1gDW zY@B>l4n{3`Dww^I0;Za8kmu$|J{TgckO+&XW>n|CtXxYzE;Ja`e}L!dwr)sx&C!FhNOtCK!SJ>U_p^64B&2Or~t6d0+q% z<2VTsC`FJ5u%t#Xw>Ua9J^gd{IrY-VRrlYf*(Gvu;cTRR0KsvB6=L9a>u?<)Ziv?zf zwbItxHvv%wzG+%Z*@mbVR!s8x8BYrnz?z3+G}U(P@DWqVcnau18s(;*93=6D%F5u!h^BqG~sw&Wbaa~X6RIvi_;sLf&*8}GmhlNo@g{yp( z0g%y-_l=NtM2FR40&N4P@n!V5M}(5By{W z>-$!K9V{HSNd_h$tVD;-Cd^dsnjKy-jrdT^LMzBb<(C~gUIrO`6j}<&Ce=X7RI&e^ z02Q!sugygU8C?=Qa{1uN1Mv+sxr8M@RMf_(F2J$`;=xx3Av0+Fn|5H3p9zrA-&P|$ z<{3EEYJlUUr;q*t9R4QRcFluVNK5ZiqRSmC{eahC>sUVLw|g`;>jE%ML;=S>cp}M1 zr9UTNHt(4Jf3jRQcvywT>TEZ|;C$>+7X#g?tBdIFxSL%TEW_d1t-cFUS?8ldh6EUM z9iJbXochi{$@lsL4Flm6n!x4GV#}JXtLcL3l$sb zzRoJrVzyi|dxsZfn`3SG)yNt6dseq=M;ACV{rcdTWOfau*w_`vHe<~%62&NqFmVT2 zrxTjoZ{zl^DW%ENgeK|+)eA$L5&LiKy;X1=>)NF$W@ct)mPI9IW@eVf%*>L-%*@Qp zlEutuTZ|SnjP{<6nf?E9;`Ev6j_4a-DYHVUi?8y_Qmyr_XN{?SemJj$<|tdJ$62%A z9B&wzdqwsQH>K*~-F_dz#&$7#V>;?`USi`?GWj9x~`7YsNd__aeOz zE9=(ysJCAiPsATX@5UEr;M1M{*e8Y^?K1IJa7}oP8 zep__AyquUn4v=*}0(pE-lH73yilUm_*t}}&g*pSh{=V-%$_t-#!t2)1WmHO7eU#M{ z*71jdKjXL0|Lm!rp~b}#_(hI-;;Y_LR*u~~s7!ggCoHTl89or(l)aArrRVeyWXd1U zsr$tncoDv|x|HQ8hrm-qcA(dlNA-6%Pe!)VvvO?-Na*PI)jyuoAJ1t~UL|nZ3{@&pnEedim+^IXi$lMG&^9hu}u`NtPl59RLicfu#o<+7gKf4Ob{ zLE`yOw(b9xP!se2O`QJ!URV1k)f71O$a%);!{lyjYukWa6|c#z0s}X&aAxY|)hUq{ zg*fkH(@~3*C#@jf1-YSY5O>!1U}k3KEy?hHdC6opsD>jgExo9?p=^f4IBD8%1?H8g zIJ^RaK1~Ga?8aTNE(kIA3~8hWLQDnEFgF_D@IzW#Tl);bO~_>AY}w7t4RfG>3PDmP z_<|xL)j%Q)Zln}W?9`ci9A7K$v20gBfK;QdVZ<4$$#dQ{-41U87OJH#XNIV%-=T?g z#Kc?8zx=F1dN5js?~?p9=1-~#qE2S`kLUEqbNXNKoc@s{|9@gl%uIjN+5Y63{!x9& z`N_ch+n`hWx0Vz8zqOqHTGs!$<;2d;_Fr;MI@*5~9r!+c799{4%gO8_*taaC4=JuY z&s*bowIHSgs9F*{)l!V4Ex&*GBD%*5po9U5*eXx3IJ~%Dd}-6^@m}BY)7-vjB=qa@ zZr@?F`_S4l&1JA_*?I5k@_29Qc&&T&?A5&Z-I_UZ`aAdGevYwnf9vG9G`Hc?h-gsf zJTy@xczd>hrc9-Y3LaRAonuB2A&KqV05ND1%*^=mqm+)qE)~G5 zr*p7iT1;49ZK%3Ng!fmT`}X?uk^h`>?L?FY`D{2?8GtOfD-b!m1i_%c{h2#0m?riM{8StCA_p zN|V9(tKVQ9<=xW7_x?NL+QF+#V}&1;N->^47z!C%RURG{H4%J^~8%S)10Dbba)u7-gPp+PBvc zI2i&Pg03YsNrS$hzL+s-QxpD*y^RlK{fdU?DB>X6+y=7O)G}-WLWb#SJa8fsMIQUz zs-vPL%PLu{9rVc4KdooWwZ!(}3sfbJ-E2jW4mLX#VQm!@-S38tbKT)5(j{*)T9kNp zgT51Faw8y98!!M;65eq|@FeVDH*8uLN40uO)5BuY|dd@`v$3J7V8KoT)jQC2AAjbQ4*78(<;7YZoB zm{0?mX>KGUtw5H?Dm=v-^?iRpjca9TFJ>m+kOQ#2726k@CiHoRHk5f_ohNm01}Z*J zUa~P8jo7-gsf~x)T1?KhDaNRWweQ1_mt(*pW^5!BlG9|NM-*UrX+Zvy$-IKa1QQ=Y zg#(-6PA^g*c)*io;p55KlxsjUzHDZ+3UDS3W*sybDgu*hwg{nuQ2`gi`}>#8y7bb0 z6)1ByvFc?yLa}&AGSopEW?~eq!cqg?S06J1ZTC$Dc1S{1huU>HX~}Q~sqfI*DQ8WY^{6!bo=jphn4cC{mJ3Jw zKBJ8rl|07`wtVTa0XE^5Ul$!Ak_I^g;k!L9jioE1GqM*yjzZ>N7tr=e^*INhXhDNr zwhjR~kbAG2jFNunv=iKQ$j2sjJps_L8B^d#@^iojL4%7`VacbA&~RHM1hUGF7+Vyu zrjjg(m}kX^uLPUpJ5z?4XUY1P$IQIyIPEqfVF3u>3b{G2!2)8KF|cZgXC|x@;N5&Q z9L_x|e*w=#xf0SahSkat5^&}3hff`VG_IY;MfTmclPTS0C=FV0^!dkIeEFfdeW827_|2Zf z8dq##aQW8~0dU*!sZ&cI7Mw-iT4Q^}0NEe|!p?K1Ub4TKJV`uSp zrErY+_*88DXltlWt!J`d>$VbQ-Cn$pRAa-w zLKF%;VSY%JQIkyQl+H_(C{m)9%6u(KIswc71aDO03uf z%~Ue^Sw?f2xi&1Gk_&Q2kTz~q_I}M8Sm%;p40Y7z4y@d=zwU?1pR~f!@{5-+;X$)C zK|ouslf1(yT(aHV@xl)Jd6xPj3a$|Zi4hm_RNXupubvzwOsG(h32STIB*#FnwbQs9c`CE;c&=dnV4yZ|b6EDhEKAnRlbfzW8N z(dN3PdD)p=OF&)A?_|_`UCf{)lK0`+>AiaRkkk3-ADuW0Q!O(A7DjIR2#PUbc;S+* z>%NdEBPjD?tlQq42t&XNjzof(MkARQ0~afT%px5~tlI$P8tbA>Bbi{>cF!K&S|hkV zX9&EXYEXS(BbnHpsPMo@yMmKop&jc8m{XQM8KSRD>T zVr-33Tmv( z;vg_Ne?PwziEIXs6{n-J5TvKWvn@hog4fm}Fg_8Bs#;~F$>rzuf&$;B_XSWoEN~wi z&WX>@*#Op}yTSMf7(-{Gv~b-1XNdmdf+7cwX)^uMR*FT!S7CyNO#QOY!O^ACs8C$? z^Kvjq+yo-o$~JQ*6Q5z?wW?P)f3*S2@15CfJLY; zhEeVqqbaCf(A><%o)7zu$qWLi_T152aHz7WC?j3Tz0)jSq!s5}58&VwL_Bgk^nxGq zDK)%vZ(%V=s-dJmpdoe`-wfFdk8}I3Ip=@(NnQi2K^nK+3Hd|A*B}SY39n!@ZlRcu zQE*IAv93IMKu4;Hf>EvA2m>2<*pZ=_S&=vb=4#YY7n+YmoHR9QCv~2snVmeooVkUA zl|_65TNR0ScX@XTw`H+_T{DSy$CA}(qKqEG|6(~Im?UcupDEEtE+s>kV-fQR7TP&C zVDg?_7LuG}pmoGJ+!V*d!(*9W7?@I`Co(%g39|+b9j_L`$evDTf>;P$0hP;S;`W0K zoZdUozZ+WX70aju-Wx<)E`rK@Xe^pb7W6B)02>muD7%8&E71}Se~tTW!go*{j(}lE z_`;4lG(3`Qgs-d6t~-^6$QA>bkg^7AU*Vm8l643%i^}M=3xSCa4GG8~J8euARZXQs zbBZZ2>ng<5(?S_WhG!{sG6Dx6u`(i|YV3Q)N_604TOdkDsp58}bX&=gXaP4yf@u3U zXAaHwi8y-k=%A)GEyM8&%Oon4rw)dOTL-2n%OopA2%s(p9iz}NWX0^mZOCzn)^tU} zX_=&Z<{~AdVm*1H%z=Ae%MsI1GChC8m&B+*J%>7C$&QE&SKba&Ub)1hVM#o+z z;ChhJ+muspEh@V8UTjO&g{zsbiO#%pf8}CL6%l4<2{vi;diieml6ahEM;7+}+SPV_ zOU1nKYZAum1Xr%E_F2?VU~kIlex?oD044iKjJcP?WAZYNZDI;IsrwK?d-1*Vw<%!~ zzb|lWJPL$pPul^{caD%?+cS(*)F1CHHq+%Bxi2#hUthl3S-$J+d_UW6gL9dnO+63r zz;-iu2kuGvzUS6526*YJc}?2INnMFrOFj4GW1Lx22E3T-br0&^ zKY8dSGa@oNbm|fcBIJ~pj++C(E|WU;;G`mF)S&3A`trBFTwn1sBa)*3OI7t>(MFh= z{@_Ob`zR>K=OifC-^=oEzm{|S+pp#S5pINymF>Sxg4%q3Ek}93!2W=g!ufa^1ooaUHPnV8gW>&P@ZaZ?OPN(Gg z$v;Oq6EOcG$zxJcFGQ22wtg3<8hh-e62$HePAs5NPSM%EQL5d>9NXHxQcRhLp~UW; z{1E=Kwu!Ij_3(*Jw@Q%tkYVrx06fQdEV+fsHc+RTY76g@io;dLbZcqHSL=GR``l8=XL z&-r>j!4r+0o_BBzZ@kqMjZ0{ziJy3RRA;IRLxFhNHL!k6D?tINlosG4qo+^GNN%@% zMUxTz+8!OXR0hh|slEML^RaSK_)ntr#$C5AD#P+=wLa>XP+nh-qE5t3i?q9Fw`EDm zs!bGwOjy`4y!GSra>_BWl0cRrDU%m1?;K@_Vnl$L ziVMJ}TPcl>fA>%15JHt`AcRqyZCV$kbCANSM}$}!VWOlS>@=TPC~#IWp|98ASpruk zQb{dJX$?;Txa>K7aVX~3o94}P$?iBXUzEtzaSv(tMUP!<|g zRso9S9eU~Ysytr$M85CX)8_XAbh{f6+VFD~iCUnT9^@JtG9MXfR;Nwg49t$v8|e}X zNh2r4olSH(ZVz4>C_xAmB{=0J(gR_DXtT@7yKi}xA4yLuucE?r`MZ9gqhBH$ITT4& z1R~DQn|7iLUyw)%s(H0YluaeGj0l_cy41Q=`=qZeSosU1ieo(8H2z%t#N zhNpW9iB-Gitt;U#Uy8y|40F51*l=>!^d3Zynjs)YqR3~n)26Z<1J?wjwBV8L_BFtdEKZvK3OEW^*x zf4#0U4ru_kFtfE89U8li_;G89(|?a@3;hgBP8byzM7dU}zrC_Cg9tDfl>NdmQ8sry zRnNO^MJVtKBVsn3%k{`8M7HJUedguZNEEpAZ$f~?;1t)`(|Qlqw>!@cuByF{joMTP z^Lp!U`jxtqd)v8~PTz!Xj~$;ipJ7HCM%cj+TbB)=DAJVF7Z>hA@40~{cc$Y<1F0;9 zXe(wH)ib7&9ChSxtt5T;EcJ_b-Zmr-0?%2-)rcfWd(mD8jE&tE`W@#F&=fI`S#@)Dh=6qLlNU*@WYot855^2{=q)@H zm~!^9t-XDM40!XefTk{d^uqzml-6xfxF33hs|ep;n9v59?E}BN!fn3+DItXAae!$F zvx`MXs0`MZ!vjaTd(Y>uK|$?>`hy3!3Huiy6OF zcx?Ps(a3z*O5K8m?T)%24F0HopkEYXw=%?DsOn|EuZ?^X{$LCBIXjC}t;2eU$oI3# zV?+e7a@~p^Wj{bXN1_=F!s863&GNI)DwBbrKiffD!ZpgkSD{18hP-#qK8L-R2aFgo zm#@YG3`qYvnI%!=hz~Uw^B`gd9TXKt$pki*9g%+<6Hjd0ED7r8~D|5LpP2rJeAe05+wi->8cO5Dh|K&uTmwY~2XoxI73tWzg zq2Ys38??IN!`y)e^Jf0%!6nx+>zN*0>kiEs0Ue+I=QXy|s;fS9%cqCCvncc9RkSLn zHtn7&t>>^NUN=22oflE_$gZuJb?!!@!mgY5iVU;^>|YLH%~KA%Pf8b)t996_OrQyZ z&Zy-yneCYnc^H~w+`1iB(vI-8Ylo(FOd8O4-5dP5UvnG|pksUK}?XD_)+GCE_ z#^#i6qqvxEQ9v2LRK1o|Ht9}Z!7c3z*TzO}okE|B4~34!3I3kFlkJ-~UQIYzMOb72 zcza~ppfg(`f@7fJ_CSNIfP#WWkfb-qC8tJOc;|TiD2&7M_708R$3wW)S-GUHv0cQ5 zf3MCFEytN|Mca{2j*aGTy<&i&g_;ztaSHQ{Lu)VXmpAcCNM!WR?%>e^;Zo zl(}}T+0YYOUEeFf!MP!l#jn|a$lGp7aQhw*6(iF_p&v{aGA@YwoCt75;E@!a4a>CR zh(~O7s!>V#Su)8fDDbkM2Q;uR^lg8cd|=$f2gde|wZP4TJR>_QEOf*U^EI6_RtKi| zwOfy&RLc1MK!3fs*pW9df&StNpJBm7OQxr6jBcm`jY*clV?yUmp~owsW`sPpi#;sV zmVbbVqgk}I@#Wy~tR7oX^(6S5r~SP$G=7Id`n^3Z2TjR;3?%a6R@}~yQOl>Roe+h) zo3=1Ll%wmQ7v5uA=4yD$im_s2D_VA1&af#5^j_Z;wY?lcNiy-!{@4|k-sU|=GG4l| z&(yuKr*@dkE+SQbfA9$%$9e>H&y0yji1s&Q)cB>QXFoNUoSM*^?dhES z)`Pl6qiE8nXjW6zFzQpm@iJQ)1|e|af^=7r0%5SW3vOddeZ4PK;A!hXiLBg+)#7`L zmPabK(tRUSG8tbCCpegAnL#-^KF(L$&wDjWu3Em1qvZs!QnkdJy^e6rIVFNgK>)fa zLTK5u%`#2sC!r~2OUY})^L2%gQVlwFKab1m(Gw0vwA%!G&b*vkH|kbhOq*{!8`Wi7$kaE%4iZk3+1YfFB#dIqLpj9%Px?+BpCP&Qk~L2EtLzcQS`E^)f7l^ zs|6D2eCp+5;)1-9J7$$zYE?s@-*^K9Lm&M7!GR~8g9|Uaq*EnR4G^1;2%4<X1sfA9-lW=ziXz`(*HN;8eP^djbdI)z* znL0dH8Z8cR&{R;3^D`bY0D4un!GKO;TFre85c^41*b*&k_4P#(+`&C<>=%k4 z?n7O~xqZRXAIu^Jn}OHj`rL;)L3LO@jX-RAEXP?M=j2%XSO?XVK|#`M*bU${b>RW0-_Cl%mf`>hI?rh# zg|=G^*_sS0N)pm*BzFUFu=|;4De1TILhHW4rw&F0k%0!@>!GzepOrv3NzgZ{CYU)W<;-npR87&qGptqj|%FL+#=Y7%3T~c z#!R;?1jn`?V07Tbk5zk24AB#bCM|r(oncp(E(Ax05utKkd?aB!$;SMN@C9j3o=;Zw zv!aB!j~pR$Rq~V`7SOAQ+7pwig9x!MQULWD9!Pkh>JQrA63>UYjvP^O5oNc>4Z%sl ztk2tHkgCgj?WA&UYgWsox)Qrq=0^!r?rTrv!Y9WOLnYrNyZ8iEg$I(9E#x@bFdC3v zZO!S>xjrcaWKJn3#N45!D1kVTv`6Mmv|jjXgQayNH!} zA_1k68>14I|LyhN#LkZiz>Q74N6Krz>BsX_lB}->bm}}B#PRESlI!@C8jG(RaO?IM z#!Tt{-g(m&iFfbEYa6vP=gLmkiVX{$`=^csD6mC>*UUg}Q7D5t+I4 z7Wc7PKgBHP#Vx!?OGO1KY&wq%wXvaQd3gH#vjJ4QEUk{+L~nv*uKr0eN@btV#vXt{ zt&>;p%6UT#rh|0>i8*oZSCmTljzwFS)38awBR8<#lBvxIxB5CqWPd14YShD$a>1&t z?y2V;n$dbxbys!k*OqQkZBxH+yr1)&C-KLjWljxqvDJxoSU}Wdbb1z&K}q4g$S7DC zj7=eISt0!|z5H`99=KMn)6mzpmb4WpP24qQaf5aCZVz|{Kxn%sUx1=N*w>xwG!{=Z z#0#rywsjtv>-w=4D|56^9G(t8vfTyIg9OWiE-?DN?nYKwX*KrA|NqCzxQc)E(FF&OrR^O@!elHb>yzpFIlNUe+7FBHE zbGBtPxIve)x?Bzu;g#$11rlaOD5=DK!ht?08@A0Jf| zX-xl0s$%{JE9U>5AYuNS0Q+Zx?sv>^>y92j4?(LNq1*4s)|J+jYiy?~1v zzb)U#rX2!){QDJ7zgJ&2eV^Wqo((>q2i>dJ{it70=ljEVv`S?SzlP6WCSa9Rp8b^K zr2Ir-*UB0gYzdvqS2!CUFZZttXhemhr2MKskhFMxzIXV&ZN| zt{@Zd=2(cj;MbN`kabZ5oIflwpDlfc)p9SEt?ry39o_8!_)+Z0m8qw+_3Ll#xGqba z45tY%-+Fbo2nh(6JEq^;4sb{eD>3hPI!lE_)9=6WpNg6A$;KV*$cFTUa8TXER`tHgJETDFa`&L>kW|q5unPSs#kAAINXAt* zY8qWc@38GJX95*zx14jneaBUQxM@>4Pj0Y(J&5=UC@}5Caao%7L^bc0r3tQ*D(05X z|0wor8TtO&G-B~u%`RSxcuL#Djb-Yio|fx&dQoTx5CSnho^3|I4WQMl$e4lDheHk( zxL&ARR7#RXRGdp#!6U%>`HgbdRQAQqxL5@h{WL(MPtK=*v;cclRNiRJMDi4yg_xYh zngu@>=V#?z+tgp>hf9vYQWbBv3gOkin|yDkXyJq!@dA~|@dam}=iVLWj{%zHuU;Vr zBukD8@C&HeNfUm|^+*kPAm#33mR&mUp@s!qOzg!4aT*Hcb#PEk(uG8UwOAlIz`)hf z@lm<8U*VEQfh%mGA0`9F3?iXPcaKkq-S2Ot;RfNHyg~ye8uK*`?D@#5j5#18Zv92_ zmtgTmqS@L?$Z&G=(@OjX=cObwN{+k9^n{L%zjvZ!*~=2n;LQ1oU;ovXs6n+{+DhIe zUdu}}+YFov)CQqQU`{l72v=0AZCTzb_}r!IjG#K{Y~a z(Z^5xIM8LpAT)_L>;E8yX7HVsH@t_B=ChB>JQ*r~7riG5;|d1HUOys@TMHRu0wYVi@lF=`6~%ed$< zmdNzNhD`{!V3Ne-7v2SR?N;M#TrMY{pQZjA#=F_c#AwSMMzhuR`)Zn<%^k=$Lt{*> zBlEJZv(-~#;Zu?=o4!1)2g0{WzwTeAX0Sr{F*cv#bc`~}F`MW8vcpO7>%}hX$(=47 zX7r9V>OX;*hb=E+e#eUm8H^)K`G;`__nA6fXj&@I^l3D~9Pu(<0ypSYE!ln`E%(uT zqQ+ID4f(vkH9YYjy4j1-zGj*_m|IAd)hV=O_H-&u;4}z(iZ~Gb>6ktVU_C zVSI;`7Zhtp$DU{-OCku&)g~A^l z9Hxe>N$$M1nN?mjCJAPRbCIV!ExS$rILK#Xj=Y~$`1g`lj zO9km@L+2T_fDHAWW|mnLX2NLaw70`p&dh=EVehMA+D$RMcP9Reoph$<`*;55x%;o$ zCEw^z`xTRi= zWWvFg7U~6!Wdp@TGlDU#gtQ4%@RYF27zk`osyG;YtZ;Za2OE6UH}SXA6$gzZ13&B7 z%A>5^%t(+#!J>jO>5Y_qXe{*?f}=`k5LP@4YN0;R(dn0NUkU?= zi5K$0%5A~0q8DMBb?9Q2oJTQW?6R2x~xR-2)>y7+(AAR zp3N|{UPCp)+5G~_LedOoZB;jb(;Gmc|F;$*xQBd{O;8}h4SJ{ttnEPm%pk455+8PP!;k{P@P!pCPnM_oIzUaUZ z3;NjhlI2DYujAsZP@#rMAOuwCf%96h!hO^^aPCojY52t%P;W8F22oCML_|G4WFrxhy|o=b4)ckke$4_mm-C6=|Tfj=`(L zG2x^Dss`n8aO2!#0VXMNG|Bx`$|Tas{?MekR-rC{K@)FtIWE(>`J{>lxpW1rCl%~7 z4)%>z5NCX>KsdF`h68IU#4*Z9lAwSR7oQpp+k`ggUBFtuM~}xFgz+#;|BS<1q#msQ>q-5h;a=exgg`q?mP#Zd!-|E+d5p{ zSIZ_$w_=3N)#79ma{)Pq=Y!ATL4vBpK_S0y=Y$g*+`qD1p4(m>2&Xyv;wJfXVxPIS zW=Rv2w69w<1J93KDhuFBvd8c`Dv3V>luXyDiD6K)`jWn>thGqlvmH?f((LL*Kz>(l zor>keMH7Ws-+Jmb$)C*LaJ?6F;(0~O+RzJkff7Cq56psJ_$`yMy#~iY2I^z-<95KA zh8cLJ4PmnGS`a^6Am~&8!t1wlUs&QVM>g5<11AU)%@H8zvAX_WS#r-3Qz|mcO#*T^%!Di<)e?xgAM{ozbPy5f8?D;ex<$JRzhegYQ zw=}EP)|Rf{qfbgVR1}q(6bS<4v9fr769*&SkVI$DorrSr1(!L~88QYI_QxV}PJl0X zAS22tjfO=}mrsHGocDxa8H-yM7874IGj#IcGq!FNrZsW4u%Rg9sE5RA4qt`A##hb^ z8!)>UiGtuyI>SF%3Lu&||$#upC4L9r8<9NmA0>3KHV z>ccD8^Vt%5*y1(eN-@f*0Yvh3Qd+}YbvKdPKCz7!(}5ue{1uhgh-r(YNX0}m644Nt zF~kshfgTUumr=5hs~D!FP@5pDNR$Wmu|NfGtAH<>IPkijY@EMaWty5Yun4ks z#73dOh)T^+Y)8(R*l?|dR)DM~G+YuE4J%AzJSbDcU{RC0C5ABypDMG8EM*vhegD$9 z@ux#2OZq|#1>N>=@T5_L>u+ky@D$o?Q=#G5uKZQWUvP8?SyrFrX!*WK!cxTt1a*Qh z0u46E{PkxYTZ;lkg0?Tx0s=a{27#cMJ+NIMCe9g(rE(jbz9lxp$2q|8heRv;?X?_& zg3<-;MGKt6wQQ{t)G*Ec)D*viyT@0%j=rv$uCvj{Y;lZee)LCSU zt0jI&QJ`w(s`;CXfgHFN{dAEKO})G6(U?&6laKA>hVDwY-0}0E1K57>s{X1B3wpY3 zVjVu~mf7%Ganl~Wla)(lZw58jc3*Wlib>>TN5*afmq`wGpAW~yV3$jyNLKUY&!=`* zR@RPu)HM823$Cbl3H#Ms!=Vie^5hq`;mA}(`A$u|w`)u=8dZ@O!FEIju{T@(pkNKE#z-wmD;Tjzq)`L5NMD@>Pqh7n^{G5_`qO zfsOOPo~*&Jk|b!FHRxidpDpHp`4`^!I5D+N)&__;n)rU3ewhk5KCyt7E|2F+L1!B0+Qve$oUm24E!tmaS9Gp6KF-~`iNP(k1Mo3P$0)y>(ff6HrkjY?Kw!?v2UgR zy8HvT)>>j@2CfTb%7QZa+4y#Hn$DX1J*wi6-ka?jTvtOFtOkWE1^!;Bn-=|p%@+K= zs#o}r4?vz!Qp2xqw7aAvQtHo}jniQb<-N8c-dOSPYlX_2x7~KpJ23DVekgu@d-wpF z(48pwmx{zcIBNe%B=HZu_D_=dPm=imc#`;UY3zSUTmQ+n{oj)$X8!A8@rPdfhhF=K zUi&9W{3l8L|3690{11N1KYXCSDXo8ep#S0nefji({!Uo`TOa7lzx9Fsf!+8w6^YE8 z|7B)*_#aW?9ksJ%HV4R(t?8kd>^7VEAy;#r#Pc94+6Z%_vG}B|vECg}{{n&VHU*;% zHZ}TRK#%s*{p|sx$Bp~XKi_U`b-h2{jvMbhJs%ug^}Bewb$Q=>JzwrDU7yXKe;NXG z`RNWyIrZN)PQ@9`7hcw`!w4fA4-bde&adW<$!Sbf7k=HpT_Mw0JtCr)g^IT!NvU!ue#S zpTH=pdau43g?g&y#ElK=Qd3S0TV3h-X=9QbB_8fWXHLHJ+>}^BVs;f={P<0giyAX80=eqr z{$eY5w#*J)@QF3;0i4!C*ev1_x6`E1D+RfNI%Ni#Tha7p|k03 z&AJ(H4|Ut0PBLNvp$R`{`(Zlz$g9apUxFArpk4&#t2NpTlC6lPbQI-YL~M^n#SSv$ zz)Ys`(owY>HfwTKgy!oOJ;GcB4H#}j^0~W=`#4ExCLey_R-hE14_-+k5<;$B#MVgw zC55pn7+mh_Qs8`8`J679!US^T1ty{26ZH`Uay&L|u6Z}=JnbJJ8}&fg;fjZz4CWID z(nPxDVGGc+-AoBdTcQaW8~jQhB9742>-Nn72@nU$Ki>ozc{NV}5fuX(9z!rEdL=Uf zt#~sNd?O8shzXDka6L5UmNYaXH9#4Wiv3=S49AtwEJ@RVULg~(KIr*7(5NScN1NUh zXAbHByPUgW%}!shORfN`U&uIIfE;%!)`!Dy!JrCbpbagM&ma(C`|gtay&6nOs<~b? zBT(>Jk`oP05o*#60@#k;!aD~J1$J0WC=}#Z-a2#xhjB2qHCpK|waBJBj3~(wa@Q6G zhCp2Ntgef^B@RJ; z6))+R9WjqDMOA*J3vIz4Hk=gquBLTsT45#a%?PW9p6-t-o!JCc?G`4Xcc8sqWm}S` z+pdX>n-+Afub>Vyv-u$dcRzcs>o4#O$NV01-B`iZk9yYK0d|X%)RRg$_EL zUB!kGp&@&!ZqXDtrgEUr(ZRL(wtj>R4dz|f`W#l1rxsFn4$j#Y>v)+Pc_ z;1$iBnQViUhZ(wZ$AJPl0fhGYt1eJX6=lC;X$3T_CB{YIYDB>pPQG1i$+~AkZcLI7r#6C_nX6NoSc;tw(8pH;r#K9)GX|lJ|9-c& z!CY)2EJ{PstnE&LbZwCoBe)X~>XEb7C_s!*g74HN;`+xW(?aqO!~$EmNcw+VmfyR2 z_P22HZ6zC~k!0Po{t|ij&(1diSd7}s0Y;Df`+4yB9&nB_ry;R1(1jHDxqgi1Tm>+7 zCqBbDW49BdYBMNTiwrD1u2Lk+iTeP4l=%3{tsSr4nRF(i#BXlJ-7AXHpzN%THN~zB z=HHh1U>hhQ*BFFOaKU7=Dn#jEjorH^Z!`Xz0XBm=iJ=>;w05taTv-*tW#eHDY%+9;2>Vs z4((;_M0N&^kZZ-c!0Aivy@*T!)h1mdbb%7MZX=_lKJGYHljvx%_%j<&d}p+`_0a8^ zrKDhD_yE;Ilu!KS=|J-{5leLZ5MxPK-c9PsJ1bCPomB{H791IIbR`2CPdpT@=@19c zL|gD379M=|(JYqz#Y=2%H#O9#fwB91B8dQz4a@&-vi&(BpN5aYf{JR(+`mXkPx1D# zs6VcVu`D3{o+!4^hFZulk&__d}AT`4g_(w;TTLyTfz}b&+oztyy;M z#5bO+&$BX4vRAKMdg(>Z8ZK?u&}nY%ls5AS_GRul2IiDVDHIJ7A>l~=&fWP-lvd$G z`uKB(c&Hpk(FfCz1?lCR6tH+Y@>zXpmh{xg*U5`gNi>P$#~I5f*jxk zW*V-oIqNuzw{nV9dF`oyAFy>A$}e-%Wiy{z|M}x>ws3PQL-1C9(9TPG0x-`eul(k2 z30NtqXwp$-p04cq_N~9m{(ylsf49O8*Epa8Cqx`tLe}Mh*&f$qI9Yk&q<6)5v`85h zPVY=nuAiC9z0{af0_IM31q}M^BN!yRn1QyAxlW--zh=}w@uMa37ifToU8RZtSeXP( zDM2hq!UxyEg-hu1la*t!cI@6gYg#dXA@T4?pgGSv!ng98N8!mEg$>2 z88QB2MPk75#}oXi>MNYBAwAe}!Gj2)LCDL8>uYq+49V#E8H5PqJwZ&~iOrUZ-fE2W zBm%`l9E{~(e-%?O!(`&IqiyV!v4&6S7u=Y{eU1iPhc*^533?T6?#q=vFO$kMr=$-g zSn0kj>_>!L6(duOP*w5bMwamwe*SusLQ&)>s|*rAN340bk~yS@1X~h^CC5dyOAS=) z_jbQ6oD~xSiP2?Ul}TRAX2y*8 zUj_%bf1m8>5oNU13??%F;{L6)ueX}fH~rnUuiBO!f(msFyoiIY;f4Y9BBT`hydga) z`mF0Tz$=i2u?=Cz(uOK7Z8;Xa&vAwB#Ge#Rmd=3sSG|Ds-=BaPKP2do$SjOI8N8f7 zv;NJ1y{#7BAsu4!fCs+-nRu4zrS?u*Ua`+Lk->#|z^T7%$Iqq=DhequvhxpxCb`n} z+F4k3yPHeN^Fa3t_L9C~g8Gisd8U6Yo_!j=mC?)Us>X%Z%n6rG!!e-rRZ?w^&=6UJ z+!`9E6DeKC^mmAG=lJ<*dgU2co={w`=|nMD9?wRoe17Xx^{*zk~{`nn%tUA+rM_LM{kz=bbRi>i$b(lxK*N>Jk zz*i4TpdN;tk_i{-vicMK5+}ZZcla`-^jFtnN#|C(-N3U(M6_KP)Kv3wAED=}fR;-Y z=P<4ya9w>1cCQlPk0gN=x4SgQ8<+n;&|Bo0Vteniu{{`)-t82H}g5vX;%OJY7Y%MeORUV*+A*;`9 zlUUds5+Ildw6$clNw_B7wO~Fyq$W|(7w=n;McN>L?<^WBBtFdg8K*Lxdv=fbz}fn8 z_MLDh_w4hCu(I>)?dk4*g79!utu!{J9Y z;Yt|O>vi*byZ1(;{SmMG;ppjTiDQXd;Jk`LI;peUEaFHrekS}P?Nh10V(xus-}xCK zJKw$E_FXssN~4Z>%GzG>UJfDa!ns0&`98H%3$W?+*310L@zTtMM6J*F)wk9){prd2 zrFh-DNq@(?jDvr*)>kvNGIQ#)Om2s>)2^lenZ-;ou31a*B?=5FTxj11s7JFWC+GFS zAd7`jb%sO7v?Hz^sCJUU&nG1tbnwTqYwwP4sQAFl#yJ5YGz2JRI|eaQHzYatp`(U6 z!h2ToM9+~AkiSGW?Kb4Kr%#DYSjLrdK&oYs{$r}CIT__5@5kNw3p(L%gAW!Zefv$# zgVOH8w^&pj3Kh9XnUudNpE$ni**RS=fQ_sii{;H7v{djCGy|_oc zIMW~5G!?HND_j=C7fS4+(kfxq{B>=W}D zJgPcd6UE82&t^q8M9m=GDmmPxg?LOFjdBmh2C37q6_|?Vc=)DqYFe1A&Tot~zK;}1 zVh##5!Y`Blw5Cz|wy3dxay7Q4pZg$B$T8F6w$%7J7LT}u50aR${{=h0Jt3}~Nmwxh zBp@FcssAo&LLCb#1qh5b)J%h=jE}5KH5w=4K29d^D~b4YHDB;gPgFat^A@10*ZqtX z(=|n8J>iTaXbfukg^A(?jh$)?T} zti}~FC&aT8Mc9Q}H*Yrw-lQK0!E2crapEFyq@nek$v42E$2=G$QqaJ_SziZIdikOO z)cHstIGmV5{nsF&_D=^>c6Ll?z{HtRfeG_{M{X&jIOj(y{}+4b6lB@jt?9IF+qUh@ zO53*W%u3s~ZQEw0ZD&?i+V1*yUz~j+PVDnXcSoO_x?6LNd9l73bB=Gt`^@(pMW2h# zKdz`@lm*sJ1DP1vxxqlCw8*U?*wEq{*H%&BF=2+5EiNiAKF3StHojEcQaf?MSn@ob z{F#{hs&=I>*6?q6zI>tqp(*yX^*3SK3F}OxFp8aEP1pwnVvUKlp(MZ#0?%@&G}PH+ z=w%AQC!`GuqsAF|^~>)Gu!zJ)XtMF1F?^VOUmlTw;{_0AP->A^1*rAoUk#U!3>qEr4l?uG`R2iA@xUreq`4-W%;@U~+9snz-F zlDd}Ldj3e9qK!@h^iI&Ni=ojVOojHDbl=gsNErNMvSHZ#RJSairTz3<1PlBjSYWrJ z)YZ+eJ7g2#7-2Bo7vQ_+V;*lO4{s-qLk6jSBXf}HK4?Z{9ggj=;n48zIOymVFl@X& zjWxG?G$8x-r<`ELlkH$#h*CQ2RsWa02WkL zCsj=ikRuc-SIcdb*fLIcuc|JKo|0iYFW)3x@JT?f)S<#VAc{oxk zpx{i%M=qdNpZ3z3vjtmPwf%mvpjIFhxB!zpWM$?g}jVmF1AQtRsM55l5g9HTb&keH1eW?5) zl8z7~Og2lA#(+poH78>Pif01KL4NiJVOlzNfR>u{D+56qtP3QJcM+sKp)^W@Q`mz> z>d3F53_37-|6aV6E;_LVLmN=vkBVePI!B8r6FQ{L_hQE!%*gTh?2rmnZh~kdo0(~C z1^Qo82O-~T_iCD%TBq#I5jIt}Hk4O)6tp%3k|yBNet;Q@WV65uGQ!)EF(k$CaNLGv z^vAllJv50Q`in0*JF;8Nott8w{@wy^Y<+t@Rd_Ee${mLgvE6xAH^w~-#3-1m%uoI3-egVvk57W|4?_b8R&n876x#0^4LfmO^ONs4@;bVsrWw?`1!>Fh znD=hIUH|n%d&vgxDo@-G)|4zDy{reM6inZNnb~3ZdJ3e6S5=q&3IZc1y$=<@fP&Xx zcSLbGsK{3fe&%QDt$S482dE{$3Mm`k?7I(U95IZPJTRG`pbl4_xYP7LOP@G1xso23 zu{j+`YWWqWG0kNBi8(o_u>~C!`M0~yGbbEF9d+i5iXqYKdPL_MT+j)8A2%Y@kt>i)@WlN zJWZY9hkIV%8#>+~zMAW2AP%N$8?lMCW-4Lz?-=|Tn%gaP zBZk1)mxh;(Wp-FDf=t`M{c(zEl2pSMyJY)yfA#ie`Bc&&N=QcFT5;Z3BOFE?X-k&% z3MiW5cfJMEvJxD3ci=%M4D;_T5P zA=|G(1{k0m1!K~2=ylQ1?&(^8Hl$Pkrf8|DKB%i}h*$WIV-S`$B@zPflMKGBxyAdV zN@y4~IfU6xVIW@W=oc!g7#_f0ZlLrXm-rmZtswU`bD?JfLSEH_UCSZ4@F&~(=XY~% z3Bk9yRx=*B8W0 zTex!Bj(E|xK-PkItpLz4?4R7Wl+NW@a6d$42awP(aA2tz0-a(MLM%W>0-4#3s7@U* zY&8nZl8Y*job64Spo%Bafkp;khf{^^&%gkHdUR#M!6^;|SfG!25x${Mo$a0)q zF4%Na+GS;u^3}1VapuHLs?L`CnLrI8rGVkUULMuS%CJdO!{TLWKzkykl#XL;2I$U^ zKqmqrrBsgBX|`uyS3<$B! z?2zU4k8;uII(H5Km zi)FPYR2V_MDtw>7XBlr{79#V(N9|~f^vBa#cNGC@I@w81I1j5;Go@};W zCfzc06SD@5Qx;V+#X*og48-$Ado`I^;`pfy%&Rv-N?{*6jd7# zDzEve0G+Ch|1giTx{}R6tP*)FCAuznU@FqCbso_YHKxvi<=JW+Swi`|1~1E_R!lBW z!Y1e<(|9jRm3)?vy)b)6Dc)9t8)WFNUuYJ0$)4{V_^jFqoK7}Tpg`Ktbnq$pR2i}e z()>C4D!C^`i$= zGi)~c9G%YnDaRQr+Z8;qn;klBjh}S?+SI?Eoo@Eh?{=3mdbnNvKB?agZBg!Q3)_3* z3)rZ^9PqzFHB5gCbNF{O-#@74532ctYW~Mj&0p%(|99)eU(MnVs`-Oz{-ByasOAr< z`9DWBOn)=1{)csf>944$Kh}xATPOY%_s;Z}rR1Mb4GY6Rp_;$0>wg=e#lpnN{&!T< zt@9sK*h=Z+xfo?OAsjc(Sn9V}vRTkqI=OL6;Ui?oGuBgx$8GMep8NnPIU*c{ozxXZz=F8XsIe8r#;zcD{dqx9-%@_MxgNoIHqJ8pIz(*TaiAXpM}Wd>eLc z@8JKuxEWOSxp%5>qg&>GN8sh>4bRcT!Nd6yDWH*ccXn`c7bpPvBt?|mCB_=(iCj3{ zhtuqSmJ!2e4+WQ`al|6MW_%YnZ~AQeT6>8c44l+p`6BLkKDyq80V@Y1D&j?wq1ZHv zP8te2nH&8X+fb=@B5vK%m0{NSVA5kdzV&kS%k{yY zJ=E*6)d>y(GBf+MH_`>9mb@}_|1o4+}aIgt_Bx{c_0Z=v@(cr-g4fzSx06_5uvzm$QH;CHAK8>DNex0X|i zaAcsF?+z}UMiy5f8?B^Auy2W=wH4wI@ZXYTiyRU}iO?Af5#yz<&-br)dw0a1LctS$ ze(o7+{sc5fm?@w(iJ-p{V3*7gE3GV33^;wR&iK@m)6EeJPgg3a3cFG7yC6Wp5S?W) zMFdTrH`?;vaNxEm3kvJY+mK2xsrS%in5O}5BrgV*uU#i>;$NcM+d9aaR^3p9KT(_} z&)h0c9oFprZ155fYz0*q2SWS-KkS@zt0l(3F#N z1e#gK88Aq7t?e?BN(0GeR1&&XH|BLB;>uB#0g>D1IZqFpTyu(hrfsVwhT8Xe%^TA0 z6F)za`ta!X?@dnBN^Aju_THu)u< z9?)vNivfBSXxK}``!f}>Sd-J1I{m#G6>;TQJ3nHJmNVLBB8)=;RD#CRXon_!k!L!% z6kvopxE)sYw(ELXq?j>Jc=mUp2+b90x~zq<`K~e;w`iI(EbzDNGm;k`&bl0oj%@j# zfEI`!nSx3BlkPk$8dvmJx&2)vBWDrP=7+!&U4=nI!eB*|{r$>viZ;O|7K3KP1Fpz4 z{J;iQ!GJ`J?00z^X|SFzGL_y;KLCD0D%I>uKLpXFaO3_AO5p-WcmqD=OjOuTW9TokF8E%dI1HUplb406%LYlzzgX+)@I&@3Ix8FA5bkykdY6{fgQ z9RfjPJ$fGLkmfG1E>JT_=e~6v8<=MDuYZcnF(gTB2d+YvWFHr)*WU|lKd5Mxr=s5W z52pe%9H{UpjXru=i%hL$RKINd2}?b*QP(A7l0;}O>WnG$q>@S)_L#s=m}8sXZgfRJ zD~CbE8e-YbEdaCVhyq=4bQ#B>KIx`!%@;sq|K@84f*G84D0F>G4g=&y9}c#W#7g`@ zUEnAa1PHyG1}U@T<{Put4-j=d>IIuuO6syeWsEIv0oR0l|bxwjB*V_?CD6%-B*{-hTm<5fU26ErYP@u`xiZwd-*QqV~J@BNixPA8qDUl{JD=>z)a~igtWdeg)I=YBO&~RQFrO znfxvfi%Ah-hw*(jsG&{pD5+Ab4Q92%4X> zT28+Z^AM{sAdl-2mbE_tBZe@lpPJfvQ~v_XG8HDvQ8rh z*H|6)!PH016VW2CbYxyyoE~B$+Je42mLE&BQEqg&C~?@ z*S-%P^%YJhwUfxmRP;OaHf-O(2dZS?c;e=HCYf#6CaYfJ>r9Qd zFzesg*}ChTlt~EeDfg?sUgn%vc`)IMnF-we`nw!tOCpCsK(MEuomaDD!Hwq)u=ih} z&gwWb;g+l|TJvSUg-*XX>yzOwYlV1Xpa1R{7;K0DS`*4a4YCb;pj=eh#={;OPNYt2)5)7# zMk~MlatZB;(p#|GDv~AI^4wUDztRr@g$$1FK>LvU8>IVXf!)7%8`}wIrkP140L0Ie zWU%GIjt)YrLbyToxN$VX-}&R0iQtN1LzeZ?e_;O;F`!m#@r!6fo#SV|?t z07MF$k=b)#+&|0DBg%tE6f>DZPao>gB{+jD`nOF5c(x_+#WsOeN6}fG_WW!DThpx! zh7G^moRDD+1k+h{WVnvM9Cov0@v2pyhzFh)b>a)IqL5t z^315D`b5!EFXKeNeOip%CLp2GH={&bMop%LkNWXedjbJuImqlw9}B6+rpHPo1sPNw zk*2qb$gpMbP}C@zC(RU<3!W4c=Z-h9nhD2%aI|S&Qs=gn%fkvhef#0u%U)Qu<~f)t zK2qzBQ8wjz!bAY&cp10#5UP&DK%%tECRi050&Emz0I=$EL+nN8iZLL2D;ZRAISl}! z>hgl8B!ltNAW(wY462xv31@igGDF~gl8UhsWOHHEkLbxjss?~6O{L-b#9?52a~afb z&;wCa4*;a<^8M>m&ID4-gnfOikP5VEMeel*``eW#-U^d zNO%cHIm;J7#HY|ZHzn-1JZCZZeAb2|}K*HBe=J&2z=B0JX%mDv##u#8!*BM#w zZjm-xgYB%c-q{+k_-b#Kvg}i^DF5Mtgw7c6s%V)Ti?HC+dy7Z_I$m;Agv7YH<@N@F z17nG0$c0$z9TaRD_xprywCyy;3@+?izS3ZOWEYpNfP1#uF zJX}y1)k49ns^vwe-kOM9lo?AAoDi!ybX1DVCT|xz;@t1sD33ejA4_Obbkx|@@OeEH zRd;-Ei>mnf_!WD1@`5|M{5w;Esg&_}Q&h&TDzR%9OR*R7YYMu%RA`+|Y@QG7R6xCY z?VpGO+;E%6-AFqhj4SjQ$|{`cuXb}nH;SpseTt8Lz1~ENJ;hagpRgE1==25%IZ9yD zbyFn1Jmle>Dnl5Jrem4>=D7t@60K7Xw#3 zcci?3tET;q_5r_f)F>gOl2<3TGVi@wrg`5vaNeQLO@W!NgZ^{gl)cw-Vlv>h8+9T4 zm!nM*1nM5v!P{yDN%aHmc%S^m;`eQ-&aW=36b*6mHr$U)Vf7b1^Q&p@%=<|fW?%P! zLnNh$jzbR>NqjcS|FmW;%oLI-$p-cZpip_r&4K`ER_SilH!+k8-Fbrr5I^`1+z z5GRKkJ4k}^w7s&m@Tx^V;um4obT-+iaW1eTln+|Ci7~2i%kBL1G}+MD@GPel1unOC zN%~V0C4i-N>|b50d^J}ywRkPBZrKb`)yV#Z3>kN5Hc^+w@K6yT0HEd#WE57C&l_vQ zFO4hoKjcZAxsV#;FKF@JwF;s@1&S;Eym^QB0U3_d*A?K()D5{PnmY<*J4z|a0CaQ6%ejE}={pvdmJW0rdR=T}2`Dr(k@eZ@ zH?s!_IOArI!36c7yG0E&SA$1QywLOA{`a4{0Z;0H5zd{Bs#A-b8ZJ~Jb=%O}9+4Pp zkyB?;YS|C6)k!QMkvSX=X=wCY9U@OW5_m+8{^YVgi$SawZuVJ#CN_>9Mknp9Gex7S zkrww*cc7qasm#Ul=dVb238*BWRzeLpaTaH{sw!*_FiQ zGgTb3bN6m=p4?$WTiWBrPm_V_VePl1u8@k1cu%x*Rh>o(aOdr=MwO&t2WHJmO0=-3 zYZt?Fm?C%-@p>{8m{%j_YT;O;Aw@N-hFK7jyC#=s2N;n?32R}T=_3oFQloh*5$uI) zRw5f*X&m4o8pQ74KsrQ=^RRsi`4ZV8+Uz`N+;y%_4lt5$w+*%hwTE>sa5mXmIKh%D zve)R^-BUM68Ch`h=v3Eg?C)mo31>Z9G#a6uiy4;>vFnCjOth)eyeO5m!KPj%qVyZ* zxTA&P6sVp*eq+?UjXe>?a==v^!r|ITCk|Hhxi^si>|2m1Yiet)3fAL#c7 z`u$%(zrVTS{|5d3$_4ua{r(R9*cpC9zrTEI{|NmU{}KBA&CL7{d1*{69Dj#?&Dt7v zIP6Hi=y_iPhZbb&&F+m}?AQd$2Gn7VkDh)!7#on$5yLf{Uq>FjA8kEbiMhU9UnaeJJHG3i@lPj}TL-x(l~=KuckJhH7lWR? zTfAAlZ;u97c-`w&S8Ox$`Q1BTs%a9`Pp&xfE$yx>PgE`WLGOte>;(bLlYL-+Q0Cyxtp{ zZ15hxSr9VSw_Sg?%L)JRsrTCC@pg<|dCCm^-X`8l7diZDFn+qf@%qw+x+1-JM+f%GJx8 zTpcFBRP52;TskR3y3AE)>6MeZgxA~~z>gx)Vh-fi)T87gVEv;JFcULUFJyWQbDE;@ zPH(G64+2?dw+@pQ+ZlcG)0Ma53&h1s$c%-&LOy*r2$THzWcq9zpFbgV0eR5pt3^Kb zt?!Z`JyEMPf?e;|wsA3Y0~_q45m`inrdatB@suJnz(Uk*2Pi$ z%4NAx&xw@<6J9g|C~^HI2+8bFSdXP^O1P=m)2AXrQ6ph2+jL2!LX(lZ4943{MR;n- zv5&{1Mc?&e(q1Y_eVS3oJrJtu3{6vI(Gl&@l2;WuOiI-hLK7XD^d_&;wN2T{F^MPj z7lUW*SEL_Xi8+rSsM~nqM>bA#qTQ!VN~+pbV<-yRW&!H)Yvj8HlW3#ryEZ8Y?ZT`! zjNAtm`kRCLqQ`7A4m@$HgE`K^h41f_E*rzpeG@`ruH9$A`yB|bn(-RMcawWBxL&du zdUJ*_)sa(+6@A5pfp|Uk&CUvU!}Xf*db7j^`abOI^`A$>Gp$>Jc?*w=$2>+Ed( zAe$gI(L#8p6ikJ}6Q^)_eSpete!eAYsOM!bFt#>X;z~73dx?6L=xX$KzN7Xx znD!cWWx>=kwF&CbASr{k*~=cPhk1ISXkM)~R3TejZC+KI@K=(nUN%I~I2Rqf>VS0w zJaq)?6J&YruIAqw2PVrhOjKeO+yo$gx_F6KOXnDaw2c?VT*Aj-0>W(&BS`fk_Vwpc z!D1H~*Ds3wmST~xp#WQi#}TTa6I%&5e$ab-=>ty4<)}2k=#Z?^krq~5%DX0I{hADo0yNTLWo{0%}$HSA+!iKeqc-FY2p6&%!9M z5*{lx`$Djr>IMUKBB_uR5jVS5>%N)kg z(p4%36$f9^rTP)3U4De+ZZCqgCD=%fhQW15^b)^Ysxu5%T>(RNn{btw$%1#Z@L}Pa zWbt^t15yP}9!fj}ggP8T2viLdYU>4x=Y@jm0_6%`1pH~&T%C!wU(54wsLp9rVxjRuY; z8$Cw{Y~~?MOvEar#f&l+-}if0;iKP)XzSr13~AZ&!_M`}u0$ft*RH|~XA~8Kw!&n0 z+qULxxF#+QAjZKH;WPeuJmNqQ*Bh|3rhU71>{u8jzw4a9bl*D}wQFOHZbQxy;L?LC zZBA+Vl>oQt{DzampN6lGz&3yTXyEh^8LZd$p!^JG{SD&8g74w*ew=$g?`fa^K=V(9 zW&5T3UKw5KWKbE}?{&tC*10AMEBtmtGjrwE{0Uq={iGHO4|D9X>X zjAU_-&KZdpEr#eT$Dsg4nX6ka*QQ#ljovEJA!ZeuOzJNR(X~peDaR@`;Xt#F&8%_3 zsx$#iBh)lqwANgX-964I63?G@rZT0PA;GWbFj|_l0w~h`D30??@B6Vvtdfvj`E$?p zhjgiPslSj>fT+=|DM#~@6+sN>#@CCpP%SG105c6xwwoM6U~~jLD=P@o^!(AnOGgAh zyk2pA#i3SH-hw^NDP8W5i{=tg zeX@|8yFEO11P@yYbE!klT-gOyY#809`UtaV_*fi>{QZf57sF>BD7V;T{1AHOUp!E% zeq(#~8rl=0X-wLl68T{!2q?|n7R3kdc7uag0n7~aDaC5xw!?MVGM#P z5_p+~0LSLpgy}u_ogY%}F{3pL$7Pa;t{L$eE3f2~*06 z*RRGe+o#+Vv#HkBrJ?=7ma2n{+u8|qy}*xbgnFwBbuQ`;vZv%R1=pK0^l zTSu<|M4(GBb$l_8NvFN_pI>`Oh+VMMmBmK@pjTLh+3Z?uxWr|QzPKY7`HAR_$AAi~ z2wK$06o86SWC*Y|4eGWNeT}2~Z?TkUg)(|%)>VNcq0$6&4}{-XD3QaCcLDHpG^r3$ z+b7vFQ=mj5_tZUkH$Yg-(clUfK$Tuv2(u@gFxn+!}V`-Ev!E z`SU2&oRg+3K~H3o&d^n=lC9a{0^)zzvM$pe+kM^bP*5=fQ#~c1;@4*?CZP_XI*jA` z%K&S|G z62`4^1G6F*&U#ue3z$!JtR@A{3p!opp-4y`7v&jl2Lq#mPqB%YGK_S#e?rKSjG6I^P8MKq$z_cCF2X2CRmCEnNh3^vXoy!7{dvKiPWU{d)(!34IUc> zz&s-X@R>nOi{)U(3yDSKEUt;01!kv9?f|0s5S*ZHUJs%^(ek^31#%cedJL#4ig^{- zb?mnvyAIsJqbex5!QYYU^0c&N$c`eu3o!&fi^Gx``F+QNNEif{G;?81FHW~HN;iK_ zh+gOzI06#)3H`mMwMr}nb}}wmAyjx#4TYf|AG8_(#o;~APH!g>rCk1u+hYi&zLi={ zny8Xm9l6nK^g1w~z*@a`{CW@hi2qXC|62;kzatXHqqwW7EZJ&jJk@+v9(?4qa zO#h_q|8-seTSE^sGZVvq*7koJdRmZtpQ65iOXL*EOTwx9b8>zh&X-)U@LC+Sz{}#B zr`IoO77#OzAMWJp_$5iix6L{x#M8w0?GGB(s>`3qu|M4E)R&F7?&R=SpBp-8=_XFz zMgIJ}x{I87I(j+ZH*Kf;Y0}L1{cf*fPCHL*GVW-<)`}c?M;8M;BP>wg3 z_dy9LpGrbXZ9@_%=OXcus7;rGG$}qGH?CAUsC2jXgo5kG0U{n>K?RXO;_UdV&qS3yfyM* zSd4KmL7F4=&i>n= z@Jn}D+Ec}SVwhbNRr48ua$Xz+UbrzvxGOK0e8>*IAgU`ctB){dBB7Op`vENu~@h6EbWq?jnGK zkuGabg}tiqJwS${hL&y+vb3v}B7*A|+ch?dlg*}2kngDv)fX^TAAamI(8e5@K5WN2 z>H#4acT>J=Bz%`YxkS97D!woIAjmn9n7D&)V{GR=bje%4;N9Ug2OgGt-vQ3v6 z?pd0b?lJbeW2$3%pMV;PUpEscM9uwkr)P$$+Q=e*u8+Be+8Id~S`#&)!LD8@hhvBo z!5g4}UfHJ8YZpnJl`21zzXwDiMZyIR392(5Z6q~9xP8 zuStC{yEUrs=?P3bzxbt5PrLJ@7b<^gw9o{>uDBs~*$;<2Um;m63;1z;EnYES- z!n{|**XM2rfFgwth(ez5QNM-Z6$64`IkzvR5rOOxBCRhUAL3h9!LT|bdW|i1B_~4w z0R2FeiW!H!>9%>!33nyBEg|6~iVd_N=+F)@k-j?99zJNlLg>>as(ix8E~kZ zf$Y@)b6u#79mFopLI$K0BqpOYh5;T73yxs~zGEk3STA#JS6y7HJ~13MfbpgzNIpoi z*N~o!vE(_?qk6{(DTMxzqzp(NCWSqIU#f$G^^mB{&;&v0QbVgfANRBCXD&hsVks-C zl2KME)WTb6I;XAS+;U5u@Zf&O*3ZuNZf1LHeYdPb;it^KXx^Ju*55x$=ip3mgxDcA z5R@5jA!@{!C+m{dEY7{wXeYAcRm_;DT((HfSywgfMw!iP_(?P~L^m`6{|9-&<{BtN zJOz`WJz_gNIxb!z#7#}x+oO#8&T{6Dg37$~UuOJBFjPu6Yw&7601xc}O0^QxC2kKA z@N;CunSQPes0-N!pC6>pbF{#v(I2Y0`|_-kJ)8wZ!{3O$LI7AFFX(g>BH;_-118FN zlSL{eRk&hBV+Jamn6b5F{}^>y>EQEPxp>KH0&cyST|RC5$m#SSG=w^CNW++E^!W-5 z(*+{Pa3l6S+DJZDs;b<0mSkx3B}at$8Jq@ZviTa^4}$8MuyB*v3ztFZ-)-MnYz`q~ zykj)RxB)hBk+;uiArZZ04M}MKR%{N!DYr-%K!1=Hw81D^XwwjR$_i7;Gk;ONuOQe! zddA#D%*&Ke{GWy6p9(u_>h@IKVd}(R^xkZcfs5h^>Z4_aKBy__Q zTiG@-H%~sB$Cc0GIUeHtf}x|Nco7#Plq~bZzz}MRSc<4^`y0Y^H&PLf6cGrlj@2q?RFDv6;2fzDiesi$y)P z%0|UK6nyP&F}ZPcQihb9kJi2g+QJBercN^U)om12^F(y;_8pO}%&R8s)R2>&hW%j4 z##FCC;UOOj9MYA`uTkZio;_IX{yzSfkL@9(<_R((ZVCl)f{4`;1RZ_GT9^Ren#V?Y{ED^%kjJW!W&#?D+xb2Owt(i9j!R&T5= z8j|QTWH~-x&nB;g37&5VGQzq>k@TXlwMlLu(j4)Pe7_D>)V{oK?o$yEJa`bOFwl?- z)9+l-fQs>emBGF(pU6TNP3Qk&hn8Z(6iVg=q8hG8!=0`mCzO6=WH>UKY&}`L%pATi zX`^nnv%NakOF55Q7`r{VVNKWWa-RmyyC=r53far^_KV&uPW3l{pPxL=tEcXD+HN^B zaoWh%?f8A8WbR?>oo#D7v)B3h_QeL$4((y_^-Z?(L?(pC%&_D4glO-9vLoxXUSP4c zZdsj@;dku7$T?7NHHz+9%!M!eo`))TG=7`H97Hb8=h$E|VsvOZMh<)8!h6;e-?7h{ zCM;I+-Qz4^syGr!15ciVa7JWoRrR7{Mj%>Beje-wj9g?n57`uIOJO)in0dIg7G^kH z_E|XrLW^iqiV%G+B(lwx6Jx@&53LUZy5!-_psZH;<(H0TcXDqIW7D=}GRF9u%EW{w zy{#f)+MK+bUPG;!WWk-tl85>=MMn>`A2_p}W+#Y4x38gLGq&Y{BYj}F!EIa6` zZFF>zkqwa9*`_{KI_e-tHMZtU$>!j~raA?`na|O{kdnXLpk)L$l?qG5CS)EiOg|Fx z2nu47+tZ|F%-*{L)0wlWk60K~e_tFdOHuG%cSct&q2!OE;ib)3U2a(&ZQ&)7xj)1H z-HZL_MKCT!hPU)n%kJBO!z1P|DS}Hzy#_~!8)@Y3?+f`^c(-3nG>G63yd~oeF{?nI zY6?q(QOiq$)rz_fL|82HBsO#EkOr?O{DLa|xvdJ$=o%SGi9JT(!UrNf&^ z5^_fBep{#i7L%+-DKhDA@_`J^^BAv9^Ny(^7y`iLz1zb4-1E!x zfPB@)5M=lM?;9ovhL}yO|7n!;kG~vqSxI zqT^%TDt4kpFOKzSoxG@xiFHTj#X)0n^(w;~$hkA%##Aqll^5-z>ALy*>gt;^W3dq! zaO`0bZ;4pVRoHM|R-i|$GHGakUsS|f&UtSZujnxmJU^S1G0T{)rqAl~^HW8aMvZ|& z35FYVb3Xnu?8TVYwP=q;0UvL!F>)(c&UZ?cZXv5%taS4g&#fYsSNy-&uGSk7 zmexP9plEpe<{9z{pSWq3xd3BvC=0Ep7J(w2-qYcFqcqW2?@qsB1mrAzZbwFBGv!nE z22XJz2;nD2;H>0jZ#??((zooe{aiSaiI0m_7~YU6%8a>*+ch;&J02?$up7^wp*d-C zSx7mR@q&9qhp1*w<7waPA!c#ECO(4}e8i8_SxJf6%)`lwA2^q{l`FlRQ7i6{5%aXK zqISPmNW59$^leZ4gl0mcP5o$wa3U!xHmA>@Ty6Rpq-$j1S)=uJA4HI4SkLSYzUZBF zoV4y0Eqr&1oTDTyx_L%9fy1WPkjH1Ewc%urRh2JZ$jEZ*?pnckKOhEVKs+NB%~Pzd z_iNV~>*WjhhdZd*f5ixx{}w;-?}&|m7{MP#@P`rnk28Y5WRw5zpvjFKaAl2f)V`9b@?|&@K?CiA4c$>7{Tv(>CAumBL0yPF#jVX_?uboAKw4xVCDQz zj6g>#c7qMg7hnG~5bwfJe2}|*t6GRO%Oi|Q;tbsB!@$`^W*88RFbp; z7m;W^?f%gI#ll|u4G#X<>)XNEp0Ae|RnN!c>)V2b*PDZzT36>bPL6Ny_WMIqr*GrO zb=^)59^BixUT+V7`ZxZ|7Prm=w;j}(oE?-Iwp8>L{#~KuFx1SqNoZ|?4}Lm^`BVu) zYLy7XyE3otcNH}J9&O#c1hpc8*M`qPNr!iauE)otqv1}K`p@pwu8uDEd~^%+fmOY5 zf`U;F>U^Zeis#wS!knKEuMstPwkwt{Jl>p}nRcay(Jwz=UL$H}LBC-a)n{ae@H2nR?Q2B(^y}7U`Au2s4M}zy#Ye^f}>h9W}GZ)W5 z*7e|?J(N?xh=2m++HYJCO{AfC`E<0MTWPr#yp0Y3ky`wFlDgfpnvh-DaV{>0wB`F0 zuBvuEl7Y`x=7t-!ri^VJH_Q@nNMp^Cd2O@ zgp$m?wkWLl=5U4;ZL9^)3x&rrG%7dm@=en6+P#b$U$4idC!h^p5z#2=_1dwt7<;CH z5X{UO!I!=DM*MHxK?{}s2ePpj_lV4$gJHOA>e2A3nJ5t9QpK7w`CrBSR!2sB*d~X1 zHj8tO52#u;R}mY7TdxsS+R2P!B3$@2%ieVA)AAB^&V8czdl(X~+fe-)8ZHQo1*Dm) zFqgjwO^OM&y5|(Bz~E7M8~h?Wg5pJ&3ZYk6@*7Bq{K?v2tTVG>`s2=f_O9guj(2kbmOX!wZ<{ zACB>r)ciWIrI|Ob4L7x0eH;WU*|6i_#%n<8@~;c%Td!yUVIv|`9X00bbAXM9Vk{zL z(2*Tb73ILNO6_nch5pck0MUXgV3Iz#D4vr#Zd_1$XboZL{kT6~TX}oiy4k@XL;@O1 z1s*Dxmx3-*gy;{W&59OS-ak)-P(J#CF~F+--pEL)ocn=P&SbcIOgtN!L#QG!;?dd3 zi*qH^ClgK-@jhDtG!kEYBEc;>~MT)(^AK)b$Q zBozJ%%#)uf19lqX!JL@V@zS0Tgi1&t0NY%nbBFQG{n^lu(?D?q5jeA62dhH%Qcjp) zKa=a{YOTy~Petn_`4c~J;5ah_1)Qv8e;(7334@8jX7MfBrm`PbFoyFQEy04X16E2V zU+F0tk2%FKGB2@*<<4xiA(yspg*bR>a=LP|c+gk;N{7<7=1`?i3zr~eSey)mT*j9+ zyr^OL*Ekj{iCE?=fbGalYMXG_Z^Z+#;hTwf$M!@M6%nvojXmkRB9BGc+^uGp_~D8j z{XTn4$M%kFe4O~Qa9$egTni|yNHCYoe8^jEk;xJC#>8pr5?#x^j(~LB^$hI@ieB2| zB8?0)ExZ8n7_B%(OjH=kTk?&~I5KxZM*yYp&FqsaM605w;Dp|FxQe(F3b^aV9Fgo8 zy{%gVdtRy@?~dDGjKsa8RxK~w15Y^9;2ag834|d{0Hc$V=BWOW4!X}diAMz1&pqO0 zeHwB0T9VRNw&<>RosN!HC{Df>y}>J_E*_z&{!fqw|3V5)PvMl2JZu^V-r$ z$h_&9DC~`ZgQW|N8NBI{lHS^2rGMWR$nk>Bt!%TyZBv+Nn2X&Hp-u{PD$MCMT&%AqEvxr7NQgV z9NfP2OsiPfy;pOV7Vo-bI52+CyaKrhCdOc$1_w`bNsyygCLxJ_(L1H{q@lSxLsx(x zh&Nv8gG;TU(W}$p5j&G0-@hZ&H37aa!cOd6BVX{Tt}W_S=q##2Dli}cv*p@k*oFWL zUf<_G+IrY9cj5qI2L+IM0z7I>qRXW6$X>x{6$nY0LOxD%pZ zp4snBXtZfnQ$_o5(L?hp^~FVfR>=`#pqP4R9;C!$hP9reer#y6>W)0@}@` zb6uj9yJZ;Qq~d@#irTiGS;sqCLIxy0fjy#Pu&`y(GBF_#JWXN2k(vtKNwE_lh!%M! z-MwKNR~Evi2NuKy33F9Tt?Iv3aJ^G z95?hi#mfjDMmOf9@}kL>BQ}#+W_}suiUeSoL1DI0G67u|s%vK)Zoy<5{@2<~U&JzY zo%uEa<8C9k8X|(IEA=%?F3^8WDqD{cU;Fk0+045yydzHaDSPuJIrzf`LP9mE%ciL2 z;j-L0(k5%e4IFEFlB9EKc5!-h`gpEhN#_IyUzZ;}|9XKY`d9bk%!tja`E4&t(xvnl zgITbamw6E*(qO=<7jGnFS;Csja&l_h@Y&+e3Ro4Zn%A~&Q7262VF3p*K~ms_NL)+N z-$I;hG1h;ToNa zNH(uX^%cRQ7Ad#gvA-P+5KkI20E*EC(VQv2QxNe7It0*Sq((Ai;m3d8j2HuSbWuFZ*LGw&-twb(SD-s2!1k}b5%Vqp!oZpNQJ|9M z9Or>13$9Z8!yerK^e5UCEed3C>2edgH~-1>soa3(C0cQ5z87;j@m)g2<;aimfq#`+ z2=pe{+gC)2Po_fu7{aT#R6%{j=aV7hTG->+aiEE>7usx3W3}>|Ou$l3u-X4&?=52^ zY1?yKGcz-d*<)sAW@ct)w#UpoW@ct)W@g4QGsBpVzc-QcM#}z9v=i+p()_ActGnDP zRXy##R;}w+qzH%3_kG6ND$v?jA0!g;rskaOKYcD5R-b+%txa>Y$PA@nMxipa^Ml_2 zR6>*)OA$K=r%REtcopW#k0>LYN3a9tCnSTy_A!!YfteBMoP032$2dxe?Vh0NH4~Or*IBg(rUnJ z5?mR7^5+SIL4}Fn*S}MFKog}VbvpFPn1vYY&G7RU#BVJkJ@B(Mcz21e%+@Mavp(*JxM%fUgRClCL z>CPjOz}g6mSvn90VrBbu!rY~2zIP}L&(szMd^aopOvvdZr^JHt64J%@O?K7i*g<8+PRYv*U4@^+pd?+y$;-P@JbO5O)2D^)I^IglUSnWJZQ zi`g%I{U`aU6*{~5tt+Uxp?-Hp_WZ>KGqnJHpsa1Sujk(;3{8r{IP@N(3X-ucJK@FAUd;?&%6Q#pyj9JY((dc>lQY z>6cqDAb%{tnjDI|+AmE4M()FzLUIjrGximSNGs5U?=_;N+s))MYvmzDeSoYdM;Dv% z8sr)%04qqVS07)b7q0l>H)pjsgL_i^RU&(jTG`lr7tMQun_uj~MCP&H@4cCGKfU&k zQ?S-HsPxKeSAI|re0X!#=Mz5?c_r&V#7BQCGWdg!{?tcVD%j=k2#Y>mD(bwerG#IG zN2rA!AJk|_~>tq82_2e_P<9lVf@Ep@dqFM!AF1a(I0&D z2Os?x@X_DI-oN3aziN{H;G@6eBQ^#CdZxeBn}3RrnEoj~`kRmWPw){FE5qOMQK#0w z&5YTibT+_p_1&~FMIJVf7f%~llqrsXD zV`F0l;PP%;-PEC_b=?`pm(9L(86TG&MEz~orpEi`-1hr5m(9Dmqg9*QwfSuE#5M-s z^<|cJ@V0E_?H<|f@ePJc69+%Di;vGF)_?Hf1`$Z^T^NA>0RlK~JThRgGw zSd`9?9ZZf}P2d8%R?in&2RTrwb+%?j#t%LrJY?F0Wmc* z^=c5TWV-%Au=b?@pVl^f5&8Xikt>^8)e*!rW_)tHt-lUyiF_wxI`*TF3!-FS9ocs> zX?j@n3Vvd=K7-XwkPYFd@q#9DMmIZfF&@2J)7Hh((+_dCTAi!ipE-00DUfTRdGvDR z41HP}hi{yt!`xTkjl4;Zsm|c*=vhEkP`$7d%9XbQsgl*^xCn$ zQ#FuDdY_^_-~%;EUBgK9I3yv$#Lh%+qYR67`@pLVivp!TDihKk@QEWN?kLa>CO=8A z#0~5`V=V{($ZVgS_&7e^vimM(5Osz-X^%0C01j4U5XOa-m7iUeuVuqKP0ZZM7)>3}M0Wm0e?2Tfww$XiQ?G|oq^8lnEhur*8K3v7pq6FoG;hbUlu&e))=c8!NJ1c?0v0+s zdUy+*TGIH`1$=jBul7Ncrm*Bcde1F?Zt{~%6Q`CC?BzVmfiC!}Y+eQuwG72Eu5cWa zWKfWO_N(ANn6uC{@AKMbAx(vtaNp9)fL9Uoqbu{6U}On2Cy$t*^6$J62hY~Xbzl=f z01g#lteNY94OL1ml?AT+Feac5e+^MRi|Ow6dOE*(X`5vqQ~Z{-trt z{Q(ubwk-VJ;J}tgrR$0ZUOcgS17GKtH-ZqeVax3qs9uVxP-T3BFI#<$krY5wWW<-&U?8`^B=}yrd}!B^YnMOP+C>h zhh%PO&NbFhEiI_GyVWO?{de3fp5DK`-+oM0@QEnAD0O^dc39%=zSU~-? zh88W6H1yYUT zFoJ7}O78$8gb0=Fy!Z8#Q2K;yi8J}dfRa)Q4IP*iDM?lVkR4X0mf(H5J1^Uphi+&2 zsJ55D*80hI?3jGV8lBmhSAHFt0g2^t$uP!}xp4smHs&XN=N7-@A=|T;FWYR+jm+Hx zBzKI)1^AZfJvEfipkrMJG3@2dqeEdxs1bQeulVk4@5zYLoaD?)OTSURM{JQF9lJdL zh=%=CL;1-0^6|B_6nPr{e2?zR*1I}pT}9j)-<`*#8)8U$LeIGgE?pb11N2e^G$@Qe z%H-FzC*dn%BjDTmdYAGOc>pmnpAL}Emy^XW+-feEm|p(2TM$JhkF9PxAAHKK&EhpL zvQyu4Dg5%rE zf~gprjP%^pxFi?^DCLl1jL09b)#<8vx3~eJne(dKd5^HJl<9d9Nk+yeFNW6_rMazR z8auupkwHw^gnu9TMUxnmKvE2=CJrrHH`MnF;OHQ=RBf%4IG@6tY!se7!fY=pT>5H3 zl{L$S2w}LW>?o@_fjgJoa|<#QNkN){*A7iQYt*|6l^;pT)txbmmTKICp>oUwz#}l@ z$`-0+w1~!x-NJPyh~}qVAJ?>4itKElV)U!v$pjmTZ`kuVJLYuKn4xVBWKl*^`J%@Y zS8!ysXs}+@lT&;gs_S5tn|C{<6I|pVKpiANnzb#qUW^{u5i$YY`W8(Dm}##AJ!laF zGg|_c1D8J~Ysz;v=!>8#)pczcO&&m&_;9QdT#^+z8o#m~>$0(IL7D+lRJb zN2TPjt;hm}`5AoA;JtrDK6hkIVOWIM|C0|Hjp1fpb&MB3jqv~Ts=K+~%f((43# zI+F%u8PB{GR8DYsQnTW}d2nf8H`)FgbKxs(y=@T7k#3QXpD3-o84WH>K&{#iOUaD= z5QP>ONAb<2gd}0J5HAFg-_j9@inmcwE!RO>5?~Rk;y88-G6upqB>agQfj z_wKA_iT?YhjV_M#29#6ENmpd)*WSn)bn3oO<-@ISq9;L}*Fu-;el#6<(Cr>;!fzIC zJ;ZX(+9FG`y++GblaJ9}#ty5A<|&48oR8Ak$K;1?>s`>n3l47j8$N3vp`+W<=FxG$ z2?K_vmkF}D?%Ki7b!m2Zy;`D7f>3sHaHY{`-IX8*lFFSd^0@j)(k}`N&O#BJ6dZK!@h#IILbC}MIo4;F%Gu=bP|A0GV z>vRpz?#i*pmKpB@d5ttz3!zD?r_V4>aiIo?C!-n7PE@yXD$TJHQsda9bGoV6u9>tO zKoD-we7$SC)YHM5AcIZ}D766EYrv#Q318q>6cfk2ZKZ&e4lzC}N0n(PcoARF_Y49t zR_{bpAKWbw&~uYAanqKoMQ8>DBA_{EgeW0xmAB+Q1Gq9l9oM^IU+oRYr}q{K=0AFu zhDK*AGE`o{xrtiP!9pm=BM{oxLWL?kqYe2O&u5T>VYut6`UdjaP;~2T9e^?hfXI=$ zHfZNV?PjOKNI9?|}(v+!LK0P@;G^8GzIx zc0+R%ctxQ!3oI>;Lgh*47C=ckxRE!82VN68k=$d+zj&b;&Fs#tD1zjtzH>DVJhC%k zenteD+9v0OpfER}l-5G0N^W(@y4g#S>Sp;Eu$7GCaYyteUPqPsIQsdm%usPd9(DrYs!Jss(Xil}Wx;#3q) zBCW<%r8gKBVxjKs%lqIaIE?_xV)+q_@b$T9O*RM;a8Sb4&qr|aA3)ighLg!baa@M6 zMVV|O6?dn;Kkl4|>|gesna+K1Qx=<^Hm*MbXUU)k{v&q5^tYmh|4az_M}7IDzWiYq z|Ksf9uQ=!bx%%?gV)2Jv{9zY=*u@`q@rPaf-?Iy*zX`|x#x9ut*Ur0VC17Ctmk%$( z_Vw^Dg@=cSR?flJP|?^)lU7bhgjUJe&52grTHn-I;9oX^|FRL+rd5+Qu=sbt;%mq~ z)4%TIYc~qEPWn#91a!2DP7cn7PICGV#x_ol1We5T3|RbiF#q)%@}B?;R%ZIY1B*s& zYsZZSw2!RRH*k2V5bYxS3Uo;ZbPTaH0Za)=>|l6m{3N4v6PxyR;_=R8A0HCUtwd{F z{82RH5vKCyVbP<5xGB7+`>*@?FWMIuX=C5489=$#|KOWvYyq?6&k9YG{%Ia3x z*szvwUbr~Eyj1hL9_HgOm!CbnH*cGm%1+hSkMHHr7ZWSG_tuZQ4vP{~-TM%K3;GB( zsZ(ejq2WE%;q6FTo$SAnk4r|KgnF<2$eua>F!{Y&jvpPf^}X%@fAv6iSQOnO&V^9m zg=*ISlzvJ=SjH`Jv%#md*rSU}KVrSSP-DXuzv*hiw%tm6Y%u;nyjAVfbW_uUw-trm zmCUF9cg_2~ed(~3i)0lcQWKl)M_1SM{q)^M@xx)~vzv4M78eWtdqV|U`Q%TOh;Ef9 zpLEbO{e>LzBm@2lT?qg{RiY~(yFmw6ulqB8Hf5c#XseWw0!l}?=n0yvY|~<2tPE?{ z_6t!pj=WtY~fc=wm{}5l`sUl@UJLJ^W6WQ}I<3z5X&i3-R zyC+zNMSrr~or%bw`7IGt)lnISPxDx85=$7#HmR3`te!~LzkiiUaF0T@7Z0c*?zxwS zK%1ygl#Zy2lx475cD~LrX51?YU_0qj1dUwGTYOWNNarra^?hDt3;ZY+Or}#y<~X}V zFLxN*eBh(9Gc~{kH0y{wM4e`%jtW=EVqEn6Xcy#Nx<_{I9$Q6n1+`IyNZY_wTk~_> z>q$cu#RXoD_KQC6O&?sn4Ww0BUR`|ja2G(YioX|^9uTmcH5;b@f#*+fCj2co5?~Yr zCm_{`08z<|nNV@sQ$0N9LX}wy>viWVTqu8uAA4|1*9x!3oY5UoiF2MYQ8v|-s3FDy zRAx^YhqFqqFd!(;P40h02_hA&Pk1*-RC~#7hQSkA|qjR)s ztD1#1O{7bE!^Xz7xg36#(o?8w3~$!9PW0UV3ew+;<~N;9F<8RTu=7m5GfLjjH}Ti} zhZ!-)Qh1^c>%&0H@Fm=;_w4;|^M)6bx6%-$noa-|zxB9Qa>IUz;7PRVf6b|6kPS>f zwh%5P1SKE*R^{66)&6!4EoF!-Bq{*CCy!&5FLS92LCirY0Y?bAXP_m36nab{l3YRtWGL3* z1Uc-_?s5v*Q7d3By#mN+Lh2qpHjEr$$ZtNF&t%jb9Lz8ZgT)*;(X$Pe>UW%p28!;7 zm+G;5kAiyy6^AAGM0a}6ShPourZmi*t5+7ysW+6edA1nx&_CUbeI7W@MM#LIfnC@( zqj%R&;65dL6Prfv?7MF_Sv*bi0*Q`#!nEq^pd;~BPBLlbc`a%D$mf;t|W*> z5=YJOT#21QYHs+%1w$AGAbc6fNq5MS*|TxgY9CHd@8@x7n6RUJl&FD?ryyu>)qId2 zX%gPCSbBYz=L0?PD2 zhhVwN(Uk@e3q?O5#$0o=UuHZ7OA_0?1#`-Ui6t8nhRWK#{kZfs=xqU(-MP}d-0@8v zj&TQa-M-yZgOqLrm5`nYxTNkmREaq=`Mm~`g=g73zU%^|o8E&<;7RR?)1|b5fJo*! zJC3t~+lI*cYY(ci-k;44#OZdb$L8E`XcscO4#}OpjFZ<&y3f>dZgx5K*}c)qXOJ9L zHIDo#yb@No90rbt;Gw@fAktm^AjA1yyH|jweV_|(f|InYZ8Tc}g&p z;FbfKKh%o=2w=f4AT1rRN>CsP%-3_{jfoTi(cd--8zW3i%_LUs-77)I0DQ2-M){l|jYxU+9I40lgzH&63A* zkGm`sFAB7P_jH0d{-&141r3^Nx8~)-B;Gkbi-VNPHuJjxOoK(T!vV|v{frC;c6S2= z*VAiYZoMwdc-29*Q-TvYmgTx0TTh6f` zyQ_TUL3qo;(L5!cY5~#!upm`I-#`Ru#6qCkPBAJQMx;s!h<;8XDovXEy}GcdAD+2O zt&kQ*DM(fq5j#46_|FkIlJQm$Tg{%srQlPO-(}$ca+b0{={|m)rMk1+8VllFQ))WO zO-zyz))h>Wjk9Hn-wKa*zLOEV^#?an2ib15J&vVvlsuLZWr;3u79<+zdb6kuDY}pM z2w@Wy@e&2#-_SX)e7oHOj7xP&6{?T2X}+;CRK_!a;&3^$6$~#v8KWys^;O8ZY~^0jX+n-s>c=ayJS4$<}fM;=b zCJb35BmTXI!GY^0DS`d}vbvXSI$F`|{rbiYfW#N7_%aZggk!*-a$)iMYn4WTOCNTN zk!{QIXSuyfOi??;O&}di1n<_K*|mYaEL{Yu6!w)i+nvmLpj)5%_wSx=G0AhALgm&A zh%J3U8vLHe%Y5|l^mmv+rWIsM((*1Edj5irI)QHfTTI5ovpZv#kot;=n?a02azDB^ zwQN5vTPlUNBX=N8YOf)_k%sN|Mf@UPa6}6WnVC7u3M_KeOzUxP4)iS3BK>U@suN-{ z6~De1aseCu-4D3=q-O_L&>T~Gr^}jyZtJqR?P{o3;BtK%s@3+?i#;=KUl<_M{1tQt zGi|7UzO2tEq6i;C`rsGv%#KUiRKM%a#PcP9KIB_l!WxDF->(v+77xkVU00jDC=Fyl zD-^RJD<@r@b%hF=B$=uiMh<=rerda3J*-u})SfrDyXYvwK-<>lIyGi9w)qHI z{t2uTv}%dxL2OXepz5}2DlI)Tw%K3LSE(A*#C)3R#Yy?twcJudEww*jo#{Vo&hOb> zEu{_wm()4~wW*PBDAo3;+qD3rK)2o*JC2QI;B;w0AIO~9FcG^-u*IZwa@L_s`S!X! zCVb5YSuVgFObd(<%jmS21aJc^RqD%hbuObs-<8wQ*8%0AJh6eH%ZDdf4C#IKkd_$f zI_4{pc??$+%=vwS1PA7GL6l0JltkTXHq_puBrBSKc*BOcQqGS-JG~o`BNtL&^4LQT^BC$@U z*92OeOj2}8w5LV9*#$vLrupS($ezvP%<$RByOfCFp-}=)-WW+<`TJI5Mfj=wFu+CIW++)QrpbXb!s@(vR>&j@j zqEHx5k8iacz#HEHD-lkRWKP#WFkRe4J)39hUANaCt*<|N+S{S zJ$+4UKry2D$#p(Z0Kgt@fg=0ag|Bkg z=^|MnusG7$J-nlQx7qByD%3J@jbhK7oxi?}GsKx+%3rAWoJ*Iglz6^r9PLyCQ+ip` zt#l!yZ#X|fhwKwq{X7igjDYtF zP8GNNCAvK0s=#wPf-A$vm%Y~Q773&+uOU8OIbKG1y^_q;RS9O^Bp`W7nA%)Ze8N{a z1xfse9OrLk8h<#>9|z@+gF>HKZXyhhrWMKGdTO`naib({|&lw~Te?Gbh=aTbMe+)x7z_ zW|z%8d?SsG98Fw)Vl94vk85vb&n4jfPEukaCC|x;JltHHm3aG`Sc|O zzwQ-2y8gBJ)l(E+T;&jST4wv=Dz0MYGd>dKbM`7I)>#L_Q4P_eY zi{X3B%=wG=XMJ+ap$%stVCK;ZAcQJhZO&yr$~HZ~)0bkm629S_HP zchfEFdQe1gc(jmRy@%H^O$*l6pZ}mZj@R~%&aE?sOY5M^2#}m?HXl0LrY{d}j*S{V zbojK})l1uHF+Vhvz{el_QNWwW&!$a!JusNb!-Kd84&ea_b_yrj0krD8*0x`tqrWK5 zD4cc5gc60r7sZju!ZQ^Gz~0!lYEG9-LB_LT(aiXZ;)KKd9ed3R97z544tlz(Nqgcy zf&~yN(W;|~MUN0HWmUSHhQcXg`f&+24j0iu@ba3S)ycl&k}NLTXl99n|;-nCH$klY}eSuMCj(G@K9O-bu~bGiGknc zzR&7&es37QuJ4k9UcqPxikoFmDFrrfW5Nv0<0%UFb@YlPQwJ8u)x)3|K4leGohaAOSx1$cq_OJO?387m`Bry_|aoZrIk&7HC zznKX*7_Bcjc@>7p-gZQarVs**KZ7VKt((MzZZw=MgK4~0`8l<{Ts4s&cZl0DXQG7G5Rmz1#fKX|7QfxVN ztM6JhSXuG1Y9MGunO*qx#b2y12xn}l4XLNkx0n~6U-nneu0A_kC#RCm9!%0Rt9h!L z%B@o0qm0(!$E{uL<2Sd=c+U-@a?$T*9aRpLg7QTv()cDFt1iYsq|zV80uH`UX$%+W zXt76t6I!XvML1k2m|@b<$<(%~QeB<2@bpZ4x3A^d zezOlq_4wJ7U_sl)qLRzE-8INpSd+uSkb}&pKPQE}vY;XuVlbCGYFdf=saDmz>Jpz? zqH#8;{CIpU?s9c*dY6x~QnYEHljhz6is3TFYS(h<6Jv={7!Ggg+y3(-gt9MdB}aL^)9j1Y-VdU;L( z`aL1=3UV+zI)td;P>mqKJNCrDN)bEyXh_Yhd?)OhY(@FR!X*GkmS$QT`Mw1@Mq;V{ zN?$s9-ooXeJ_~##6f_n+Uc*3P@L2hKqm`n1z&#YQ@3jc@`uf006e?;skutHbzx7?- z-d6jEX|oOFz+mQ-$O9$fp^sxNrEIqG^m4%bS4ML%M&0pIl9u{nNor6kWf3K+Z0V&C zhX8LWf?H4S56+Nbgn-^{za=^ais!sr7a&cD#AF@2f%Fc76P1j%n6U>!Hzi^efoNnh z*wpDDAaAyR?(hHJikKgs&eqo>Vse9*Qa(HY0qWG&%RwTyR=LjbN9mgYlg%ktmw)!! zyPS<7JKiFmnUp#+iGlG6k{ndl*(4b+Nu~f!w|1Ikx?*r?IEwfC%6wg(8B~|@^A7{I z>~e4^FU86H=cIBd994byv${=3&D$W0LoM4MB3iVhQ#u%D7_ocQI%27q5yMlU*7KuE z_iZLhBkm?TvZ&XZ)kwos5qCQ4Y)WyZ`=x8IfydhNTGnx@mdnd_+H97|TLO%AJMK;M zP|_$ecdMON>v(xVkFpg$Q8|PR={-OyKcQG~cl5{+VG-*g{in%tVM#bJhP^V5RLh++ z&6z1$Nim=9CRqvyz7KdcB#;}fXg45RmBd0Km`xSsiB=zn*T_-OEq>^ISN=k!SXZjDZ9t63bu($;q9_6jLP2Uj*o*62CeDGv`N$V^8sHI^s>Iq>Nq2 zW*U2X1u}cE&4SV-FPcCR+$=gZNUz~SjSlq$=!OJg6oGtti}(ZRrK>*2P@)48NI_iq zr^-IdP^tozy=jV8AGT=;hoZO_)-?t_f%Qsq(Ma#e(J6IqxVXyrNJj!7>UC z*|(q~6)n9qI`7b+6nwq0ok?5`3Qtt_A3OQREU#ujnAZoSSu)zUs~1@coLr+16>M!?~EoGz6hl~MNR+$KiCr}!q%sURDIXg^zx}%@c3N+Sd4CFW? zqC5%_--FR0uS~8Qln^Azh5S1d7ye6rQfNEvOW&DS%Hby9 z8Eh}@?=m=feO{A*@L&4ewAp+3ENg=vpB-&SXW~8pg&Beeu$w%G=p@@(B?V0loop}1 z1)#|Bl7;dR)lv~Nl+;vKshNH0v~dl#_@>x4=+54^Sa8f?^F@@LhNU_!rINu>eu)zn z8Dhfh1I_HPh97wKt)x@}n@)IoHNLcPFv_m;^_D*GKu}M}%b{-+U@sd(K{ykf%!AX^ z_{8LuA>~+92-XJWxm<7PyXqWd07LhR??6e7ZLz5rw{Nw<-U?!u833n2}g@eR_n5>&;Bkl1gk zC?maW+zENNqScc?rqkr}2QJVAywb#KC{#2`jtO=N)8sclC^qgT9a`H>ST;F7PQGXa zdzn-Qb=zUP%w;NoM(=f?88_*aSU_m7E1dHevBdh?5we^u!4cohz8aWzo-edgO9+f+ zMX9f`JRHPW-6VMI%bgB2j^aY;gjh$U;?>yIh`Q-ES7@#{K zfHNfu7VLAb^^fG<8Q}$1tHFB>3FU;;-*OB6^3UZPOJPB)(}i?p*WWS>;@C9 zmZFlC-&_aDuH8$Wo99Lw8L$0HrKJCXf-I49d)?|XRXkLO*v*GJId-)-hU`6>Pk?rU zh__lD?W0Q=$Y?$z=m(EBi>knpRn3AlIp}odOE#I;V$&T5+KDcz2wtdsKR6OKoQ5fa zj*dFhXZh8@-X8#%e$Qh+d-bWM&-=v_^ImCZMFW}M-O;p&%Qh!`5zS}!Y#zqjJ1r8v zMIrjxK#DIInuh@(p!Z{|T?GfcV00S%3Lz^ST^LHq`3H|$Rb={y9H;$nKrSM^C~TPN zBDa9B;KO5KAQI~sP!}}|m1rFyGs_(>hD^w(ILy^OIt+sV*FTEnK207W5Sh zDNpQ6`SyXqZLE-*BOW#pF`Xk7^O)k zV(^10(1lLM-j)Q%BT&$+D(=N7Ty}081ZrdJTU3!`;1*a`7WxEFuee7lU(EWxE|WLX zv6bgk0WcwlIDRZbcF`|vTp07;zm~LlI_eX|Lt^l#KK& zS(Bv3YW5z4VDTQ3hX}_OSK##tkIqIfW$ZqEI~iSP06pj0#U&etzL9wJbzL^KlQO#W zWs#Ge#Y}DCo?s&C(Pcf5b@YhwJcM?-0;3Hd;?~0ZqWnCe-4xwVea&kR5lfnr9)yo{ z!V}|zvf*mzCI09UyP6`WU$)6m28F*l3M=)A;bx;F_Pf$Wh4p1Po&xvfe~0}XG6PZ9 zfIi8w=gISVE@wUR@ublF!_W|6TSD@sL%bKQQfGKnzV(x2H zN=|-#$i$tlhWvwf3Gd(dm zd-%C@k`Bjyn1XexOAw7F7)nm=yNcD$z>9eVh(X1Rj524mxEY`n#Rw&nxJsFhpzko% zo8kZQU5j2*f8CHDl2u|VLHg*siBnx9V)bPi z4>NqJ+or%N3_X?cB{+*TNlZHCdU6` zQT?%~{#aE1^Yra+r8fVW%l5yCzWrmd_+wH1p>Kca+aLP&hra#a(>Lb7x$FN%-}OB&TE9SqtAk}kq0CyNS+k3MZAc!u)^aOARASrIlEI1(erbfXHn{{!GJ(kV zo77H`KyW`#8TvHT6p+`vB$a~a(T4+1POsS-))@BP0@k0 zyt#QK2oy1hzh(ysVpvtDEq}PVc-`9o6>CQ{u*?<>?N>3G$S=D`5YNuQ9w(P{N1$3u-$z0hKw@sU{7Ge<* z#k+redO+Wwadm3iR!trpEPCAKx856+k&aKIki@?pJhrFOodv^&8;y~Ty!GRJ6~NU% z^{|X5@8z?C?~#|d4YC9R6Ji!jW$nBz;!NP!ToZ3z%xN~0aY@f-Zhw)tpM3o5d`fss zh_N*unkuiH@_RH&TWr2`fb69}?%dqJJop63&hh#5oc8L8T=cc>WI@9ImT6nnhfmu! z+7b!(szXVT0n{&>JnK$oXZsbXDH`RC+)G19vE`(sq9Q?s87fN*k@G=7{KJ z;#*LIkwV>j+U&CXa?rwVb}Us>RXl(br5C|#jd^=_twqK~;$T|lHFFhD_IhV)HPw+e0Ja&mkjg^yuV(88c# zzUt3HQ$F+9Q1Mz?gge3d2GvYjLqJ`9^9-5r0CJ0DH+5wEpGU#XJIwU*2w?Uc;` za@NMvS?phC4Bo9-Wm$DydCc}60H_#-SoT`+&$R6)SqR7u`*a_#9M-wmJ})lvzmM>F zK#mc3?f|dV&0|0$82l^@^2U8N#V@$omvOF9M2zAQbVh~@b&&rWKdo?@limd;jFrlq z6M8sVCWtb(P9N4ih!;E%<#$OZzq2ZN}~#LRC?G zvSBUXe|A|Q50!+c0!9#nNXbAbLvSf>I<72XC9`#t-ABL>P$ZY*d@yu%PMv2p!}N#e7M>{%kxSxzLq750-7;PY|m}?dM%y z9w{~;Qb2QD#mGQ=y_Tb@bGBBe4d+0lF9!&%Dz{-svA$gMJNO`^f&LKj7Mp#C5db=rmWdyHAr)ab(W1i-gpi63;MJC%{l+%?IW)Z~gsVhZ2#D&-+R+gaB34%+-epzym^W1H zU?R&#Uzk~2LZwvZz-%wB{Hh(I1gW2ylk#hpzp$;0c)aPoj955u(_fzXA|c@o-}omH zALE)bHA)_Bff2|9x$@)?+ohU8={;CoQ5!E6Nhl0)I8j@3gPeSg#v!ob zGjhJKmaS5@$b9V`HUmO20L>y1!V|KBbGAr118<>OK|xp!WMUTLtOO%Hm=NSNUFt|xab29pveeMl&vYHiq^OPs`E^JXK>E(667lDs3W~|2SdHOIbR|kn1sGpWK}t9S;0Ip! zKxNE;DQ$8(6`i`R%$AN6m2S5SVL{kUoW0Cb;Y;JeZs00b+sE}q#XWx3@067PD1T%A zn@|6r`62%&fBTca{mI|{$Md(pev$k?Z!!97vG|j}{mI|{T*Ur%~MBw6Xv5P4SG(bWH!Q+(^sZ z5t|k1y^8W3T&YZfP!W--1-yNAVXf|5nNp^%u1=KwxhK&qy%EV=T&d&ZX+0%i0Hzpl zBCbG6{L8ApXL@lnyS`uTcX_a}?z?AXfZA3s5$BAV*B1V5r*H{h)KO9GLe&| zq^hnnr;FHvTfBJq#!Bik3@tF97-aBQ@YUK~96TPJ-|n_Y7N5R4mgvN}5e+X=-G*{w zSQSN58}_~5CFvK=p2JcqtB#(}_3v8Tk3QCZvMbi3-yt(=esoz$H)3y?QNH(XPuZ~I zUmebvc4kWYjtrbvym>$K?c7=2*|&b|(9mwtE^oI;ZckrW)n?UOJvO-gJ}3R&W*nj;LtaImKe9>24t~xz6WVeFQpj`4)v^xtLg4PWuAWvXH$rKU4Uc zMV+gz>%FP+=c@)Y$*+y5xg}{(4Q(DKGF5n+8_8InXQhfwt`O*o8tBXV2IPzK!ouGN zh-llly7-pww-6AZ7{8r%Lt{3)sJJ`Q{i~ z-uRtZMPQ&v2KBJ&<4xprV7m1Cs}=A%7{P4P2ZQ8C!TX7g<48ybJYL-+6@VtonIC9R z1CcX;Lfh2@ey7RZ>=Bn8=19t9QLkg5Tbcn|%!OTBNnz>W@wq$1{GO+J*lt|d>n)p+22TykPb!t4vo7+KEW;^_{#oiBhfRpy@WM1ty z%j}#Zi`QOe7atmkw+oo~XHRR>TmFR8hw8cjBFx9Sv*!( zBB$|@$%P;%TumXYyV>g@Cp0Pr9t@bBE02E2-J+pTn`Z$957d<07|`SVtW7d2Xa~yh&9@mJgd z|4F%DAFp(yN>R!?NO$nn{geQo9F7~~YZ_^hSjDS4{%JkUayD!Yl0HJ(17?#^o;!zV z1qD(@jT;+;l(&?+saxpO#qoKQ-2LWxCsc+00yqna^>m}hbJLs4o*lERvulM?`q*KsV zmjv}6Kau68KNBu}z5I{s7Zzy;Rq4-xam=yXeYNNrVbA&F-;TZ-lyJ&oW5*llNLrtG zt(aBYbZEd`YSh}Ui1_nnbYdag{q$d%m5$vudGnhF@i;_mLYaF_e`+dDbmP0l_iIXCwtJNf-XR>I3-u4m0T z#`BCZ=X~fDhlcc#x1i11$6A$lZ&7f|_4k=27~wQ;f)JX9lB zD?d7T5}*xVY#QH{9g?E46*Vkc4P0B4t^~LX?l0{0w7nBb=Bj{lIbiU|fNvDLeHh%^e9BL6^=_UfNc@Ikt9hsEm z1~WwL`fLD<7mGWy||N#-*Q3|H(pLaHkvk@g~5}5V1{Liyle) zC&o`TAh2x_Mn)$NkxqU68rWX{Z1B7oh^}m>3S|dex|{^*i(Xrlzd@!jnb@ z2R@rWMjFg*2=57&$NJNPn#MD=Sb0&}&7nmd6Jtznr4? zy=c@LSP6pr@CI#Izk64kXyP=i>PrJN+@T~Iz9DKwY(B`UfLD&LR}qWPciiE_yu{{D z-U-b2UlZ5NkndbyumvFGbT_>Vu!Xc2>&AWY;( zPx?UJ(az=0CJvJEzd(@XQt1^-9D)o#Ltql+{&K~V=#k`jfiPj84&u@L;QWa^W_3`0ObuGq4382wvaqm3V*y)wv<+d!$KVnZayXg(XbHvmxS`er zS@FhbHPjw;$2idf@C9IiH-C2IF}?U_N{*d*6fdyupVcXGP6X)rC|V0sci`kkfbOV5dcbbgR%- z^+EE{Om9^!3x!eWa7$(YPD6~9z73XPIJcuFFV6+X_QUS>0m+>=%?ojT7bEij)aUrO z^XC8f9RJ+%^Up0m|1EC$`Ip@Df8Xc$kF8`Xu0}4N4yONc**2r<-6`Fx%H)riXqRXruhQMt@}57#8OP5uYcw#M21krzbDAFWj?^^N?mQePIzoNbi5UdE z8t?b4885k?uF1+SVlWi+M-5Vo@ydCuV9TOYdwxw?HKdN3g>|nQIJmhrPFk#t={5zm zw6wguyd)$fI7V+eXi{*C!OqXkp+f)p^JiC@`_f=^iIamPd;9RvvTD99paK*6fFMfT zSU45=pId&G7D_Vy@j3qSIsWlE{y+E}|8~0T-+Ye$ww<%NGzWkJ@~q6 zwexo@fbMUux28j84`U*Lo()Fc9a>qh&lgPbCQm z>Wp5k9WP#h?Z^1}gz!19lFhwGMCSRWU+Nhum-JIBzy9q%?Zus3_cYqKm+@LpzZW{1 zIij#&b2C`VIaBG}BXi{T>gHDW;J~YKSKj1YN-xQ-OBVe}dd3t+3-`Ugqlu z^YJX~9~mn78W=g0Dovkrij{EpC~2ydX;|ml82Ov>GNp@QRyCx@WS;7+;-pKG_^sfD z-q?aC-fm+tQ3v|Rn%jDgFjd^!H)tKa$%r7(^UW+6-%*icW)mVXWkFl0&9RULG}W<+ z5mtQ_@DUKqshejsLL1wHtWuKVb`6omguH`?Fub`Ihb@k#4LFzkekOc~8ZB@~{?g6q zSBlem&-SS<q9bj5@D6e;bO1nHN{o3uQzj8jSu(z*uW@T;cZRaXx zfd!7_H5z&QjUJC$JGR{%-`YCA4g}NjqXoBUt2R6-O2t?3#_z%;7nfTK|Ins^{iVvd z7;ON)9SyY{$S^bOaaT8J3sm6&uPjuqwox;&8jYNsr;1!XYes+^wdgpLy*PBSPO$KM zp>i55uo*R^U$D?|^x(f@n=ooonMj!+L8yIUjH|Y=g!6N*v-mXKvdHJ}D?)`cwu%+6 zeBym4VjKeHGFcNegeA86le=)|SDEs_Zm_gP<-G%SE!?+h2QP2G4zK$|!zZ--NKR-?dALX%eT{Oc=8Mn> zsLw}Yiu*#@Cs4fTTI9tUzf%>&P5fY(Hff=#N?ok#RhfqU{naQ15~UU67}Vd^GHvJ3 zbl?fb{N+4DvGPR=$w_cdWh90IF{X}2&JyCrKI}8DgYrNN3TZL@SrIpl3wGhAb=O`N z3DlhME4C)@sOeO-_*XPZ%O51!1Qqq>d85DUP@7JCAF9s|E#=zC#u5t(92k_c0Gd|@ zP1P&z<>$ibK@;Fw7e`@YR4R!WdWZ1e+R=e&888qYtD9SBT<-PCkvHFiIqtq8o`D5% z{=}fsCaIA=8u@5F*J$gPeqO$du&rs<$2lHtygxOod-idCfXUy(i=>+s4s*z&9gg%1 zB8g&Zgp0*yy=2Izuzq@YpESvu7k(h5^r8VJK=3}AGqPFVPtC?;pebUiQPhj3|7OLw zvac4tO-~XscQAJT8^0NW$ktt}5M3-g36V9wD)s4>d-ty-DJ_vpQX(h;?8L-y6BV;# zhnz@lSaB55Kiz)p)yVK?-!k;5t)zykldxhuiF0<#-}|q?b43Jg6^ADEX$sNb;ReNN zpZPncSMDoBux3CW<@>cu@^KhYV+Oa#FSZ$lRW#|Fp;IYru;XG0^H_il@p0XSxmeMg zZ;n+QU!i%fO`wyB{in3Xp%i-%UJ(7iusZO(mmI|Pwe9kF+56ZV8_?@0_dRqsnLBt0 z%Nu2oqR%P7BGhcdjKB+qYOn1o8T~s(ImlnQ;S6!JZb@C;c$D6@JJ@?t`MlN<{d8Av z=KIqC_X@wuDyo9?7xEtMX5sEvmA!lhJQ_97fr-M?F7jt3@l{Zr19_PII!JOogV$S~ z%!M`G$t?U#Q`J7x)@9h!I2`_Q-)YS^xOQ9>^;^po?vJXR8<;Q2u|9=2Uq@6ANhwPf z&G%HHag_$F+|4;_Kpw`)jzM`M(ZoFkkyTbqWh3Vf)V||rfThPkKHWdn>dTNio}^~x z!efx8<_3Yrq!PI+G-2}NiHsma&5RFR)*dg&86mp>&R^`JV0JQvuBsi?KmO&aXS~t`ObcV2_(NsgG`_?@>p=^;6#F4S`4O8KhbBrEw-eLQ9Xt=$E zZ-d>D(=NEk`G>v6*aKFrL1wbzS{^n%iqsr=D;OjBiM8in^n!$cCOQ$%oEIbYrUs1I z!g6Z)DeXdaRQ~SX%g{*RlhF*l8`k0dE7tgo92)9&G`50La0i7E8J&} z_1|lZcAkY4OCF&{2h}0L=fz8XkXb_Y9>;j!TP*OWfwu#lzefp99dR-wXsg_8jB#bb z7%8GafVBY4rvVPnPEedu`DqSQMAkmcMcj{f`91i9UrNT+9&VqJZ(!+5$@k-BPiJ_! zELUy511MSio}1a$j(uhG#t~tJmkSQB=bYOL`EnW8T%^yYZWfF#B+XKEqHrXsW*LF1 z2k*X|&a`%q@p8IlBusQTu!o~pj;M}7p*P^dSGd0;gHRGdC{6MnG77)G_<$t5MO`wd zH=o<0(dgXL z5z>J84?-^HkS9SB>UfAm#W>v$GqEbDI2owI>b6?988EUvjy5P?Q`LO<)3B^maJ z;e!?6jIiDfX+u#KD^arevmp5I(1?;y|AfM}M+P|z3!xKv5h4f1wNHOzQDiZy71Wyq zjgoIW2>%vGzlNx74IjtjvZRJ$H4b*ArP$6lH86_|9)mz``bsk<46i{UA(Z$g^qWCa z!j<03(X0I15cb0RGj763w7tA-3N~iN$bBq%ykG+8bdGvnP$|qOtN9wlxr!w>hgC$< zm`Ox={fVny%pWX74uP(pgZa#m{I^`&F}u6}EE`wAhW9_}F{FyBbUwjBUTT&G_|p-( z|H6{XVid3t@V$TvwUq>+8)Qfy#1_ZUOMYATml)%}wWg*L9S=a@^Lv2(wNaxg%4|@w zeHH0+u~3ndGV-<7g};`7QOJVmm>oMc{Ii3@aJSfZenX(2bm?L&0xtx!+$W3j+;FQv z)$dnM*#`-9Kf3%=3a{!a9w^E#w);noI)c|-nKO!ATSFpTECYN=Gl51vMjhN1&9)r` zyEj^BRMo4b4(vN3ady%zXq27n5OIfemHZSwECLK%4qZ@WeM8G&(jEgLb&~1D)|=Rm zY*>60EE(-OXhS#(k(giobh{o;^~)&hbKb=vQ`qt66E$9Bz8exco)eW$nm_8>BYLk6 zYsX2@CYlOEmNK^KX6z0p%%=9O#{_3+!z@jY#&}nRm21`vO}ZBU?ZdCco}tFC+Xm_% zEthepXVX_3gG$Ld*hI>|MV-qS+jqrW5v4l2hj<4Q#kIJU=Q5PHDb)BZFPz)I>l&}a4;Pf2F1(!X}*12--MMLXGS z{`lj@K+(9zLV7_^t;=avUoav$nogw)df~4W1r{=!-&4Xr@r_#diSuQ2#Zmg31k)I@gET1mB{W>o4@ufOu z(R?X)zF(TlB9xslKCP$;4(Q+yC?n-<<306!7Ze%~zPq_*#nVi6_fM6DoonueZ5b1K zSRy&TOX;VS6%Nvk+3@ZX{yy35XG;au)daf;L^@8%oaAoqV=H8MocEQ)gOC9?3tjw! ze-!68SJ*~-*7cGpY1VJ9sJ(;vq>cV&0q87L8p`I#WFTEr*-B(8|C->K8|xhMK{GNG z?bbPz+IwZ-vo2dDpswZ-w@wh{S%VQq1cuyFt9?Kl6YP03l9fTrXe z|J$bI>`ebFKkHwC{ZF?1ul+1$W_D)w|CgcVqhtS(JO0KS>V^17Njq|Q$b^Nl+bF

From 3a262c4d333b818715f4ba552cd3cb9ae07d6778 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Mon, 10 Nov 2025 12:47:46 +0100 Subject: [PATCH 56/60] Refresh of front page content --- content/_index.md | 55 ++++++++++++----------------------------------- 1 file changed, 14 insertions(+), 41 deletions(-) diff --git a/content/_index.md b/content/_index.md index 43cf6d7e..5d6a83a4 100644 --- a/content/_index.md +++ b/content/_index.md @@ -125,14 +125,14 @@ images: ["images/og-image-fission.png"]
NEW

- Vibe Coding for AL + Getting Started With Agentic Coding

- AI-optimized coding rules and guidelines designed to enhance the AL developer experience in modern AI-powered IDEs like VS Code and Cursor. + Essential concepts and practices for working with AI coding assistants in your AL development workflow.

- - + +
@@ -140,16 +140,16 @@ images: ["images/og-image-fission.png"]
- TAG + GUIDE

- API + Vibe Coding Rules

- Two API Related Design Patterns and one Best Practice for working with API's + AI-optimized coding rules and guidelines designed to enhance the AL developer experience in modern AI-powered IDEs.

-
@@ -157,17 +157,17 @@ images: ["images/og-image-fission.png"]
- PATTERN + TOOLS

- Event Bridge + Agentic Tools

- In the world of interfaces, it is important to preserve (certain) events over multiple implementation of the interface. + Model Context Protocol (MCP) servers that enhance AI assistants for Business Central development workflows.

@@ -210,17 +210,6 @@ images: ["images/og-image-fission.png"]

- - -
@@ -254,22 +243,6 @@ images: ["images/og-image-fission.png"] - From 0042e10d5ffd27d6d5be63bf538e466e6c602bbd Mon Sep 17 00:00:00 2001 From: Javier Armesto Gonzalez Date: Fri, 28 Nov 2025 11:00:53 +0100 Subject: [PATCH 57/60] Add files via upload --- .../Tools/al-development-collection.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md diff --git a/content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md b/content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md new file mode 100644 index 00000000..42675743 --- /dev/null +++ b/content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md @@ -0,0 +1,49 @@ +--- +title: "AL Development Collection" +linkTitle: "AL Development Collection" +weight: 1 +description: > + AI Native AL Development toolkit with 37 Agent Primitives for systematic Business Central development +--- + +## Overview + +The AL Development Collection provides a complete AI-native development toolkit for Microsoft Dynamics 365 Business Central. Instead of ad-hoc AI usage, you get systematic engineering through 37 Agent Primitives organized across 3 framework layers implementing the AI Native-Instructions Architecture. + +**Created by**: [Javier Armesto](https://github.com/javiarmesto) + +--- + +## Key Features + +**6 Role-Based Specialist Agents**: +- al-architect 🏗️ (solution design), al-developer 💻 (implementation), al-debugger 🐛 (troubleshooting) +- al-tester ✅ (TDD/quality), al-api 🌐 (API development), al-copilot 🤖 (AI features) + +**4 Orchestra System Agents** (Multi-agent TDD): +- al-conductor 🎭 (orchestration), al-planning-subagent 🔍 (research) +- al-implement-subagent 💻 (TDD implementation), al-review-subagent ✅ (validation) + +**9 Auto-Applied Instructions**: +- Code style, naming conventions, performance patterns +- Error handling, events, testing standards +- Context-aware loading via `applyTo` patterns + +**18 Agentic Workflows**: +- Environment setup (al-initialize, al-build) +- Development (al-events, al-pages, al-permissions) +- Analysis (al-diagnose, al-performance, al-migrate) +- Copilot features (al-copilot-capability, al-copilot-promptdialog, al-copilot-test) + +**Smart Complexity Routing(Experimental)**: +- 🟢 LOW → al-developer (direct implementation) +- 🟡 MEDIUM → al-conductor (TDD orchestration) +- 🔴 HIGH → al-architect → al-conductor (full design + TDD) + +--- + +## Links + +- **GitHub**: https://github.com/javiarmesto/AL-Development-Collection-for-GitHub-Copilot +- **Quick Start**: https://github.com/javiarmesto/AL-Development-Collection-for-GitHub-Copilot/blob/main/QUICK-START.md +- **Complete Development Flow**: https://github.com/javiarmesto/AL-Development-Collection-for-GitHub-Copilot/blob/main/docs/workflows/complete-development-flow.md From aa970ed0a67b2a946a527bd7ca570defab30a23d Mon Sep 17 00:00:00 2001 From: Javier Armesto Gonzalez Date: Fri, 28 Nov 2025 12:00:55 +0100 Subject: [PATCH 58/60] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../CommunityResources/Tools/al-development-collection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md b/content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md index 42675743..7312b533 100644 --- a/content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md +++ b/content/docs/agentic-coding/CommunityResources/Tools/al-development-collection.md @@ -35,7 +35,7 @@ The AL Development Collection provides a complete AI-native development toolkit - Analysis (al-diagnose, al-performance, al-migrate) - Copilot features (al-copilot-capability, al-copilot-promptdialog, al-copilot-test) -**Smart Complexity Routing(Experimental)**: +**Smart Complexity Routing (Experimental)**: - 🟢 LOW → al-developer (direct implementation) - 🟡 MEDIUM → al-conductor (TDD orchestration) - 🔴 HIGH → al-architect → al-conductor (full design + TDD) From 6f72c21a6076b0bb2796847f350f30bac5edaf31 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Tue, 20 Jan 2026 14:23:48 +0100 Subject: [PATCH 59/60] Orphaned files meant for the original PR --- .../agentic-coding/GettingMore/refactoring.md | 1041 +++++++++++++++++ .../agentic-coding/GettingMore/testing.md | 902 ++++++++++++++ 2 files changed, 1943 insertions(+) create mode 100644 content/docs/agentic-coding/GettingMore/refactoring.md create mode 100644 content/docs/agentic-coding/GettingMore/testing.md diff --git a/content/docs/agentic-coding/GettingMore/refactoring.md b/content/docs/agentic-coding/GettingMore/refactoring.md new file mode 100644 index 00000000..6aaac1c6 --- /dev/null +++ b/content/docs/agentic-coding/GettingMore/refactoring.md @@ -0,0 +1,1041 @@ +--- +title: "Refactoring Legacy Code" +linkTitle: "Refactoring" +weight: 4 +description: > + Use AI to modernize and improve existing AL code while maintaining functionality +--- + +## Scenario + +You've inherited a legacy AL codeunit from an older Business Central version. The code works, but it: + +- Uses deprecated patterns and APIs +- Has poor structure and naming +- Lacks documentation and error handling +- Contains duplicated logic +- Is difficult to test and maintain + +You need to modernize this code while ensuring it continues to work correctly. + +## Goal + +Use AI to help you: + +- Identify refactoring opportunities +- Modernize deprecated APIs +- Improve code structure +- Enhance readability and maintainability +- Add tests to ensure no regression + +## The Legacy Code + +Here's a typical legacy codeunit that needs refactoring: + +```al +codeunit 50100 "Sales Order Management" +{ + procedure ProcessSalesOrder(DocNo: Code[20]) + var + SH: Record "Sales Header"; + SL: Record "Sales Line"; + C: Record Customer; + I: Record Item; + qty: Decimal; + amt: Decimal; + begin + if DocNo = '' then + exit; + + SH.Get(SH."Document Type"::Order, DocNo); + C.Get(SH."Sell-to Customer No."); + + if C.Blocked <> C.Blocked::" " then begin + Message('Customer is blocked!'); + exit; + end; + + SL.SetRange("Document No.", DocNo); + if SL.Find('-') then + repeat + if SL.Type = SL.Type::Item then begin + I.Get(SL."No."); + if I.Inventory < SL.Quantity then + Message('Not enough inventory for item ' + I."No."); + end; + qty := qty + SL.Quantity; + amt := amt + SL."Line Amount"; + until SL.Next() = 0; + + if amt > 10000 then begin + SL.SetRange("Document No.", DocNo); + if SL.Find('-') then + repeat + SL."Line Discount %" := 5; + SL.Modify(); + until SL.Next() = 0; + end; + + Message('Processed order ' + DocNo + ' with total amount ' + Format(amt)); + end; +} +``` + +## Step-by-Step Refactoring Process + +### Step 1: Write Tests First + +{{% alert title="Critical: Test First!" color="warning" %}} +Before refactoring any code, write tests that verify its current behavior. These tests act as a safety net, ensuring you don't accidentally break functionality during refactoring. +{{% /alert %}} + +**Prompt**: + +``` +I need to refactor this legacy code, but first I need comprehensive tests for its current behavior. + +Create tests that verify: +- All current functionality (even if imperfect) +- Expected outputs for given inputs +- Error conditions and edge cases +- Current behavior (not ideal behavior) + +These tests should pass with the current code and catch any regressions during refactoring. + +[Paste the legacy code] +``` + +**Expected Test Code**: + +```al +codeunit 50101 "Sales Order Mgmt. Tests" +{ + Subtype = Test; + + var + Assert: Codeunit "Library Assert"; + LibrarySales: Codeunit "Library - Sales"; + + [Test] + procedure TestCurrentBehaviorWithValidOrder() + var + SalesHeader: Record "Sales Header"; + SalesOrderMgmt: Codeunit "Sales Order Management"; + begin + // [GIVEN] A valid sales order (testing CURRENT behavior) + CreateTestSalesOrder(SalesHeader, 'CUST001', 5000); + + // [WHEN] Processing the order + SalesOrderMgmt.ProcessSalesOrder(SalesHeader."No."); + + // [THEN] No error occurs and discount is applied + // (These tests lock in current behavior before refactoring) + Assert.IsTrue(true, 'Process completed without error'); + end; + + [Test] + procedure TestCurrentBlockedCustomerBehavior() + var + SalesHeader: Record "Sales Header"; + Customer: Record Customer; + SalesOrderMgmt: Codeunit "Sales Order Management"; + begin + // [GIVEN] Order with blocked customer + CreateBlockedCustomerOrder(SalesHeader, Customer); + + // [WHEN] Processing (currently just shows Message, doesn't error) + SalesOrderMgmt.ProcessSalesOrder(SalesHeader."No."); + + // [THEN] Process completes (testing CURRENT behavior, even if not ideal) + // Note: After refactoring, this might throw an error instead + end; + + // Additional tests for current behavior... +} +``` + +**Why This Matters**: + +- Tests catch regressions immediately +- You can refactor confidently +- Tests document current behavior +- You can run tests after each small refactoring step + +### Step 2: Initial Assessment + +**Prompt**: + +``` +Analyze this legacy AL code and identify refactoring opportunities. + +Categorize issues by: +- Critical: Deprecated APIs, security issues, bugs +- Major: Poor structure, missing error handling, performance issues +- Minor: Naming, formatting, documentation + +[Paste the legacy code] + +For each issue, explain: +- What the problem is +- Why it's problematic +- How to fix it +``` + +**Expected AI Findings**: + +**Critical Issues:** + +- Using `Message()` for errors instead of `Error()` +- No proper error handling (could cause partial updates) +- Using deprecated `Find('-')` syntax +- Modifying records in a loop without proper handling + +**Major Issues:** + +- Poor variable naming (SH, SL, C, I, qty, amt) +- Single large procedure doing multiple things +- Hard-coded business rules (10000 threshold, 5% discount) +- Inefficient database operations (multiple FindSet loops) +- No validation of input parameters +- Missing XML documentation +- No telemetry or logging + +**Minor Issues:** + +- No separation of concerns +- String concatenation for messages +- Magic numbers without explanation +- Inconsistent code style + +### Step 3: Create a Refactoring Plan + +**Prompt**: + +``` +Create a detailed refactoring plan for this code. + +I already have tests in place that verify current behavior. + +Break refactoring into phases: +1. Safe refactorings (no behavior change) +2. Structural improvements +3. API modernization +4. Behavioral improvements (may change behavior) +5. Final enhancements + +For each phase, list specific changes and estimated risk level. +After each phase, I'll run tests to ensure nothing broke. +``` + +**Expected Plan**: + +**Phase 0: Tests (COMPLETED)** + +- ✅ Written tests for current behavior +- ✅ Tests pass with current code +- ✅ Ready to refactor safely + +**Phase 1: Safe Refactorings (Low Risk)** + +- Rename variables to be descriptive +- Add XML documentation +- Extract magic numbers to constants +- Format code consistently +- Add code comments for complex logic + +**Phase 2: Structural Improvements (Medium Risk)** + +- Extract methods for each responsibility +- Separate validation, calculation, and update logic +- Remove code duplication +- Improve error handling + +**Phase 3: API Modernization (Medium Risk)** + +- Replace deprecated Find('-') with FindSet() +- Use proper Error() instead of Message() +- Add SetLoadFields for performance +- Use ModifyAll where appropriate + +**Phase 4: Behavioral Improvements (Medium Risk)** + +- Change Message() to Error() for validation failures +- This CHANGES behavior, so update tests accordingly +- Add new tests for improved error handling + +**Phase 5: Additional Testing (Low Risk)** + +- Add more edge case tests +- Add tests for each extracted method +- Expand test coverage + +**Phase 6: Enhancements (Low Risk)** + +- Add telemetry +- Implement proper transaction handling +- Add configuration instead of hard-coded values + +### Step 4: Run Your Tests + +**Before refactoring anything**, verify your tests pass: + +```powershell +# Run the test codeunit +Invoke-NAVCodeunit -CodeunitId 50101 +``` + +**All tests should pass.** If they don't, fix the tests first. + +### Step 5: Phase 1 - Safe Refactorings + +**Prompt**: + +``` +Perform Phase 1 refactorings on this code: +- Rename all variables to be descriptive +- Add XML documentation to the procedure +- Extract magic numbers (10000, 5) to constants +- Add inline comments for complex logic +- Improve code formatting + +[Paste the legacy code] +``` + +**Expected Result**: + +```al +/// +/// Manages sales order processing including validation, inventory checking, and discount application +/// +codeunit 50100 "Sales Order Management" +{ + var + LargeOrderThreshold: Decimal; + LargeOrderDiscountPct: Decimal; + + /// + /// Processes a sales order by validating customer, checking inventory, and applying discounts + /// + /// The sales order number to process + procedure ProcessSalesOrder(DocumentNo: Code[20]) + var + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + Customer: Record Customer; + Item: Record Item; + TotalQuantity: Decimal; + TotalAmount: Decimal; + begin + // Initialize thresholds + LargeOrderThreshold := 10000; + LargeOrderDiscountPct := 5; + + // Validate input + if DocumentNo = '' then + exit; + + // Get sales order and customer + SalesHeader.Get(SalesHeader."Document Type"::Order, DocumentNo); + Customer.Get(SalesHeader."Sell-to Customer No."); + + // Check if customer is blocked + if Customer.Blocked <> Customer.Blocked::" " then begin + Message('Customer is blocked!'); + exit; + end; + + // Check inventory and calculate totals + SalesLine.SetRange("Document No.", DocumentNo); + if SalesLine.Find('-') then + repeat + // Verify inventory availability for items + if SalesLine.Type = SalesLine.Type::Item then begin + Item.Get(SalesLine."No."); + if Item.Inventory < SalesLine.Quantity then + Message('Not enough inventory for item ' + Item."No."); + end; + + // Accumulate totals + TotalQuantity := TotalQuantity + SalesLine.Quantity; + TotalAmount := TotalAmount + SalesLine."Line Amount"; + until SalesLine.Next() = 0; + + // Apply discount for large orders + if TotalAmount > LargeOrderThreshold then begin + SalesLine.SetRange("Document No.", DocumentNo); + if SalesLine.Find('-') then + repeat + SalesLine."Line Discount %" := LargeOrderDiscountPct; + SalesLine.Modify(); + until SalesLine.Next() = 0; + end; + + // Notify user of completion + Message('Processed order ' + DocumentNo + ' with total amount ' + Format(TotalAmount)); + end; +} +``` + +### Step 6: Run Tests After Phase 1 + +**Critical**: After completing Phase 1 refactorings, run your tests: + +```powershell +Invoke-NAVCodeunit -CodeunitId 50101 +``` + +**All tests should still pass.** If any fail, the refactoring changed behavior - fix it before proceeding. + +### Step 7: Phase 2 - Structural Improvements + +**Prompt**: + +``` +Refactor this code to improve structure: + +1. Extract separate methods for: + - Customer validation + - Inventory checking + - Total calculation + - Discount application + +2. Replace Message() with proper Error() for validation failures + +3. Add proper error handling with try-catch where appropriate + +4. Use StrSubstNo for string formatting + +[Include the Phase 1 code] +``` + +**Expected Result**: + +```al +/// +/// Manages sales order processing including validation, inventory checking, and discount application +/// +codeunit 50100 "Sales Order Management" +{ + var + LargeOrderThreshold: Decimal; + LargeOrderDiscountPct: Decimal; + InsufficientInventoryErr: Label 'Insufficient inventory for item %1. Available: %2, Required: %3'; + CustomerBlockedErr: Label 'Customer %1 is blocked and cannot place orders.'; + OrderProcessedMsg: Label 'Successfully processed order %1 with total amount %2.'; + + /// + /// Processes a sales order by validating customer, checking inventory, and applying discounts + /// + /// The sales order number to process + procedure ProcessSalesOrder(DocumentNo: Code[20]) + var + SalesHeader: Record "Sales Header"; + TotalAmount: Decimal; + begin + LargeOrderThreshold := 10000; + LargeOrderDiscountPct := 5; + + if DocumentNo = '' then + Error('Document number cannot be empty.'); + + if not SalesHeader.Get(SalesHeader."Document Type"::Order, DocumentNo) then + Error('Sales order %1 not found.', DocumentNo); + + ValidateCustomer(SalesHeader); + CheckInventoryAvailability(SalesHeader); + TotalAmount := CalculateOrderTotal(SalesHeader); + + if TotalAmount > LargeOrderThreshold then + ApplyLargeOrderDiscount(SalesHeader); + + Message(OrderProcessedMsg, DocumentNo, Format(TotalAmount, 0, '')); + end; + + /// + /// Validates that the customer is not blocked + /// + /// The sales header to validate + local procedure ValidateCustomer(SalesHeader: Record "Sales Header") + var + Customer: Record Customer; + begin + if not Customer.Get(SalesHeader."Sell-to Customer No.") then + Error('Customer %1 not found.', SalesHeader."Sell-to Customer No."); + + if Customer.Blocked <> Customer.Blocked::" " then + Error(CustomerBlockedErr, Customer."No."); + end; + + /// + /// Checks that sufficient inventory is available for all items on the order + /// + /// The sales header to check + local procedure CheckInventoryAvailability(SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + Item: Record Item; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.SetRange(Type, SalesLine.Type::Item); + + if SalesLine.FindSet() then + repeat + if Item.Get(SalesLine."No.") then + if Item.Inventory < SalesLine.Quantity then + Error(InsufficientInventoryErr, Item."No.", Item.Inventory, SalesLine.Quantity); + until SalesLine.Next() = 0; + end; + + /// + /// Calculates the total amount for the sales order + /// + /// The sales header to calculate totals for + /// The total amount of the order + local procedure CalculateOrderTotal(SalesHeader: Record "Sales Header"): Decimal + var + SalesLine: Record "Sales Line"; + TotalAmount: Decimal; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.SetLoadFields("Line Amount"); + + if SalesLine.FindSet() then + repeat + TotalAmount += SalesLine."Line Amount"; + until SalesLine.Next() = 0; + + exit(TotalAmount); + end; + + /// + /// Applies a discount to all lines on large orders + /// + /// The sales header to apply discounts to + local procedure ApplyLargeOrderDiscount(SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.ModifyAll("Line Discount %", LargeOrderDiscountPct, true); + end; +} +``` + +### Step 8: Run Tests After Phase 2 + +Run your tests again after structural improvements: + +```powershell +Invoke-NAVCodeunit -CodeunitId 50101 +``` + +Tests should pass. If not, review the structural changes. + +### Step 9: Phase 3 - API Modernization + +**Prompt**: + +``` +Modernize this code to use current AL best practices: + +1. Replace deprecated Find('-') with FindSet() +2. Add proper SetLoadFields for performance +3. Use better error handling patterns +4. Implement proper transaction handling +5. Replace hard-coded values with setup table + +[Include the Phase 2 code] +``` + +**Expected Result**: + +```al +/// +/// Manages sales order processing including validation, inventory checking, and discount application +/// +codeunit 50100 "Sales Order Management" +{ + var + InsufficientInventoryErr: Label 'Insufficient inventory for item %1. Available: %2, Required: %3'; + CustomerBlockedErr: Label 'Customer %1 is blocked and cannot place orders.'; + OrderProcessedMsg: Label 'Successfully processed order %1 with total amount %2.'; + + /// + /// Processes a sales order by validating customer, checking inventory, and applying discounts + /// + /// The sales order number to process + procedure ProcessSalesOrder(DocumentNo: Code[20]) + var + SalesHeader: Record "Sales Header"; + TotalAmount: Decimal; + begin + if DocumentNo = '' then + Error('Document number cannot be empty.'); + + if not SalesHeader.Get(SalesHeader."Document Type"::Order, DocumentNo) then + Error('Sales order %1 not found.', DocumentNo); + + ValidateCustomer(SalesHeader); + CheckInventoryAvailability(SalesHeader); + TotalAmount := CalculateOrderTotal(SalesHeader); + + if ShouldApplyLargeOrderDiscount(TotalAmount) then + ApplyLargeOrderDiscount(SalesHeader); + + LogOrderProcessing(DocumentNo, TotalAmount); + Message(OrderProcessedMsg, DocumentNo, Format(TotalAmount, 0, '')); + end; + + local procedure ValidateCustomer(SalesHeader: Record "Sales Header") + var + Customer: Record Customer; + begin + Customer.SetLoadFields(Blocked); + + if not Customer.Get(SalesHeader."Sell-to Customer No.") then + Error('Customer %1 not found.', SalesHeader."Sell-to Customer No."); + + if Customer.Blocked <> Customer.Blocked::" " then + Error(CustomerBlockedErr, Customer."No."); + end; + + local procedure CheckInventoryAvailability(SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + Item: Record Item; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.SetRange(Type, SalesLine.Type::Item); + SalesLine.SetLoadFields("No.", Quantity); + + if SalesLine.FindSet() then begin + Item.SetLoadFields(Inventory); + repeat + if Item.Get(SalesLine."No.") then + if Item.Inventory < SalesLine.Quantity then + Error(InsufficientInventoryErr, Item."No.", Item.Inventory, SalesLine.Quantity); + until SalesLine.Next() = 0; + end; + end; + + local procedure CalculateOrderTotal(SalesHeader: Record "Sales Header"): Decimal + var + SalesLine: Record "Sales Line"; + TotalAmount: Decimal; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.SetLoadFields("Line Amount"); + + if SalesLine.FindSet() then + repeat + TotalAmount += SalesLine."Line Amount"; + until SalesLine.Next() = 0; + + exit(TotalAmount); + end; + + local procedure ShouldApplyLargeOrderDiscount(TotalAmount: Decimal): Boolean + var + SalesSetup: Record "Sales & Receivables Setup"; + begin + SalesSetup.Get(); + exit(TotalAmount > SalesSetup."Large Order Threshold"); + end; + + local procedure ApplyLargeOrderDiscount(SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + SalesSetup: Record "Sales & Receivables Setup"; + begin + SalesSetup.Get(); + + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.ModifyAll("Line Discount %", SalesSetup."Large Order Discount %", true); + end; + + local procedure LogOrderProcessing(DocumentNo: Code[20]; TotalAmount: Decimal) + var + Telemetry: Codeunit Telemetry; + CustomDimensions: Dictionary of [Text, Text]; + begin + CustomDimensions.Add('DocumentNo', DocumentNo); + CustomDimensions.Add('TotalAmount', Format(TotalAmount)); + + Telemetry.LogMessage('SALESORD-001', 'Sales order processed successfully', + Verbosity::Normal, DataClassification::SystemMetadata, + TelemetryScope::ExtensionPublisher, CustomDimensions); + end; +} +``` + +### Step 10: Update Tests for Behavioral Changes + +Now that the code is cleaner, you may want to improve behavior (e.g., Error() instead of Message()): + +**Prompt**: + +``` +I want to change the behavior to use Error() instead of Message() for validation failures. + +First, update the tests to expect these errors: +- TestBlockedCustomerError should expect an error +- Update assertions to use asserterror and Assert.ExpectedError + +Then show the code changes needed. +``` + +### Step 11: Expand Test Coverage + +**Prompt**: + +``` +Now that refactoring is complete, add more comprehensive tests for edge cases. + +Include tests for: +- Happy path: successful processing +- Customer validation errors +- Inventory availability checks +- Large order discount application +- Edge cases: empty document number, non-existent order + +Use the AL test framework with proper setup and teardown. +``` + +**Expected Test Codeunit**: + +```al +codeunit 50101 "Sales Order Management Tests" +{ + Subtype = Test; + + var + Assert: Codeunit "Library Assert"; + LibrarySales: Codeunit "Library - Sales"; + LibraryInventory: Codeunit "Library - Inventory"; + + [Test] + procedure TestSuccessfulOrderProcessing() + var + SalesHeader: Record "Sales Header"; + SalesOrderMgmt: Codeunit "Sales Order Management"; + begin + // [GIVEN] A valid sales order with sufficient inventory + CreateSalesOrderWithInventory(SalesHeader); + + // [WHEN] Processing the order + SalesOrderMgmt.ProcessSalesOrder(SalesHeader."No."); + + // [THEN] No error is raised + // Verified by test not failing + end; + + [Test] + procedure TestBlockedCustomerError() + var + SalesHeader: Record "Sales Header"; + Customer: Record Customer; + SalesOrderMgmt: Codeunit "Sales Order Management"; + begin + // [GIVEN] A sales order for a blocked customer + CreateSalesOrderWithBlockedCustomer(SalesHeader, Customer); + + // [WHEN] Processing the order + asserterror SalesOrderMgmt.ProcessSalesOrder(SalesHeader."No."); + + // [THEN] Error is raised about blocked customer + Assert.ExpectedError(StrSubstNo('Customer %1 is blocked', Customer."No.")); + end; + + [Test] + procedure TestInsufficientInventoryError() + var + SalesHeader: Record "Sales Header"; + Item: Record Item; + SalesOrderMgmt: Codeunit "Sales Order Management"; + begin + // [GIVEN] A sales order with more quantity than available inventory + CreateSalesOrderWithInsufficientInventory(SalesHeader, Item); + + // [WHEN] Processing the order + asserterror SalesOrderMgmt.ProcessSalesOrder(SalesHeader."No."); + + // [THEN] Error is raised about insufficient inventory + Assert.ExpectedError('Insufficient inventory'); + end; + + [Test] + procedure TestLargeOrderDiscountApplied() + var + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + SalesSetup: Record "Sales & Receivables Setup"; + SalesOrderMgmt: Codeunit "Sales Order Management"; + ExpectedDiscount: Decimal; + begin + // [GIVEN] A large order that qualifies for discount + SalesSetup.Get(); + ExpectedDiscount := SalesSetup."Large Order Discount %"; + CreateLargeSalesOrder(SalesHeader); + + // [WHEN] Processing the order + SalesOrderMgmt.ProcessSalesOrder(SalesHeader."No."); + + // [THEN] Discount is applied to all lines + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.FindSet(); + repeat + Assert.AreEqual(ExpectedDiscount, SalesLine."Line Discount %", 'Discount not applied correctly'); + until SalesLine.Next() = 0; + end; + + local procedure CreateSalesOrderWithInventory(var SalesHeader: Record "Sales Header") + var + Item: Record Item; + SalesLine: Record "Sales Line"; + begin + LibraryInventory.CreateItem(Item); + Item.Inventory := 100; + Item.Modify(); + + LibrarySales.CreateSalesHeader(SalesHeader, SalesHeader."Document Type"::Order, LibrarySales.CreateCustomerNo()); + LibrarySales.CreateSalesLine(SalesLine, SalesHeader, SalesLine.Type::Item, Item."No.", 10); + end; + + // Additional helper procedures... +} +``` + +## Review Points: What to Check + +After each refactoring phase, verify: + +### ✅ Functionality Preserved + +- [ ] All original functionality still works +- [ ] No regressions introduced +- [ ] Tests pass (or create tests first!) +- [ ] Edge cases still handled + +### ✅ Code Quality Improved + +- [ ] More readable and maintainable +- [ ] Better structure and organization +- [ ] Clearer naming and documentation +- [ ] Proper error handling + +### ✅ Performance Not Degraded + +- [ ] Database operations optimized +- [ ] No unnecessary loops or queries +- [ ] Proper use of SetLoadFields +- [ ] Efficient algorithms + +### ✅ Modern Practices Applied + +- [ ] Current AL syntax and APIs +- [ ] No deprecated features +- [ ] Proper telemetry +- [ ] Good separation of concerns + +## Advanced Refactoring Patterns + +### Extract Interface for Testability + +**Prompt**: + +``` +Refactor this codeunit to use interfaces for dependencies, making it more testable. + +Extract interfaces for: +- Customer validation +- Inventory checking +- Discount calculation + +This will allow us to mock these dependencies in tests. +``` + +### Convert to Event-Driven Architecture + +**Prompt**: + +``` +Refactor this code to use Business Central events: + +1. Publish events for: + - Before order processing + - After order validation + - Before discount application + - After order processing + +2. This allows other extensions to hook into the process +``` + +### Add Batch Processing Support + +**Prompt**: + +``` +Extend this codeunit to support batch processing of multiple orders. + +Include: +- Progress tracking +- Error handling per order (don't fail entire batch) +- Summary reporting +- Performance optimization for bulk operations +``` + +## Common Refactoring Challenges + +### Challenge 1: Unknown Business Logic + +**Problem**: Code has complex logic without documentation + +**Solution**: + +``` +Analyze this code and explain what business logic it implements: +[paste complex code] + +Then suggest how to make the logic clearer through refactoring. +``` + +### Challenge 2: Tightly Coupled Code + +**Problem**: Code has many dependencies that are hard to untangle + +**Solution**: + +``` +This code is tightly coupled. Create a refactoring plan to: +1. Identify dependencies +2. Extract interfaces +3. Use dependency injection +4. Make code more modular +``` + +### Challenge 3: Large Procedures + +**Problem**: Single procedure doing too many things + +**Solution**: + +``` +This procedure is too large and complex. +Apply the Single Responsibility Principle to break it into smaller procedures. +Each procedure should have one clear purpose. +``` + +## Best Practices for Refactoring with AI + +### 1. Always Write Tests First + +{{% alert title="Golden Rule" color="primary" %}} +**Never refactor without tests.** Tests are your safety net. Write them first, run them, then refactor. +{{% /alert %}} + +``` +Before we start refactoring, let's write tests that lock in the current behavior. +Even if the current behavior isn't perfect, we need to know if we change it. +``` + +### 2. Refactor in Small Steps + +Don't try to refactor everything at once. Use incremental changes: + +``` +Let's refactor this code in three phases: +Phase 1: Just improve naming and documentation +[Run tests - should pass] +Phase 2: Extract methods +[Run tests - should pass] +Phase 3: Modernize APIs +[Run tests - should pass] +``` + +### 3. Run Tests After Every Change + +``` +I've completed the naming refactoring. +Let me run the tests to make sure nothing broke. + +[Run tests] + +Great, tests pass. Now let's proceed to Phase 2. +``` + +### 3. Use Git Commits for Each Phase + +``` +We've completed Phase 1: Safe Refactorings. +Before moving to Phase 2, I'll commit these changes. +Suggest a good commit message for these refactorings. +``` + +### 4. Document Why, Not Just What + +``` +For each major refactoring, add a comment explaining WHY the change was made: +- Why was the old approach problematic? +- What does the new approach solve? +- Are there trade-offs? +``` + +### 5. Keep Performance in Mind + +``` +As we refactor this code, let's ensure we don't hurt performance. +For each database operation change, explain the performance implications. +``` + +## Practice Exercise + +Refactor this legacy code: + +```al +codeunit 50200 "Item Price Calculator" +{ + procedure CalcPrice(IN: Code[20]; CU: Code[10]; QT: Decimal): Decimal + var + I: Record Item; + C: Record Customer; + P: Decimal; + begin + I.Get(IN); + P := I."Unit Price"; + + if QT > 100 then + P := P * 0.9; + + if CU <> '' then begin + C.Get(CU); + if C."Customer Price Group" = 'VIP' then + P := P * 0.95; + end; + + exit(P); + end; +} +``` + +**Your Tasks**: + +1. Assess the code and list issues +2. Create a refactoring plan +3. Apply naming improvements +4. Extract methods for each responsibility +5. Add proper documentation and error handling +6. Create tests +7. Add telemetry + +## Next Steps + +- Learn about [writing tests](../testing) for your refactored code +- See how [code review](../code-review) catches refactoring issues +- Explore [adding telemetry](../telemetry) to monitor refactored code diff --git a/content/docs/agentic-coding/GettingMore/testing.md b/content/docs/agentic-coding/GettingMore/testing.md new file mode 100644 index 00000000..3c9cfae7 --- /dev/null +++ b/content/docs/agentic-coding/GettingMore/testing.md @@ -0,0 +1,902 @@ +--- +title: "Writing Tests" +linkTitle: "Testing" +weight: 5 +description: > + Use AI to create comprehensive test coverage for your AL code +--- + +## Scenario + +You've developed new features for your Business Central extension, but you need comprehensive test coverage to: + +- Ensure code works as expected +- Prevent regressions when making changes +- Document expected behavior +- Enable confident refactoring +- Meet quality standards + +Writing tests manually is time-consuming, and you want to use AI to accelerate the process while maintaining test quality. + +## Goal + +Use AI to help you: + +- Generate unit tests for individual procedures +- Create integration tests for complex workflows +- Design test data and scenarios +- Write test helpers and fixtures +- Create mock objects for dependencies +- Implement data-driven tests + +## The Code to Test + +Here's a codeunit that needs test coverage: + +```al +codeunit 50100 "Order Discount Manager" +{ + procedure CalculateDiscount(var SalesHeader: Record "Sales Header"): Decimal + var + Customer: Record Customer; + DiscountPct: Decimal; + begin + if not Customer.Get(SalesHeader."Sell-to Customer No.") then + Error('Customer %1 not found', SalesHeader."Sell-to Customer No."); + + DiscountPct := GetCustomerDiscount(Customer); + DiscountPct += GetVolumeDiscount(SalesHeader); + DiscountPct += GetSeasonalDiscount(); + + if DiscountPct > 50 then + DiscountPct := 50; + + exit(DiscountPct); + end; + + local procedure GetCustomerDiscount(Customer: Record Customer): Decimal + begin + case Customer."Customer Discount Group" of + 'VIP': + exit(10); + 'PREMIUM': + exit(5); + else + exit(0); + end; + end; + + local procedure GetVolumeDiscount(SalesHeader: Record "Sales Header"): Decimal + var + SalesLine: Record "Sales Line"; + TotalAmount: Decimal; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.CalcSums("Line Amount"); + TotalAmount := SalesLine."Line Amount"; + + case true of + TotalAmount >= 10000: + exit(15); + TotalAmount >= 5000: + exit(10); + TotalAmount >= 1000: + exit(5); + else + exit(0); + end; + end; + + local procedure GetSeasonalDiscount(): Decimal + begin + if Date2DMY(Today, 2) in [11, 12] then + exit(5); + exit(0); + end; +} +``` + +## Step-by-Step Testing Process + +### Step 1: Generate Basic Test Structure + +**Prompt**: + +``` +Create a test codeunit for the Order Discount Manager. + +Include: +- Proper test codeunit structure with Subtype = Test +- Setup and teardown if needed +- Test procedure stubs for all public procedures +- Use AL test framework conventions +- Include Assert codeunit +- Add test isolation attributes where needed + +[Include the codeunit code] +``` + +**Expected Result**: + +```al +codeunit 50101 "Order Discount Mgr. Tests" +{ + Subtype = Test; + + var + Assert: Codeunit "Library Assert"; + LibrarySales: Codeunit "Library - Sales"; + LibraryUtility: Codeunit "Library - Utility"; + IsInitialized: Boolean; + + [Test] + procedure TestCalculateDiscountBasic() + begin + // Test basic discount calculation + end; + + [Test] + procedure TestVIPCustomerDiscount() + begin + // Test VIP customer gets 10% discount + end; + + [Test] + procedure TestVolumeDiscountTiers() + begin + // Test volume discount calculation at different amounts + end; + + [Test] + procedure TestSeasonalDiscount() + begin + // Test seasonal discount in November/December + end; + + [Test] + procedure TestMaximumDiscountCap() + begin + // Test discount cannot exceed 50% + end; + + [Test] + procedure TestCustomerNotFoundError() + begin + // Test error when customer doesn't exist + end; + + local procedure Initialize() + begin + if IsInitialized then + exit; + + // Setup code here + IsInitialized := true; + end; +} +``` + +### Step 2: Implement Happy Path Test + +**Prompt**: + +``` +Implement the TestCalculateDiscountBasic test using the Given-When-Then pattern. + +This test should verify: +- A standard customer with a medium-size order +- Gets the expected discount percentage +- No errors are raised + +Use the Library codeunits for test data creation. +Include clear comments for each section. +``` + +**Expected Result**: + +```al +[Test] +procedure TestCalculateDiscountBasic() +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ActualDiscount: Decimal; + ExpectedDiscount: Decimal; +begin + // [SCENARIO] Calculate discount for a standard order + Initialize(); + + // [GIVEN] A standard customer with no special discount group + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := ''; + Customer.Modify(); + + // [GIVEN] A sales order with total amount of 2000 (5% volume discount) + SalesHeader := CreateSalesOrderWithAmount(Customer."No.", 2000); + + // [GIVEN] Expected discount is 5% (volume only, not in seasonal months) + ExpectedDiscount := 5; + + // [WHEN] Calculating the discount + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // [THEN] The discount matches expected value + Assert.AreEqual(ExpectedDiscount, ActualDiscount, 'Discount calculation incorrect'); +end; + +local procedure CreateSalesOrderWithAmount(CustomerNo: Code[20]; TotalAmount: Decimal): Record "Sales Header" +var + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + Item: Record Item; +begin + LibrarySales.CreateSalesHeader(SalesHeader, SalesHeader."Document Type"::Order, CustomerNo); + + Item."No." := LibraryUtility.GenerateRandomCode(Item.FieldNo("No."), Database::Item); + Item."Unit Price" := TotalAmount; + Item.Insert(); + + LibrarySales.CreateSalesLine(SalesLine, SalesHeader, SalesLine.Type::Item, Item."No.", 1); + SalesLine.Validate("Unit Price", TotalAmount); + SalesLine.Modify(true); + + exit(SalesHeader); +end; +``` + +### Step 3: Implement Error Case Tests + +**Prompt**: + +``` +Implement the TestCustomerNotFoundError test. + +This should verify: +- When an invalid customer number is used +- An appropriate error is raised +- The error message contains the customer number + +Use asserterror and Assert.ExpectedError. +``` + +**Expected Result**: + +```al +[Test] +procedure TestCustomerNotFoundError() +var + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + InvalidCustomerNo: Code[20]; +begin + // [SCENARIO] Error is raised when customer doesn't exist + Initialize(); + + // [GIVEN] A sales header with non-existent customer + InvalidCustomerNo := 'INVALID123'; + LibrarySales.CreateSalesHeader(SalesHeader, SalesHeader."Document Type"::Order, ''); + SalesHeader."Sell-to Customer No." := InvalidCustomerNo; + SalesHeader.Modify(); + + // [WHEN] Calculating discount for non-existent customer + asserterror OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // [THEN] Appropriate error is raised with customer number + Assert.ExpectedError(StrSubstNo('Customer %1 not found', InvalidCustomerNo)); +end; +``` + +### Step 4: Implement Data-Driven Tests + +**Prompt**: + +``` +Create a comprehensive test for all customer discount tiers (VIP, PREMIUM, standard). + +Use a data-driven approach where one test function tests all scenarios. +Create a local helper that takes customer group and expected discount as parameters. + +Test these scenarios: +- VIP customer: 10% discount +- PREMIUM customer: 5% discount +- Standard customer: 0% discount +- Empty group: 0% discount +``` + +**Expected Result**: + +```al +[Test] +procedure TestCustomerDiscountTiers() +begin + // [SCENARIO] Different customer types receive appropriate discounts + Initialize(); + + // [GIVEN] [WHEN] [THEN] VIP customers get 10% discount + VerifyCustomerTypeDiscount('VIP', 10); + + // [GIVEN] [WHEN] [THEN] Premium customers get 5% discount + VerifyCustomerTypeDiscount('PREMIUM', 5); + + // [GIVEN] [WHEN] [THEN] Standard customers get 0% discount + VerifyCustomerTypeDiscount('STANDARD', 0); + + // [GIVEN] [WHEN] [THEN] Customers with no group get 0% discount + VerifyCustomerTypeDiscount('', 0); +end; + +local procedure VerifyCustomerTypeDiscount(CustomerGroup: Code[10]; ExpectedDiscount: Decimal) +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ActualDiscount: Decimal; +begin + // Create customer with specific group + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := CustomerGroup; + Customer.Modify(); + + // Create order with amount below volume discount threshold (< 1000) + SalesHeader := CreateSalesOrderWithAmount(Customer."No.", 500); + + // Calculate discount + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // Verify expected discount + Assert.AreEqual(ExpectedDiscount, ActualDiscount, + StrSubstNo('Incorrect discount for customer group %1', CustomerGroup)); +end; +``` + +### Step 5: Test Edge Cases and Boundaries + +**Prompt**: + +``` +Create tests for volume discount boundary conditions. + +Test these specific amounts: +- 999: Just below 1000 threshold (expect 0% volume discount) +- 1000: Exactly at threshold (expect 5% volume discount) +- 4999: Just below 5000 threshold (expect 5% volume discount) +- 5000: Exactly at threshold (expect 10% volume discount) +- 9999: Just below 10000 threshold (expect 10% volume discount) +- 10000: Exactly at threshold (expect 15% volume discount) + +Use descriptive test names and clear assertions. +``` + +**Expected Result**: + +```al +[Test] +procedure TestVolumeDiscountBoundaries() +begin + // [SCENARIO] Volume discounts applied at exact thresholds + Initialize(); + + // Just below first threshold + VerifyVolumeDiscount(999, 0, 'Below 1000 threshold'); + + // Exactly at first threshold + VerifyVolumeDiscount(1000, 5, 'At 1000 threshold'); + + // Between first and second threshold + VerifyVolumeDiscount(4999, 5, 'Below 5000 threshold'); + + // Exactly at second threshold + VerifyVolumeDiscount(5000, 10, 'At 5000 threshold'); + + // Between second and third threshold + VerifyVolumeDiscount(9999, 10, 'Below 10000 threshold'); + + // Exactly at third threshold + VerifyVolumeDiscount(10000, 15, 'At 10000 threshold'); +end; + +local procedure VerifyVolumeDiscount(OrderAmount: Decimal; ExpectedVolumeDiscount: Decimal; Scenario: Text) +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ActualDiscount: Decimal; +begin + // Create standard customer (no customer discount) + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := ''; + Customer.Modify(); + + // Create order with specific amount + SalesHeader := CreateSalesOrderWithAmount(Customer."No.", OrderAmount); + + // Calculate discount (assuming not in seasonal months) + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // Verify volume discount + Assert.AreEqual(ExpectedVolumeDiscount, ActualDiscount, + StrSubstNo('Incorrect volume discount for %1 (amount: %2)', Scenario, OrderAmount)); +end; +``` + +### Step 6: Test Maximum Discount Cap + +**Prompt**: + +``` +Create a test that verifies the 50% maximum discount cap. + +Test scenario: +- VIP customer (10% discount) +- Large order (15% volume discount) +- Seasonal period (5% discount) +- Total would be 30%, which is under cap - verify this works +- Then test a scenario that would exceed 50% and verify it's capped + +Consider: What combination would exceed 50%? We may need to modify setup or mock GetSeasonalDiscount. +``` + +**Expected Result**: + +```al +[Test] +procedure TestMaximumDiscountCap() +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ActualDiscount: Decimal; +begin + // [SCENARIO] Discount is capped at 50% even when combined discounts exceed it + Initialize(); + + // [GIVEN] VIP customer (10% discount) + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := 'VIP'; + Customer.Modify(); + + // [GIVEN] Large order (15% volume discount) + SalesHeader := CreateSalesOrderWithAmount(Customer."No.", 10000); + + // [GIVEN] If testing in Nov/Dec, total would be 10+15+5=30% (under cap) + // [GIVEN] To test cap, we need a scenario that would exceed 50% + // Note: With current business logic, max is 30%, so cap isn't reached + + // [WHEN] Calculating discount + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // [THEN] Discount doesn't exceed 50% + Assert.IsTrue(ActualDiscount <= 50, 'Discount exceeds maximum allowed 50%'); +end; + +[Test] +procedure TestDiscountCapWithMultipleDiscounts() +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ActualDiscount: Decimal; +begin + // [SCENARIO] Combined discounts that would exceed 50% are capped + // [NOTE] This test may need the business logic modified to make it relevant + // Current max possible: 10% (VIP) + 15% (volume) + 5% (seasonal) = 30% + + Initialize(); + + // Create scenario with maximum possible discounts + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := 'VIP'; + Customer.Modify(); + + SalesHeader := CreateSalesOrderWithAmount(Customer."No.", 10000); + + // Calculate discount + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // Verify cap is applied if needed + Assert.IsTrue(ActualDiscount <= 50, 'Discount cap not enforced'); +end; +``` + +### Step 7: Test Time-Dependent Logic + +**Prompt**: + +``` +Create tests for the seasonal discount that depends on the current date. + +Since GetSeasonalDiscount uses Today, we need to: +1. Test behavior for November (month 11) +2. Test behavior for December (month 12) +3. Test behavior for other months + +Explain how to handle date-dependent tests in AL. +Options: +- Make the date a parameter (refactor code) +- Use test isolation / mocking +- Create tests that work year-round +``` + +**Expected Result**: + +```al +[Test] +procedure TestSeasonalDiscountInNovember() +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ActualDiscount: Decimal; + CurrentMonth: Integer; +begin + // [SCENARIO] Seasonal discount is applied in November + // [NOTE] This test only passes when run in November + + Initialize(); + + CurrentMonth := Date2DMY(Today, 2); + if CurrentMonth <> 11 then + exit; // Skip test if not November + + // [GIVEN] Standard customer with small order (no other discounts) + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := ''; + Customer.Modify(); + + SalesHeader := CreateSalesOrderWithAmount(Customer."No.", 500); + + // [WHEN] Calculating discount in November + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // [THEN] 5% seasonal discount is applied + Assert.AreEqual(5, ActualDiscount, 'Seasonal discount not applied in November'); +end; + +[Test] +procedure TestNoSeasonalDiscountInJanuary() +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ActualDiscount: Decimal; + CurrentMonth: Integer; +begin + // [SCENARIO] No seasonal discount in non-holiday months + + Initialize(); + + CurrentMonth := Date2DMY(Today, 2); + if CurrentMonth in [11, 12] then + exit; // Skip test if in seasonal period + + // [GIVEN] Standard customer with small order + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := ''; + Customer.Modify(); + + SalesHeader := CreateSalesOrderWithAmount(Customer."No.", 500); + + // [WHEN] Calculating discount outside seasonal period + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // [THEN] No discount is applied + Assert.AreEqual(0, ActualDiscount, 'Unexpected discount outside seasonal period'); +end; + +// [RECOMMENDATION] Refactor GetSeasonalDiscount to accept date parameter +// This would make testing much easier and more reliable: +// local procedure GetSeasonalDiscount(CheckDate: Date): Decimal +``` + +### Step 8: Integration Test + +**Prompt**: + +``` +Create an integration test that tests the complete workflow: + +1. Create a new customer with VIP status +2. Create a sales order for that customer +3. Add multiple lines totaling over 10,000 +4. Calculate the discount +5. Verify all discount types are correctly combined +6. Verify the discount is applied to the sales header + +This test should verify the codeunit works correctly with real BC data and tables. +``` + +**Expected Result**: + +```al +[Test] +procedure TestCompleteDiscountWorkflow() +var + Customer: Record Customer; + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + Item: Record Item; + OrderDiscountMgr: Codeunit "Order Discount Manager"; + ExpectedDiscount: Decimal; + ActualDiscount: Decimal; + CurrentMonth: Integer; +begin + // [SCENARIO] Complete workflow of discount calculation and application + Initialize(); + + // [GIVEN] A VIP customer + Customer.Get(LibrarySales.CreateCustomerNo()); + Customer."Customer Discount Group" := 'VIP'; + Customer.Modify(); + + // [GIVEN] A sales order with multiple lines totaling 12,000 + LibrarySales.CreateSalesHeader(SalesHeader, SalesHeader."Document Type"::Order, Customer."No."); + + // Add three items + CreateItemAndSalesLine(SalesHeader, 5000); + CreateItemAndSalesLine(SalesHeader, 4000); + CreateItemAndSalesLine(SalesHeader, 3000); + + // [GIVEN] Expected discount calculation: + // - VIP customer: 10% + // - Volume (>10000): 15% + // - Seasonal (if Nov/Dec): 5% + CurrentMonth := Date2DMY(Today, 2); + if CurrentMonth in [11, 12] then + ExpectedDiscount := 30 // 10 + 15 + 5 + else + ExpectedDiscount := 25; // 10 + 15 + + // [WHEN] Calculating the discount + ActualDiscount := OrderDiscountMgr.CalculateDiscount(SalesHeader); + + // [THEN] The correct combined discount is calculated + Assert.AreEqual(ExpectedDiscount, ActualDiscount, + 'Complete discount calculation incorrect'); + + // [THEN] Verify order total is correct + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.CalcSums("Line Amount"); + Assert.AreEqual(12000, SalesLine."Line Amount", 'Order total incorrect'); +end; + +local procedure CreateItemAndSalesLine(SalesHeader: Record "Sales Header"; Amount: Decimal) +var + Item: Record Item; + SalesLine: Record "Sales Line"; +begin + Item."No." := LibraryUtility.GenerateRandomCode(Item.FieldNo("No."), Database::Item); + Item."Unit Price" := Amount; + Item.Insert(); + + LibrarySales.CreateSalesLine(SalesLine, SalesHeader, SalesLine.Type::Item, Item."No.", 1); + SalesLine.Validate("Unit Price", Amount); + SalesLine.Modify(true); +end; +``` + +## Review Points: What to Check in Tests + +### ✅ Test Quality + +- [ ] Tests are independent (can run in any order) +- [ ] Tests are repeatable (same result every time) +- [ ] Tests have clear Given-When-Then structure +- [ ] Test names clearly describe what is being tested +- [ ] Assertions have descriptive error messages + +### ✅ Test Coverage + +- [ ] Happy path scenarios covered +- [ ] Error cases tested +- [ ] Edge cases and boundaries tested +- [ ] All public procedures have tests +- [ ] Integration scenarios tested + +### ✅ Test Maintainability + +- [ ] Helper methods reduce duplication +- [ ] Test data creation is centralized +- [ ] Tests are easy to understand +- [ ] Tests don't depend on specific data +- [ ] Setup and teardown properly implemented + +### ✅ Test Performance + +- [ ] Tests run quickly +- [ ] Minimal database operations +- [ ] Proper use of test isolation +- [ ] No unnecessary waits or delays + +## Advanced Testing Patterns + +### Pattern 1: Test Fixtures + +**Prompt**: + +``` +Create a test fixture class for sales orders that provides: +- Standard order (customer with no discounts, small amount) +- VIP order (VIP customer, medium amount) +- Large order (standard customer, large amount) +- Complex order (VIP customer, large amount, multiple lines) + +These fixtures should be reusable across all tests. +``` + +### Pattern 2: Mock Objects + +**Prompt**: + +``` +The GetSeasonalDiscount procedure is hard to test because it depends on Today. + +Refactor the code to use dependency injection: +1. Create an interface for date provider +2. Inject the date provider into the codeunit +3. Create a mock date provider for testing +4. Show how to test with different dates +``` + +### Pattern 3: Test Data Builders + +**Prompt**: + +``` +Create a fluent test data builder for sales orders: + +SalesOrderBuilder + .WithCustomer(CustomerNo) + .WithVIPStatus() + .WithLine(ItemNo, Quantity, Price) + .WithTotalAmount(Amount) + .Build() + +This makes test data creation more readable and flexible. +``` + +## Best Practices for AI-Assisted Testing + +### 1. Start with Test Cases, Then Generate + +``` +Before generating test code, help me identify all test cases for this procedure: +- What scenarios should be tested? +- What are the edge cases? +- What error conditions exist? +- What are the boundary conditions? + +[Include procedure code] +``` + +### 2. Generate Tests in Batches + +``` +Generate tests for these three related procedures together so they share test helpers: +- CalculateDiscount +- ApplyDiscount +- ValidateDiscount +``` + +### 3. Request Explanatory Comments + +``` +Generate the test with detailed comments explaining: +- Why this test case is important +- What could go wrong if this test didn't exist +- Any gotchas or special considerations +``` + +### 4. Ask for Test Improvements + +``` +Review this test I wrote. Suggest improvements for: +- Clarity and readability +- Better assertions +- Edge cases I might have missed +- Ways to make it more maintainable +``` + +### 5. Generate Test Documentation + +``` +Create documentation for this test suite explaining: +- What is being tested +- Test coverage summary +- How to run the tests +- How to add new tests +- Known limitations +``` + +## Common Testing Challenges + +### Challenge 1: Testing Private Methods + +**Problem**: Local procedures can't be tested directly + +**Solution**: + +``` +I need to test this local procedure. Options: +1. Make it public (if appropriate) +2. Test it indirectly through public procedures +3. Extract to a separate testable codeunit + +Which approach is best for this scenario? [Include code] +``` + +### Challenge 2: Testing Database Operations + +**Problem**: Tests that modify database are slow and fragile + +**Solution**: + +``` +This codeunit performs database operations. Help me: +1. Identify which operations need real database +2. Which can be mocked or isolated +3. Create a testing strategy that balances coverage and speed +``` + +### Challenge 3: Testing External Dependencies + +**Problem**: Code calls external services or APIs + +**Solution**: + +``` +This code calls an external API. Create: +1. An interface for the API +2. A mock implementation for testing +3. Tests using the mock +4. Integration tests for the real API (marked for manual runs) +``` + +## Practice Exercise + +Write comprehensive tests for this codeunit: + +```al +codeunit 50200 "Credit Limit Checker" +{ + procedure CheckCreditLimit(CustomerNo: Code[20]; NewOrderAmount: Decimal): Boolean + var + Customer: Record Customer; + CustLedgerEntry: Record "Cust. Ledger Entry"; + TotalOutstanding: Decimal; + begin + if not Customer.Get(CustomerNo) then + Error('Customer not found'); + + Customer.CalcFields("Balance (LCY)"); + TotalOutstanding := Customer."Balance (LCY)" + NewOrderAmount; + + if Customer."Credit Limit (LCY)" = 0 then + exit(true); + + exit(TotalOutstanding <= Customer."Credit Limit (LCY)"); + end; +} +``` + +**Your Tasks**: + +1. List all test scenarios +2. Create test codeunit structure +3. Implement tests for: + - Customer not found + - No credit limit (unlimited) + - Within credit limit + - Exactly at credit limit + - Over credit limit + - Edge cases +4. Add integration test +5. Review and improve tests + +## Next Steps + +- Learn how [code review](../code-review) can verify test quality +- See how [refactoring](../refactoring) benefits from good tests +- Explore [documentation](../documentation) for test procedures From 3e884878ab4dd032300c333a1cba24bb8ea326d0 Mon Sep 17 00:00:00 2001 From: Jeremy Vyska Date: Wed, 1 Apr 2026 09:19:07 +0200 Subject: [PATCH 60/60] Add Kine article: AI Knowledge Gap That Ships to Production to vibe coding resources Co-Authored-By: Claude Sonnet 4.5 --- .../agentic-coding/CommunityResources/articles.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/content/docs/agentic-coding/CommunityResources/articles.md b/content/docs/agentic-coding/CommunityResources/articles.md index 02c52e86..44ec92a6 100644 --- a/content/docs/agentic-coding/CommunityResources/articles.md +++ b/content/docs/agentic-coding/CommunityResources/articles.md @@ -14,6 +14,21 @@ This page curates blog posts, articles, and written guides from the Business Cen ### Getting Started +#### "AI for BC Development - The Knowledge Gap That Ships to Production" — Kine +**Author**: Kine (blog.kine.cz) +**Published**: 2025 +**Summary**: A critical self-assessment guide on whether you are ready to validate what AI produces for BC development. Covers common AI mistakes in AL code (wrong field assignment, missing keys, reinventing standard libraries) and what BC knowledge areas you need to review AI output responsibly. + +**Key Takeaways**: +- Common AI mistakes in AL code that ship to production +- Self-assessment framework for AI-assisted development readiness +- BC knowledge areas required to review AI output responsibly +- Practical examples of wrong field assignments, missing keys, and reinvented standard libraries + +**Link**: https://blog.kine.cz/posts/bcdevelopmentserie-02b/ + +--- + #### "Vibe Coding — yes or no?" — Demiliani **Author**: Demiliani **Published**: 2025-08-21