From 6fc1d1e7fde6ed70d34ffcd5b249f7c24b9e24de Mon Sep 17 00:00:00 2001
From: devlooped-bot
Date: Wed, 15 Apr 2026 00:48:15 +0000
Subject: [PATCH] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Bump=20files=20with=20dotn?=
=?UTF-8?q?et-file=20sync=20=EF=BB=BF#=20devlooped/oss?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Enhance documentation instructions for project work https://github.com/devlooped/oss/commit/e616d89
- Use GH_TOKEN if available for PR https://github.com/devlooped/oss/commit/77e83f2
- Ignore .env files recursively https://github.com/devlooped/oss/commit/3776526
- Improve default Product metadata, remove .git from user-facing URLs https://github.com/devlooped/oss/commit/4339749
- Ignore *.local recursively https://github.com/devlooped/oss/commit/a225b7a
- If the OSMF eula is present, switch to its license file https://github.com/devlooped/oss/commit/4b84c54
- Consider either None or Content for OSMF license patching https://github.com/devlooped/oss/commit/083a37b
- Enhance include workflow with OSMF EULA support https://github.com/devlooped/oss/commit/f2050db
- Set severity of IDE1100 to none https://github.com/devlooped/oss/commit/1ed9afe
- Trim whitespace in file content replacement https://github.com/devlooped/oss/commit/e53557f
- Set explicit tab size and eol for code files https://github.com/devlooped/oss/commit/5dba0d0
- Fix path pattern for markdown files in workflow https://github.com/devlooped/oss/commit/6a6de05
- Revert EOL change in editorconfig for C# files https://github.com/devlooped/oss/commit/2d0e5a5
- Revert indent size for project files https://github.com/devlooped/oss/commit/a62c459
- Fix error message quotes in includes.yml https://github.com/devlooped/oss/commit/26e8cb7
- Change label from 'docs' to 'dependencies' https://github.com/devlooped/oss/commit/2d1fb4e
- Avoid failure on PR creation if osmfeula.txt doesn't exist in repo https://github.com/devlooped/oss/commit/8ff5178
- Update create-pull-request action to version 8 https://github.com/devlooped/oss/commit/0662872
- Group Spectre.Console updates https://github.com/devlooped/oss/commit/917ff54
- Group MEAI packages together https://github.com/devlooped/oss/commit/e733294
- Ensure lf for Scriban templates always https://github.com/devlooped/oss/commit/4a9aa32
- Add .NET 9.0 so format can succeed https://github.com/devlooped/oss/commit/ec9d7cd
- Make sure the feed url is available to msbuild https://github.com/devlooped/oss/commit/931da83
- Move dotnet setup to composite action https://github.com/devlooped/oss/commit/08c7077
- Switch to dotnet-env for .NET SDK setup https://github.com/devlooped/oss/commit/56c2b85
- Switch to dnx retest shorthand https://github.com/devlooped/oss/commit/fddfd89
- Ensure quiet confirmation of tool download/install https://github.com/devlooped/oss/commit/e11b002
- Ensure dnx run succeeds even on Windows https://github.com/devlooped/oss/commit/7f5f9ee
- Update branches for push event in build.yml https://github.com/devlooped/oss/commit/5da103c
- Allow workflow to work cross-org https://github.com/devlooped/oss/commit/af171b7
- Add explicit write permissions from caller workflow https://github.com/devlooped/oss/commit/8fa147d
- Publish builds should point to nuget.org not CI feed https://github.com/devlooped/oss/commit/db918f0
- Cap rate limit wait at 5 minutes, abort if longer https://github.com/devlooped/oss/commit/61a602f
- Ignore slnx file format too https://github.com/devlooped/oss/commit/68b409c
- Support using current Version from CVM https://github.com/devlooped/oss/commit/2fff747
- Update Directory.Build.props with support for underscores in branch name https://github.com/devlooped/oss/commit/81d972f
- Add Company MSBuild property by default https://github.com/devlooped/oss/commit/c509be4
- Disable warnings for non-packable test projects https://github.com/devlooped/oss/commit/95b338b
- Update versioning scheme in Directory.Build.props https://github.com/devlooped/oss/commit/f2400ef
- Enable package pruning in Directory.Build.props https://github.com/devlooped/oss/commit/0ff8b7b
- Change file type from None to Content for osmfeula.txt https://github.com/devlooped/oss/commit/fd03672
- Add Pack attribute to OSMFEULA content item https://github.com/devlooped/oss/commit/dd13ed3
---
.editorconfig | 5 +
.gitattributes | 1 +
.github/copilot-instructions.md | 94 +++++++
.github/dependabot.yml | 8 +
.github/workflows/build.yml | 18 +-
.github/workflows/dotnet-env.yml | 44 ++++
.github/workflows/dotnet-file.yml | 7 +-
.github/workflows/includes.yml | 28 ++-
.github/workflows/publish.yml | 15 +-
.github/workflows/triage.yml | 6 +-
.gitignore | 2 +
.netconfig | 69 ++++--
_config.yml | 2 +-
readme.md | 64 +++--
src/Directory.Build.props | 34 ++-
src/Directory.Build.targets | 19 +-
src/ISBN/groups.js | 400 +++++++++++++++++++++++++-----
17 files changed, 661 insertions(+), 155 deletions(-)
create mode 100644 .github/copilot-instructions.md
create mode 100644 .github/workflows/dotnet-env.yml
diff --git a/.editorconfig b/.editorconfig
index 4cab270..3ba6837 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -30,6 +30,8 @@ indent_size = 2
# Dotnet code style settings:
[*.{cs,vb}]
+tab_width = 4
+
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
# Avoid "this." and "Me." if not necessary
@@ -57,6 +59,9 @@ dotnet_style_require_accessibility_modifiers = omit_if_default:error
# IDE0040: Add accessibility modifiers
dotnet_diagnostic.IDE0040.severity = error
+# IDE1100: Error reading content of source file 'Project.TargetFrameworkMoniker' (i.e. from ThisAssembly)
+dotnet_diagnostic.IDE1100.severity = none
+
[*.cs]
# Top-level files are definitely OK
csharp_using_directive_placement = outside_namespace:silent
diff --git a/.gitattributes b/.gitattributes
index 4f89148..3095556 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,7 @@
# normalize by default
* text=auto encoding=UTF-8
*.sh text eol=lf
+*.sbn eol=lf
# These are windows specific files which we may as well ensure are
# always crlf on checkout
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000..514ebd5
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,94 @@
+# .NET Repository
+
+**Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.**
+
+## Working Effectively
+
+### Essential Build Commands
+- **Restore dependencies**: `dotnet restore`
+
+- **Build the entire solution**: `dotnet build`
+
+- **Run tests**: `dnx --yes retest`
+ - Runs all unit tests across the solution
+ - If tests fail due to Azure Storage, run the following commands and retry: `npm install azurite` and `npx azurite &`
+
+### Build Validation and CI Requirements
+- **Always run before committing**:
+ * `dnx --yes retest`
+ * `dotnet format whitespace -v:diag --exclude ~/.nuget`
+ * `dotnet format style -v:diag --exclude ~/.nuget`
+
+### Project Structure and Navigation
+
+| Directory | Description |
+|-----------|-------------|
+| `src/` | Contains the repo source code. |
+| `bin/` | Contains built packages (if any) |
+
+### Code Style and Formatting
+
+#### EditorConfig Rules
+The repository uses `.editorconfig` at the repo root for consistent code style.
+
+- **Indentation**: 4 spaces for C# files, 2 spaces for XML/YAML/JSON
+- **Line endings**: LF (Unix-style)
+- **Sort using directives**: System.* namespaces first (`dotnet_sort_system_directives_first = true`)
+- **Type references**: Prefer language keywords over framework type names (`int` vs `Int32`)
+- **Modern C# features**: Use object/collection initializers, coalesce expressions when possible, use var when the type is apparent from the right-hand side of the assignment
+- **Visibility modifiers**: only explicitly specify visibility when different from the default (e.g. `public` for classes, no `internal` for classes or `private` for fields, etc.)
+
+#### Formatting Validation
+- CI enforces formatting with `dotnet format whitespace` and `dotnet format style`
+- Run locally: `dotnet format whitespace --verify-no-changes -v:diag --exclude ~/.nuget`
+- Fix formatting: `dotnet format` (without `--verify-no-changes`)
+
+### Testing Practices
+
+#### Test Framework
+- **xUnit** for all unit and integration tests
+- **Moq** for mocking dependencies
+- Located in `src/*.Tests/`
+
+#### Test Attributes
+Custom xUnit attributes are sometimes used for conditional test execution:
+- `[SecretsFact("XAI_API_KEY")]` - Skips test if required secrets are missing from user secrets or environment variables
+- `[LocalFact("SECRET")]` - Runs only locally (skips in CI), requires specified secrets
+- `[CIFact]` - Runs only in CI environment
+
+### Dependency Management
+
+#### Adding Dependencies
+- Add to appropriate `.csproj` file
+- Run `dotnet restore` to update dependencies
+- Ensure version consistency across projects where applicable
+
+#### CI/CD Pipeline
+- **Build workflow**: `.github/workflows/build.yml` - runs on PR and push to main/rel/feature branches
+- **Publish workflow**: Publishes to Sleet feed when `SLEET_CONNECTION` secret is available
+- **OS matrix**: Configured in `.github/workflows/os-matrix.json` (defaults to ubuntu-latest)
+
+### Special Files and Tools
+
+#### dnx Command
+- **Purpose**: built-in tool for running arbitrary dotnet tools that are published on nuget.org. `--yes` auto-confirms install before run.
+- **Example**: `dnx --yes retest` - runs tests with automatic retry on transient failures (retest being a tool package published at https://www.nuget.org/packages/retest)
+- **In CI**: `dnx --yes retest -- --no-build` (skips build, runs tests only)
+
+#### Directory.Build.rsp
+- MSBuild response file with default build arguments
+- `-nr:false` - disables node reuse
+- `-m:1` - single-threaded build (for stability)
+- `-v:m` - minimal verbosity
+
+#### Code Quality
+- All PRs must pass format validation
+- Tests must pass on all target frameworks
+- Follow existing patterns and conventions in the codebase
+
+## Documenting Work
+
+Project implemention details, design and key decisions should be documented in a top-level AGENTS.md file at the repo root.
+Keep this file updated whenever you make change significant changes for future reference.
+
+User-facing features and APIs should be documented to highlight (not extensively, as an overview) key project features and capabilities, in the readme.md file at the repo root.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index c95eb73..11c5d7d 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -24,6 +24,11 @@ updates:
Extensions:
patterns:
- "Microsoft.Extensions*"
+ exclude-patterns:
+ - "Microsoft.Extensions.AI*"
+ ExtensionsAI:
+ patterns:
+ - "Microsoft.Extensions.AI*"
Web:
patterns:
- "Microsoft.AspNetCore*"
@@ -38,3 +43,6 @@ updates:
ProtoBuf:
patterns:
- "protobuf-*"
+ Spectre:
+ patterns:
+ - "Spectre.Console*"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 6653044..94db3ff 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,7 +12,7 @@ on:
- Release
- Debug
push:
- branches: [ main, dev, 'dev/*', 'feature/*', 'rel/*' ]
+ branches: [ main, 'feature/*', 'rel/*' ]
paths-ignore:
- changelog.md
- readme.md
@@ -28,6 +28,7 @@ env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
MSBUILDTERMINALLOGGER: auto
Configuration: ${{ github.event.inputs.configuration || 'Release' }}
+ SLEET_FEED_URL: ${{ vars.SLEET_FEED_URL }}
defaults:
run:
@@ -65,20 +66,14 @@ jobs:
fetch-depth: 0
- name: ⚙ dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: |
- 6.x
- 8.x
- 9.x
+ uses: devlooped/actions-dotnet-env@v1
- name: 🙏 build
run: dotnet build -m:1 -bl:build.binlog
- name: 🧪 test
- run: |
- dotnet tool update -g dotnet-retest
- dotnet retest -- --no-build
+ shell: pwsh
+ run: dnx --yes retest -- --no-build
- name: 🐛 logs
uses: actions/upload-artifact@v4
@@ -104,6 +99,9 @@ jobs:
submodules: recursive
fetch-depth: 0
+ - name: ⚙ dotnet
+ uses: devlooped/actions-dotnet-env@v1
+
- name: ✓ ensure format
run: |
dotnet format whitespace --verify-no-changes -v:diag --exclude ~/.nuget
diff --git a/.github/workflows/dotnet-env.yml b/.github/workflows/dotnet-env.yml
new file mode 100644
index 0000000..a76d0fd
--- /dev/null
+++ b/.github/workflows/dotnet-env.yml
@@ -0,0 +1,44 @@
+name: dotnet-env
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ paths:
+ - '**/*.*proj'
+
+jobs:
+ which-dotnet:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
+
+ steps:
+ - name: 🤖 defaults
+ uses: devlooped/actions-bot@v1
+ with:
+ name: ${{ secrets.BOT_NAME }}
+ email: ${{ secrets.BOT_EMAIL }}
+ gh_token: ${{ secrets.GH_TOKEN }}
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: 🤘 checkout
+ uses: actions/checkout@v4
+ with:
+ token: ${{ env.GH_TOKEN }}
+
+ - name: 🤌 dotnet
+ uses: devlooped/actions-which-dotnet@v1
+
+ - name: ✍ pull request
+ uses: peter-evans/create-pull-request@v7
+ with:
+ base: main
+ branch: which-dotnet
+ delete-branch: true
+ labels: dependencies
+ title: "⚙ Update dotnet versions"
+ body: "Update dotnet versions"
+ commit-message: "Update dotnet versions"
+ token: ${{ env.GH_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/dotnet-file.yml b/.github/workflows/dotnet-file.yml
index 083f24d..402f6ba 100644
--- a/.github/workflows/dotnet-file.yml
+++ b/.github/workflows/dotnet-file.yml
@@ -12,5 +12,10 @@ env:
jobs:
run:
+ permissions:
+ contents: write
uses: devlooped/oss/.github/workflows/dotnet-file-core.yml@main
- secrets: inherit
\ No newline at end of file
+ secrets:
+ BOT_NAME: ${{ secrets.BOT_NAME }}
+ BOT_EMAIL: ${{ secrets.BOT_EMAIL }}
+ GH_TOKEN: ${{ secrets.GH_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/includes.yml b/.github/workflows/includes.yml
index d787ccb..fc6dbeb 100644
--- a/.github/workflows/includes.yml
+++ b/.github/workflows/includes.yml
@@ -5,8 +5,9 @@ on:
branches:
- 'main'
paths:
- - '**.md'
+ - '**.md'
- '!changelog.md'
+ - 'osmfeula.txt'
jobs:
includes:
@@ -31,14 +32,33 @@ jobs:
- name: +Mᐁ includes
uses: devlooped/actions-includes@v1
+ - name: 📝 OSMF EULA
+ shell: pwsh
+ run: |
+ $file = "osmfeula.txt"
+ $props = "src/Directory.Build.props"
+ if (-not (test-path $file) -or -not (test-path $props)) {
+ exit 0
+ }
+
+ $product = dotnet msbuild $props -getproperty:Product
+ if (-not $product) {
+ write-error 'To use OSMF EULA, ensure the $(Product) property is set in Directory.props'
+ exit 1
+ }
+
+ ((get-content -raw $file) -replace '\$product\$',$product).trim() | set-content $file
+
- name: ✍ pull request
- uses: peter-evans/create-pull-request@v6
+ uses: peter-evans/create-pull-request@v8
with:
- add-paths: '**.md'
+ add-paths: |
+ **.md
+ *.txt
base: main
branch: markdown-includes
delete-branch: true
- labels: docs
+ labels: dependencies
author: ${{ env.BOT_AUTHOR }}
committer: ${{ env.BOT_AUTHOR }}
commit-message: +Mᐁ includes
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 8b065d7..035d811 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -15,7 +15,8 @@ env:
VersionLabel: ${{ github.ref }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
MSBUILDTERMINALLOGGER: auto
-
+ SLEET_FEED_URL: https://api.nuget.org/v3/index.json
+
jobs:
publish:
runs-on: ${{ vars.PUBLISH_AGENT || 'ubuntu-latest' }}
@@ -27,20 +28,14 @@ jobs:
fetch-depth: 0
- name: ⚙ dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: |
- 6.x
- 8.x
- 9.x
+ uses: devlooped/actions-dotnet-env@v1
- name: 🙏 build
run: dotnet build -m:1 -bl:build.binlog
- name: 🧪 test
- run: |
- dotnet tool update -g dotnet-retest
- dotnet retest -- --no-build
+ shell: pwsh
+ run: dnx --yes retest -- --no-build
- name: 🐛 logs
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml
index 56ff299..99eec76 100644
--- a/.github/workflows/triage.yml
+++ b/.github/workflows/triage.yml
@@ -49,7 +49,11 @@ jobs:
# if we don't have at least 100 requests left, wait until reset
if ($rate.remaining -lt 100) {
$wait = ($rate.reset - (Get-Date (Get-Date).ToUniversalTime() -UFormat %s))
- echo "Rate limit remaining is $($rate.remaining), waiting for $($wait / 1000) seconds to reset"
+ if ($wait -gt 300) {
+ echo "Rate limit remaining is $($rate.remaining), reset in $wait seconds (more than 5'). Aborting."
+ exit 1
+ }
+ echo "Rate limit remaining is $($rate.remaining), waiting $wait seconds to reset"
sleep $wait
$rate = gh api rate_limit | convertfrom-json | select -expandproperty rate
echo "Rate limit has reset to $($rate.remaining) requests"
diff --git a/.gitignore b/.gitignore
index 2ac54a7..dfe1fe0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,6 +11,8 @@ BenchmarkDotNet.Artifacts
.genaiscript
.idea
local.settings.json
+.env
+*.local
*.suo
*.sdf
diff --git a/.netconfig b/.netconfig
index 7b42375..5b25a2f 100644
--- a/.netconfig
+++ b/.netconfig
@@ -27,26 +27,26 @@
skip
[file ".editorconfig"]
url = https://github.com/devlooped/oss/blob/main/.editorconfig
- sha = e81ab754b366d52d92bd69b24bef1d5b1c610634
- etag = 7298c6450967975a8782b5c74f3071e1910fc59686e48f9c9d5cd7c68213cf59
+ sha = a62c45934ac2952f2f5d54d8aea4a7ebc1babaff
+ etag = b5e919b472a52d4b522f86494f0f2c0ba74a6d9601454e20e4cbaf744317ff62
weak
[file ".gitattributes"]
url = https://github.com/devlooped/oss/blob/main/.gitattributes
- sha = 5f92a68e302bae675b394ef343114139c075993e
- etag = 338ba6d92c8d1774363396739c2be4257bfc58026f4b0fe92cb0ae4460e1eff7
+ sha = 4a9aa321c4982b83c185cf8dffed181ff84667d5
+ etag = 09cad18280ed04b67f7f87591e5481510df04d44c3403231b8af885664d8fd58
weak
[file ".github/FUNDING.yml"]
url = https://github.com/devlooped/.github/blob/main/.github/FUNDING.yml
skip
[file ".github/dependabot.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/dependabot.yml
- sha = 49661dbf0720cde93eb5569be7523b5912351560
- etag = c147ea2f3431ca0338c315c4a45b56ee233c4d30f8d6ab698d0e1980a257fd6a
+ sha = e733294084fb3e75d517a2e961e87df8faae7dc6
+ etag = 3bf8d9214a15c049ca5cfe80d212a8cbe4753b8a638a9804ef73d34c7def9618
weak
[file ".github/workflows/build.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/workflows/build.yml
- sha = 06e898ccba692566ebf845fa7c8833ac6c318c0a
- etag = 0a4b3f0a875cd8c9434742b4046558aecf610d3fa3d490cfd2099266e95e9195
+ sha = 5da103cfbc1c4f9b5f59cfa698d2afbd744a7525
+ etag = 851af098748f7cfa5bc3cfd4cc404a6de930532b59ceb2b3b535282c41226f3a
weak
[file ".github/workflows/changelog.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.yml
@@ -55,18 +55,18 @@
weak
[file ".github/workflows/dotnet-file.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/workflows/dotnet-file.yml
- sha = 59aaf432369b5ea597831d4feec5a6ac4024c2e3
- etag = 1374e3f8c9b7af69c443605c03f7262300dcb7d783738d9eb9fe84268ed2d10c
+ sha = 8fa147d4799d73819040736c399d0b1db2c2d86c
+ etag = 1ca805a23656e99c03f9d478dba8ccef6e571f5de2ac0e9bb7e3c5216c99a694
weak
[file ".github/workflows/publish.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/workflows/publish.yml
- sha = 06e898ccba692566ebf845fa7c8833ac6c318c0a
- etag = 2f64f75ad01f735fd05290370fb8a826111ac8dd7e74ce04226bb627a54a62ba
+ sha = 7f5f9ee9f362f7e8f951d618f8f799033550e687
+ etag = c60411d1aa4e98e7f69e2d34cbccb8eb7e387ec11f6f8e78ee8d8b92122d7025
weak
[file ".gitignore"]
url = https://github.com/devlooped/oss/blob/main/.gitignore
- sha = e0be248fff1d39133345283b8227372b36574b75
- etag = c449ec6f76803e1891357ca2b8b4fcb5b2e5deeff8311622fd92ca9fbf1e6575
+ sha = a225b7a9f609f26bcc24e0d84f663387be251a7d
+ etag = 20a8b49d57024abbd85aac5b0020c30e5eb68e0384b2761e93727c8780c4a991
weak
[file "Directory.Build.rsp"]
url = https://github.com/devlooped/oss/blob/main/Directory.Build.rsp
@@ -75,8 +75,8 @@
weak
[file "_config.yml"]
url = https://github.com/devlooped/oss/blob/main/_config.yml
- sha = fa83a5161ba52bc5d510ce0ba75ee0b1f8d4bc63
- etag = 9139148f845adf503fd3c3c140eb64421fc476a1f9c027fc50825c0efb05f557
+ sha = 68b409c486842062e0de0e5b11e6fdb7cd12d6e2
+ etag = d608aa0ddaedc2d8a87260f50756e8d8314964ad4671b76bd085bcb458757010
weak
[file "assets/css/style.scss"]
url = https://github.com/devlooped/oss/blob/main/assets/css/style.scss
@@ -90,13 +90,13 @@
weak
[file "src/Directory.Build.props"]
url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.props
- sha = b76de49afb376aa48eb172963ed70663b59b31d3
- etag = c8b56f3860cc7ccb8773b7bd6189f5c7a6e3a2c27e9104c1ee201fbdc5af9873
+ sha = dd13ed3334135c30dcb1e3b2295dc7622de298d9
+ etag = bd05f9f240823c0ac79ddfefe654061550c36f82dd94fa513b82900e92686a5f
weak
[file "src/Directory.Build.targets"]
url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.targets
- sha = a8b208093599263b7f2d1fe3854634c588ea5199
- etag = 19087699f05396205e6b050d999a43b175bd242f6e8fac86f6df936310178b03
+ sha = 083a37bd9307ec820bac6ee3c7384083151d36d8
+ etag = 907682e5632a2ba430357e6e042a4ca33cb8c94a3a215d3091aa03f5958a4877
weak
[file "src/kzu.snk"]
url = https://github.com/devlooped/oss/blob/main/src/kzu.snk
@@ -106,12 +106,12 @@
[file "src/ISBN/groups.js"]
url = https://github.com/inventaire/isbn3/blob/master/lib/groups.js
sha = 469a46f5b93875349cb7fae88aea25101910c179
- etag = 8e0bf213916abd3e148bb825e0ba4b6131c24c18b3a518f7656f9e976142c7b2
+ etag = 2ef8cc17f45fb9f32250fdb34af9e571bb3b362df71c991c37b5a585571966f5
weak
[file ".github/workflows/includes.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/workflows/includes.yml
- sha = 85829f2510f335f4a411867f3dbaaa116c3ab3de
- etag = 086f6b6316cc6ea7089c0dcc6980be519e6ed6e6201e65042ef41b82634ec0ee
+ sha = 06628725a6303bb8c4cf3076a384fc982a91bc0b
+ etag = 478f91d4126230e57cc601382da1ba23f9daa054645b4af89800d8dd862e64fd
weak
[file ".github/workflows/combine-prs.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/workflows/combine-prs.yml
@@ -141,11 +141,30 @@
skip
[file ".github/workflows/triage.yml"]
url = https://github.com/devlooped/oss/blob/main/.github/workflows/triage.yml
- sha = 33000c0c4ab4eb4e0e142fa54515b811a189d55c
- etag = 013a47739e348f06891f37c45164478cca149854e6cd5c5158e6f073f852b61a
+ sha = 61a602fc61eedbdae235f01e93657a6219ac2427
+ etag = 152cd3a559c08da14d1da12a5262ba1d2e0ed6bed6d2eabf5bd209b0c35d8a75
weak
[file "src/nuget.config"]
url = https://github.com/devlooped/oss/blob/main/src/nuget.config
sha = 032439dbf180fca0539a5bd3a019f18ab3484b76
etag = da7c0104131bd474b52fc9bc9f9bda6470e24ae38d4fb9f5c4f719bc01370ab5
weak
+[file "readme.tmp.md"]
+ url = https://github.com/devlooped/oss/blob/main/readme.tmp.md
+ skip
+[file "oss.cs"]
+ url = https://github.com/devlooped/oss/blob/main/oss.cs
+ skip
+[file ".github/actions/dotnet/action.yml"]
+ url = https://github.com/devlooped/oss/blob/main/.github/actions/dotnet/action.yml
+ skip
+[file ".github/copilot-instructions.md"]
+ url = https://github.com/devlooped/oss/blob/main/.github/copilot-instructions.md
+ sha = e616d89d9537c4b8ccf1c20dd277ab82104167c4
+ etag = 6ee650d118a57494d3545d54718ccaa5257b09d54504e9c21514fe596edd9678
+ weak
+[file ".github/workflows/dotnet-env.yml"]
+ url = https://github.com/devlooped/oss/blob/main/.github/workflows/dotnet-env.yml
+ sha = 77e83f238196d2723640abef0c7b6f43994f9747
+ etag = fcb9759a96966df40dcd24906fd328ddec05953b7e747a6bb8d0d1e4c3865274
+ weak
diff --git a/_config.yml b/_config.yml
index a61f7e0..04e6093 100644
--- a/_config.yml
+++ b/_config.yml
@@ -1,3 +1,3 @@
theme: jekyll-theme-slate
-exclude: [ 'src/', '*.sln', 'Gemfile*', '*.rsp' ]
\ No newline at end of file
+exclude: [ 'src/', '*.sln', '*.slnx', 'Gemfile*', '*.rsp' ]
diff --git a/readme.md b/readme.md
index fc70df2..2f85e37 100644
--- a/readme.md
+++ b/readme.md
@@ -34,44 +34,38 @@ isbn3 repository which in turn fetches [isbn-international.org](https://www.isbn
# Sponsors
-[](https://github.com/clarius)
-[](https://github.com/MFB-Technologies-Inc)
-[](https://github.com/torutek-gh)
-[](https://github.com/drivenet)
-[](https://github.com/Keflon)
-[](https://github.com/tbolon)
-[](https://github.com/kfrancis)
-[](https://github.com/twenzel)
-[](https://github.com/unoplatform)
-[](https://github.com/dansiegel)
-[](https://github.com/rbnswartz)
-[](https://github.com/jfoshee)
-[](https://github.com/Mrxx99)
-[](https://github.com/eajhnsn1)
-[](https://github.com/IxTechnologies)
-[](https://github.com/davidjenni)
-[](https://github.com/Jonathan-Hickey)
-[](https://github.com/akunzai)
-[](https://github.com/jakobt)
-[](https://github.com/tinohager)
-[](https://github.com/KenBonny)
-[](https://github.com/SimonCropp)
-[](https://github.com/agileworks-eu)
-[](https://github.com/sorahex)
-[](https://github.com/arsdragonfly)
-[](https://github.com/vezel-dev)
-[](https://github.com/ChilliCream)
-[](https://github.com/4OTC)
-[](https://github.com/v-limo)
-[](https://github.com/jordansjones)
-[](https://github.com/DominicSchell)
-[](https://github.com/jkingry)
+[](https://github.com/clarius)
+[](https://github.com/MFB-Technologies-Inc)
+[](https://github.com/khamza85)
+[](https://github.com/sandrock)
+[](https://github.com/drivenet)
+[](https://github.com/Keflon)
+[](https://github.com/tbolon)
+[](https://github.com/kfrancis)
+[](https://github.com/rbnswartz)
+[](https://github.com/jfoshee)
+[](https://github.com/Mrxx99)
+[](https://github.com/eajhnsn1)
+[](https://github.com/Jonathan-Hickey)
+[](https://github.com/KenBonny)
+[](https://github.com/SimonCropp)
+[](https://github.com/agileworks-eu)
+[](https://github.com/arsdragonfly)
+[](https://github.com/vezel-dev)
+[](https://github.com/ChilliCream)
+[](https://github.com/4OTC)
+[](https://github.com/DominicSchell)
+[](https://github.com/adalon)
+[](https://github.com/torutek)
+[](https://github.com/mccaffers)
+[](https://github.com/SeikaLogiciel)
+[](https://github.com/wizardness)
+[](https://github.com/latonz)
+[](https://github.com/prime167)
-
-[](https://github.com/sponsors/devlooped)
-
+[](https://github.com/sponsors/devlooped)
[Learn more about GitHub Sponsors](https://github.com/sponsors)
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 381c383..91e383a 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,4 +1,4 @@
-
+
@@ -20,6 +20,7 @@
Daniel Cazzulino
+ Devlooped
Copyright (C) Daniel Cazzulino and Contributors. All rights reserved.
false
MIT
@@ -42,6 +43,10 @@
true
+
+ false
+
+ true
@@ -126,11 +131,22 @@
<_VersionLabel>$(_VersionLabel.Replace('/merge', ''))
<_VersionLabel>$(_VersionLabel.Replace('/', '-'))
+
+ <_VersionLabel>$(_VersionLabel.Replace('_', '-'))
$(_VersionLabel)
$(_VersionLabel)
+
+
+ true
+ 42.42.0
+ $(VersionSuffix).$(GITHUB_RUN_NUMBER)
@@ -150,9 +166,25 @@
+
+
+
+
+
+
+ 1.0.0
+ $(VersionPrefix)-$(VersionSuffix)
+ $(VersionPrefix)
+
+
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index 6232750..a3df56d 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -165,22 +165,35 @@
@(_GitSourceRoot)
+
+ $([System.IO.Path]::GetFileNameWithoutExtension($(PrivateRepositoryUrl)))
+ $(ProductFromUrl)
- $(RepositoryUrl)
+ $(RepositoryUrl.Replace('.git', ''))
$(Description)
- $(RepositoryUrl)/blob/main/changelog.md
+ $(RepositoryUrl.Replace('.git', ''))/blob/main/changelog.md
+
+
+
+
+ OSMFEULA.txt
+ true
+
+
+
+
diff --git a/src/ISBN/groups.js b/src/ISBN/groups.js
index 58e8eed..aa0495a 100644
--- a/src/ISBN/groups.js
+++ b/src/ISBN/groups.js
@@ -110,7 +110,11 @@ module.exports = {
],
[
'040',
- '049'
+ '047'
+ ],
+ [
+ '0480',
+ '0499'
],
[
'05',
@@ -250,6 +254,14 @@ module.exports = {
],
[
'916908',
+ '919163'
+ ],
+ [
+ '9191640',
+ '9195649'
+ ],
+ [
+ '919565',
'919599'
],
[
@@ -388,6 +400,14 @@ module.exports = {
],
[
'200',
+ '312'
+ ],
+ [
+ '3130',
+ '3139'
+ ],
+ [
+ '314',
'389'
],
[
@@ -878,10 +898,10 @@ module.exports = {
],
[
'600',
- '694'
+ '691'
],
[
- '69500',
+ '69200',
'69999'
],
[
@@ -973,7 +993,11 @@ module.exports = {
],
[
'5000',
- '5224'
+ '5299'
+ ],
+ [
+ '99000',
+ '99999'
]
]
},
@@ -1149,6 +1173,26 @@ module.exports = {
'00',
'10'
],
+ [
+ '110',
+ '129'
+ ],
+ [
+ '1300',
+ '1799'
+ ],
+ [
+ '180',
+ '181'
+ ],
+ [
+ '1830',
+ '1899'
+ ],
+ [
+ '19500',
+ '19999'
+ ],
[
'200',
'459'
@@ -1196,11 +1240,11 @@ module.exports = {
'249'
],
[
- '5000',
+ '4850',
'6899'
],
[
- '93000',
+ '91000',
'99999'
]
]
@@ -1234,10 +1278,10 @@ module.exports = {
],
[
'7795',
- '8499'
+ '8999'
],
[
- '94000',
+ '90000',
'99999'
]
]
@@ -1258,7 +1302,7 @@ module.exports = {
'7999'
],
[
- '95000',
+ '92500',
'99999'
]
]
@@ -1267,12 +1311,12 @@ module.exports = {
name: 'Pakistan',
ranges: [
[
- '30',
+ '28',
'31'
],
[
'500',
- '529'
+ '534'
],
[
'7400',
@@ -1313,7 +1357,7 @@ module.exports = {
'02'
],
[
- '460',
+ '455',
'499'
],
[
@@ -1321,7 +1365,7 @@ module.exports = {
'7999'
],
[
- '95000',
+ '92000',
'99999'
]
]
@@ -1424,7 +1468,7 @@ module.exports = {
ranges: [
[
'00',
- '01'
+ '02'
],
[
'250',
@@ -1436,14 +1480,14 @@ module.exports = {
],
[
'5000',
- '6149'
+ '6349'
],
[
'80000',
'81824'
],
[
- '83000',
+ '82000',
'89999'
],
[
@@ -1451,11 +1495,24 @@ module.exports = {
'902449'
],
[
- '980000',
+ '975500',
'999999'
]
]
},
+ '978-69990': {
+ name: 'Zambia registration group',
+ ranges: [
+ [
+ '50',
+ '50'
+ ],
+ [
+ '997',
+ '999'
+ ]
+ ]
+ },
'978-7': {
name: 'China, People\'s Republic',
ranges: [
@@ -1535,7 +1592,11 @@ module.exports = {
],
[
'200',
- '699'
+ '689'
+ ],
+ [
+ '69000',
+ '69999'
],
[
'7000',
@@ -2000,7 +2061,7 @@ module.exports = {
'649'
],
[
- '7000',
+ '6850',
'8199'
],
[
@@ -2051,7 +2112,11 @@ module.exports = {
],
[
'100',
- '479'
+ '469'
+ ],
+ [
+ '47000',
+ '47999'
],
[
'48000',
@@ -2599,7 +2664,11 @@ module.exports = {
ranges: [
[
'00',
- '19'
+ '18'
+ ],
+ [
+ '19500',
+ '19999'
],
[
'200',
@@ -3561,7 +3630,15 @@ module.exports = {
],
[
'30000',
- '69999'
+ '67999'
+ ],
+ [
+ '68',
+ '68'
+ ],
+ [
+ '690',
+ '699'
],
[
'765',
@@ -3663,11 +3740,7 @@ module.exports = {
'5999'
],
[
- '94',
- '94'
- ],
- [
- '96',
+ '92',
'99'
]
]
@@ -3743,7 +3816,31 @@ module.exports = {
ranges: [
[
'00',
- '39'
+ '21'
+ ],
+ [
+ '220',
+ '224'
+ ],
+ [
+ '2250',
+ '2599'
+ ],
+ [
+ '26',
+ '28'
+ ],
+ [
+ '29000',
+ '29999'
+ ],
+ [
+ '30',
+ '38'
+ ],
+ [
+ '3900',
+ '3999'
],
[
'400',
@@ -3920,7 +4017,7 @@ module.exports = {
ranges: [
[
'0',
- '1'
+ '0'
],
[
'20',
@@ -3932,6 +4029,14 @@ module.exports = {
],
[
'37',
+ '48'
+ ],
+ [
+ '49000',
+ '49999'
+ ],
+ [
+ '50',
'52'
],
[
@@ -3952,6 +4057,65 @@ module.exports = {
]
]
},
+ '978-9905': {
+ name: 'Nepal',
+ ranges: [
+ [
+ '0',
+ '0'
+ ],
+ [
+ '20',
+ '23'
+ ],
+ [
+ '600',
+ '624'
+ ],
+ [
+ '9900',
+ '9999'
+ ]
+ ]
+ },
+ '978-9906': {
+ name: 'Tajikistan',
+ ranges: [
+ [
+ '20',
+ '20'
+ ],
+ [
+ '700',
+ '724'
+ ],
+ [
+ '9900',
+ '9999'
+ ]
+ ]
+ },
+ '978-9907': {
+ name: 'Ecuador',
+ ranges: [
+ [
+ '0',
+ '0'
+ ],
+ [
+ '50',
+ '64'
+ ],
+ [
+ '800',
+ '874'
+ ],
+ [
+ '9500',
+ '9999'
+ ]
+ ]
+ },
'978-9908': {
name: 'Estonia',
ranges: [
@@ -3995,14 +4159,22 @@ module.exports = {
ranges: [
[
'01',
- '09'
+ '15'
],
[
- '630',
+ '225',
+ '299'
+ ],
+ [
+ '5000',
+ '5499'
+ ],
+ [
+ '550',
'799'
],
[
- '8600',
+ '8000',
'9999'
]
]
@@ -4046,14 +4218,14 @@ module.exports = {
ranges: [
[
'00',
- '07'
+ '09'
],
[
'600',
- '699'
+ '709'
],
[
- '9550',
+ '9500',
'9999'
]
]
@@ -4062,15 +4234,15 @@ module.exports = {
name: 'Kenya',
ranges: [
[
- '35',
+ '27',
'55'
],
[
'700',
- '774'
+ '799'
],
[
- '9450',
+ '9300',
'9999'
]
]
@@ -4145,7 +4317,7 @@ module.exports = {
'699'
],
[
- '9700',
+ '9625',
'9999'
]
]
@@ -4195,6 +4367,10 @@ module.exports = {
'978-9920': {
name: 'Morocco',
ranges: [
+ [
+ '200',
+ '229'
+ ],
[
'23',
'42'
@@ -4237,12 +4413,16 @@ module.exports = {
'20',
'29'
],
+ [
+ '5500',
+ '5999'
+ ],
[
'600',
'799'
],
[
- '8250',
+ '8000',
'9999'
]
]
@@ -4650,7 +4830,11 @@ module.exports = {
],
[
'400',
- '799'
+ '789'
+ ],
+ [
+ '7900',
+ '7999'
],
[
'8',
@@ -5366,14 +5550,14 @@ module.exports = {
ranges: [
[
'00',
- '12'
+ '19'
],
[
'500',
- '649'
+ '749'
],
[
- '9700',
+ '9300',
'9999'
]
]
@@ -7302,6 +7486,10 @@ module.exports = {
'700',
'799'
],
+ [
+ '900',
+ '924'
+ ],
[
'975',
'999'
@@ -7397,14 +7585,14 @@ module.exports = {
ranges: [
[
'0',
- '2'
+ '3'
],
[
'50',
- '71'
+ '76'
],
[
- '885',
+ '865',
'999'
]
]
@@ -7421,7 +7609,7 @@ module.exports = {
'69'
],
[
- '900',
+ '850',
'999'
]
]
@@ -7452,7 +7640,7 @@ module.exports = {
],
[
'200',
- '219'
+ '229'
],
[
'23',
@@ -7485,7 +7673,7 @@ module.exports = {
name: 'Luxembourg',
ranges: [
[
- '700',
+ '550',
'999'
]
]
@@ -7497,6 +7685,10 @@ module.exports = {
'0',
'0'
],
+ [
+ '10',
+ '10'
+ ],
[
'50',
'54'
@@ -7526,6 +7718,23 @@ module.exports = {
},
'978-99990': {
name: 'Ethiopia',
+ ranges: [
+ [
+ '0',
+ '1'
+ ],
+ [
+ '45',
+ '57'
+ ],
+ [
+ '930',
+ '999'
+ ]
+ ]
+ },
+ '978-99991': {
+ name: 'Burkina Faso',
ranges: [
[
'0',
@@ -7533,7 +7742,7 @@ module.exports = {
],
[
'50',
- '57'
+ '60'
],
[
'960',
@@ -7546,14 +7755,14 @@ module.exports = {
ranges: [
[
'0',
- '1'
+ '2'
],
[
'50',
- '64'
+ '69'
],
[
- '950',
+ '900',
'999'
]
]
@@ -7563,7 +7772,7 @@ module.exports = {
ranges: [
[
'0',
- '2'
+ '4'
],
[
'50',
@@ -7584,10 +7793,10 @@ module.exports = {
],
[
'50',
- '52'
+ '56'
],
[
- '985',
+ '960',
'999'
]
]
@@ -7597,7 +7806,7 @@ module.exports = {
ranges: [
[
'50',
- '52'
+ '55'
],
[
'975',
@@ -7605,6 +7814,49 @@ module.exports = {
]
]
},
+ '978-99996': {
+ name: 'Macau',
+ ranges: [
+ [
+ '0',
+ '1'
+ ],
+ [
+ '40',
+ '59'
+ ],
+ [
+ '900',
+ '999'
+ ]
+ ]
+ },
+ '978-99997': {
+ name: 'Srpska, Republic of',
+ ranges: [
+ [
+ '0',
+ '0'
+ ],
+ [
+ '40',
+ '54'
+ ],
+ [
+ '950',
+ '999'
+ ]
+ ]
+ },
+ '978-99998': {
+ name: 'Namibia',
+ ranges: [
+ [
+ '80',
+ '89'
+ ]
+ ]
+ },
'979-10': {
name: 'France',
ranges: [
@@ -7635,7 +7887,11 @@ module.exports = {
ranges: [
[
'00',
- '24'
+ '23'
+ ],
+ [
+ '24000',
+ '24999'
],
[
'250',
@@ -7704,6 +7960,10 @@ module.exports = {
'979-8': {
name: 'United States',
ranges: [
+ [
+ '1950',
+ '1999'
+ ],
[
'200',
'229'
@@ -7713,15 +7973,19 @@ module.exports = {
'239'
],
[
- '3000',
- '3199'
+ '2400',
+ '2599'
],
[
- '3200',
- '3499'
+ '2600',
+ '2799'
],
[
- '3500',
+ '2800',
+ '2999'
+ ],
+ [
+ '3000',
'8849'
],
[
@@ -7732,6 +7996,10 @@ module.exports = {
'90000',
'90999'
],
+ [
+ '950000',
+ '969999'
+ ],
[
'9850000',
'9899999'
@@ -7740,6 +8008,10 @@ module.exports = {
'9900000',
'9929999'
],
+ [
+ '9930000',
+ '9959999'
+ ],
[
'9985000',
'9999999'