Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 3809,
"has_wiki": true,
"homepage": null,
"languages": {
"Shell": 9261,
"Dockerfile": 5280,
"JavaScript": 35563,
"TypeScript": 8483420
},
"pushed_at": "2026-07-22T20:05:02Z",
"created_at": "2026-07-15T16:19:16Z",
"owner_type": "User",
"updated_at": "2026-07-22T20:05:06Z",
"description": "Monorepo for all @pawells package and projects.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": null,
"name": "Aaron Wells",
"type": "User",
"login": "PhillipAWells",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/69355326?v=4",
"created_at": "2020-08-07T14:11:45Z",
"is_verified": null,
"public_repos": 3,
"account_age_days": 2175
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [],
"recent_commits": [
{
"oid": "ca2ecf25e31c872aa22d8860e4373142588e82cd",
"body": "@pawells/mcp-memory has moved to its own dedicated repo (PhillipAWells/mcp-servers)\nto become the home for future MCP server packages. Drops the local source tree and\nits root tsconfig.json project reference, regenerates yarn.lock, and scrubs the\npackage from README.md's inventory and the package-count references in\ndocs/releasing.md and docs/publishing.md.\n\nCloses #127, #128.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(workspace): remove packages/mcp-memory (migrated to mcp-servers)",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T20:05:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "97c926569f462ae11a54fb04b920c7acfb45e513",
"body": "Patch bump from dependabot PR #134's actions group. class-validator\n0.14->0.15 (also in #134) is excluded -- it still breaks @nestjs/mapped-types'\npeer requirement via @nestjs/swagger v8, same as the earlier PR #125 split.",
"is_bot": false,
"headline": "chore(react-federation-core): bump react/react-dom to 19.2.8",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T18:49:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d7c7ca62210f82a6fcb40a4332db2b457933b23",
"body": "Applies the remaining minor/patch-level updates from dependabot PR #125's\n\"actions\" group not already covered by the earlier PR #130 split:\ngraphql-ws (graphql-codegen-ts, react-graphql) and mongoose\n(react-federation-module, react-federation-service).\n\nExcludes: jsonc-eslint-parser 2->3, graphql 16\n[…]\nspite being\na same-major-version bump breaks @nestjs/mapped-types' (via the excluded\n@nestjs/swagger v8) peer requirement of ~0.13.2 || ~0.14.0 -- confirmed\nvia a yarn install peer-dependency warning.",
"is_bot": false,
"headline": "chore(workspace): bump minor/patch dependencies from PR #125",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T18:32:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0b648261ab175da1bf8d8e40ebca8ecf022275ba",
"body": "…pdates\n\nThe eslint, vitest, nx, and actions (catch-all) groups had no update-types\nfilter, so they could silently bundle major-version bumps in with minor/\npatch ones -- as happened with PR #102/#125, which bundled graphql 16->17\n(breaking @nestjs/graphql's ^16.11.0 peer requirement) alongside safe\n[…]\ninor/patch bumps. This enforces the workspace's documented policy\n(TypeScript patch-only, all other npm deps minor+patch) at the config\nlevel instead of relying on manual review to catch it each time.",
"is_bot": false,
"headline": "chore(workspace): restrict all Dependabot npm groups to minor/patch u…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T18:20:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fa220b255d898a8038a1b4dba930700b7dfbdaa9",
"body": "Applies only the minor/patch-level updates from dependabot PR #102's\n\"actions\" group (typescript-eslint, mongoose, openai, undici, jose,\nopentelemetry, @pyroscope/nodejs, @vitejs/plugin-react, react/react-dom).\n\nExcludes the group's major-version bumps (jsonc-eslint-parser 2->3,\ngraphql 16->17, mong\n[…]\nt-dom\n6->7) since the workspace's dependency policy is minor+patch only for\nnon-TypeScript deps, and graphql 17 breaks @nestjs/graphql's ^16.11.0\npeer requirement (confirmed via yarn install warning).",
"is_bot": false,
"headline": "chore(workspace): bump minor/patch dependencies from PR #102",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T18:09:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3624fe51871f880e7c1ed373147e8549b48a76f7",
"body": "Bumps the eslint group with 1 update: [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).\n\n\nUpdates `@typescript-eslint/parser` from 8.64.0 to 8.65.0\n- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)\n- [Chang\n[…]\narser\"\n dependency-version: 8.65.0\n dependency-type: direct:development\n update-type: version-update:semver-minor\n dependency-group: eslint\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "chore(deps-dev): bump @typescript-eslint/parser in the eslint group",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-22T17:47:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c56afe9f6d33b8dad5d800b3bda361501ae6ace2",
"body": "…le/resolvers\n\nBranch coverage sat at 79.16% (needs 80%), driven by two dead-in-tests\ncode paths:\n\n- app.module.ts's GraphQLModule.forRoot() formatError callback is only\n constructed when NODE_ENV !== 'test' (Apollo's schema-build step is\n deliberately skipped in tests), so the inline callback bod\n[…]\n `?? ''` fallback\n branch.\n\nBranch coverage: 79.16% -> 84.72%. All 4 coverage metrics now pass the\n80% floor; typecheck/lint/build unaffected.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(react-federation-service): close branch-coverage gap in app.modu…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "62d13f8d6dad674618c3254634a09d6576a1533f",
"body": "…uting loaded scripts\n\nNone of the three ModuleLoader strategies (script-injection, vite,\nnative-esm) verified any checksum/signature on fetched remote-entry\ncontent before executing it, even though the registry domain model\n(react-federation-module's IFederationModule/IFederationVersion)\ncarries ch\n[…]\nnjection-loader.ts and\nvite-module-loader.ts now track a `cancelled` flag set by cleanup() and\nchecked once fetch/verify resolves.\n\nCloses #75.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(react-federation-core): verify remote-entry integrity before exec…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9b76ab4ea5c7734dda43600db0bcc96dcaac6cd1",
"body": "…oller\n\nReactFederationModule.forRoot() unconditionally registered\nFederationController, so this GraphQL-only service (see this package's\nCLAUDE.md Non-Goals) actually served a full REST CRUD surface plus a\nSwagger UI describing it, contradicting its own design. Passes the new\nrestController: false \n[…]\ntion-module) so only\nFederationResolver/FederationSubscriptionsResolver — already guarded in\n./resolvers.ts — expose the registry.\n\nCloses #72.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(react-federation-service): disable federation module's REST contr…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "35690ae2b2b838ad20998a1da050ff4f20dee8a5",
"body": "…nforce ownership checks, and make REST controller optional\n\nFederationResolver/FederationSubscriptionsResolver previously had zero\n@UseGuards, leaving the GraphQL surface fully unauthenticated for any\ndirect consumer of ReactFederationModule.forRoot(). Applied the same\nApiKeyGuard/JwtGuard/RateLimi\n[…]\nhe three defaulted params so Nest falls back to\n the JS defaults instead of throwing UnknownDependenciesException.\n\nCloses #71, #72, #89, #92.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(react-federation-module): add auth guards to GraphQL resolvers, e…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "02897e9e880e38d7d97ab74a8e164df2c85e39cd",
"body": "…tError parameter\n\nApollo Server v5's formatError signature is (formattedError, error) where the second\nparameter is the actual thrown error. The earlier fix for #82 correctly handled the REST\nside but passed the wrong parameter to MapCustomErrorToStatusAndMessage on the GraphQL\nside, making the cus\n[…]\nL responses.\nThis correction ensures the GraphQL side receives the same status-code mapping semantics\nas REST. Added 8 comprehensive tests covering all federation error types and edge cases.\n\nRefs #82",
"is_bot": false,
"headline": "fix(react-federation-service): read original error from correct forma…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25d362b8c48d8e147554f007ecc6d5c12baa32c7",
"body": "…LimitGuard\n\nImplement bounded lifetime management for the requestTimestamps Map to resolve\na self-inflicted DoS vulnerability where bucket entries accumulate\nindefinitely, eventually exhausting memory.\n\nThe fix introduces two mechanisms:\n1. Automatic deletion of bucket keys when all their timestamp\n[…]\nefense-in-depth\n against high-cardinality spoofed IP attacks\n\nAdded 5 comprehensive tests verifying stale key cleanup, unbounded growth\nprevention, LRU eviction, and access time tracking.\n\nFixes #87",
"is_bot": false,
"headline": "fix(react-federation-module): prevent unbounded memory growth in Rate…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9ce515dbfadaf542a2e179585dbae720994c4dbe",
"body": "… REST error handling\n\nConfigured GraphQL formatError handler in GraphQLModule.forRoot() to normalize custom\ndomain errors via shared MapCustomErrorToStatusAndMessage() utility function. GraphQL\nerror extensions now reflect correct HTTP status codes matching REST endpoints: 400 for\nvalidation/versio\n[…]\nerrors, 409 for dependency errors, 502 for repository errors.\n\nEliminates generic 500 error leakage in GraphQL layer and ensures consistent error\nhandling across REST and GraphQL endpoints.\n\nFixes #82",
"is_bot": false,
"headline": "fix(react-federation-service): align GraphQL error normalization with…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8699a05eb8a75c4fb4e4a011f8a7f84d34828c43",
"body": "…pings\n\nAdded comprehensive test suite covering error status code mappings:\n- FederationValidationError maps to 400 (BAD_REQUEST)\n- FederationVersionError maps to 400 (BAD_REQUEST)\n- FederationDependencyError maps to 409 (CONFLICT)\n- FederationRepositoryError maps to 502 (BAD_GATEWAY)\n\nEnsures custom domain errors are properly normalized in exception filter.\n\nRefs #82",
"is_bot": false,
"headline": "test(react-federation-module): add test coverage for custom error map…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d81ee5bfbdae3fed54500b74fc04803e93556be6",
"body": "…priate HTTP status codes\n\nExtended AllExceptionsFilter.resolve() to detect and map custom BaseError-derived exceptions\nto correct HTTP status codes instead of collapsing all errors to 500. Validation and version\nerrors now return 400 (BAD_REQUEST), dependency errors return 409 (CONFLICT), and repository\nerrors return 502 (BAD_GATEWAY). Extracted shared MapCustomErrorToStatusAndMessage() utility\nfunction to support GraphQL error handling parity.\n\nRefs #82",
"is_bot": false,
"headline": "fix(react-federation-module): normalize custom domain errors to appro…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "efb53782d529b4909cf320c7dfbad9d9b081460f",
"body": "…requests\n\nUpdated cache interceptor tests to reflect corrected behavior after removing\nauth-header checks from IsCacheableRequest().\n\nReplaced two tests that expected cache skip on auth headers with two new tests\nthat verify cache DOES properly engage when x-api-key and authorization headers\nare present. Cache sharing is safe across authenticated callers because\n@Cache-decorated routes return non-personalized registry data.\n\nFixes #81",
"is_bot": false,
"headline": "test(react-federation-module): verify cache engages on authenticated …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ad66db3c58b464958b62ef49aa4f5c210158a23",
"body": "…by removing auth-header checks\n\nCache eligibility was incorrectly checking for auth headers (x-api-key, authorization),\npreventing caching despite routes being decorated with @Cache. This was overly conservative\nsince @Cache-decorated routes return non-personalized registry data suitable for sharin\n[…]\nache header (already required)\n\nAuth headers are ignored. The cache:condition predicate remains available as an escape hatch\nfor any future routes requiring caller-specific caching behavior.\n\nRefs #81",
"is_bot": false,
"headline": "fix(react-federation-module): enable cache on authenticated requests …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e8478f8be7a8f5595005544cf5e85fda3bdfcb8f",
"body": "…onRegistry\n\nAdd comprehensive tests verifying that stale fetches cannot overwrite state\nset by faster requests. Tests confirm generation-guarded state updates for\nboth refetch and fetchStats scenarios, and verify isLoading flag management.\n\nFixes #79",
"is_bot": false,
"headline": "test(react-federation-core): add race condition tests for useFederati…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e515fc3c621078b627c8da6bf75c8e5bf69e613f",
"body": "…onRegistry\n\nGuard refetch and fetchStats methods with per-hook generation counters to\nprevent stale fetch results from overwriting newer state. Mirrors the\nestablished pattern in context/index.ts.\n\nRefs #79",
"is_bot": false,
"headline": "fix(react-federation-core): add request-ordering guard to useFederati…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1613e10926f880925bf6b24fe1876f6d9c624094",
"body": "…n in ScriptInjectionLoader\n\nSeparate the shared script-load promise from each caller's AbortSignal timing\nby implementing per-caller timers and ref counting, mirroring the pattern\nestablished in ViteModuleLoader. This isolates one caller's abort/timeout from\nunrelated concurrent callers, preventing\n[…]\naking across\ncall sites. Cleanup is ref-counted to ensure the loader only finalizes when\nthe last caller settles.\n\nAdded regression tests verifying cross-caller abort and timeout isolation.\n\nFixes #77",
"is_bot": false,
"headline": "fix(react-federation-core): prevent cross-caller promise contaminatio…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25d8a6de7707178f3ec309e2184b5db2b5f40118",
"body": "…API_KEY resolution\n\nUpdate metrics controller to resolve METRICS_API_KEY at request time via\ngetter function instead of at module initialization time. This ensures\ndotenv configuration completes before API key evaluation, fixing the issue\nwhere .env files were being read too late.\n\nAll three call sites (module definition, GraphQL resolvers, metrics endpoint)\nnow use lazy resolution patterns. Changes are backward-compatible with\nexisting string-based usage.\n\nFixes #90",
"is_bot": false,
"headline": "feat(react-federation-service): use getter function for lazy METRICS_…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "480bc2e97a3058c1c9683335420db774498f3a57",
"body": "… resolution in resolvers\n\nUpdate GraphQL resolvers to resolve API_KEY at request time via getter\nfunction instead of at module initialization time. This allows dotenv\nconfiguration to complete before API key evaluation.\n\nRefs #90",
"is_bot": false,
"headline": "feat(react-federation-service): use getter functions for lazy API_KEY…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "94b04b00eebee194349f31049d8a4d2f39284d70",
"body": "…esolution at module init\n\nUpdate CONFIGURED_API_KEY_GUARD to pass getter function instead of reading\nenv var at module initialization time. This defers API key resolution to\nrequest time, allowing NestConfigModule.forRoot's envFilePath loading to\ncomplete before the guard evaluates the key.\n\nRefs #90",
"is_bot": false,
"headline": "feat(react-federation-module): use getter function for lazy API key r…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78a21310a1e311214a5bd84f9232335d049e93f4",
"body": "Accept either string or () => string getter function for API keys, resolve\nin canActivate() at request time rather than at module import time. This\nallows NestConfigModule.forRoot's envFilePath loading to complete before\nthe guard evaluates the API key.\n\nRefs #90",
"is_bot": false,
"headline": "feat(react-federation-module): add lazy-resolution mode to ApiKeyGuard",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2aacb8a7bb5182f2ccff222c906a2a9e7d124e62",
"body": "…s-resolved IP\n\nSimplify the rate-limit guard to rely on request.ip (set by Express\ntrust-proxy configuration) instead of unsafe manual X-Forwarded-For\nheader parsing. This delegates secure IP resolution to Express and\nprevents IP spoofing attacks by validating proxy hop counts via the\nTRUST_PROXY_HOPS environment variable configured in the service bootstrap.\n\nFixes #97",
"is_bot": false,
"headline": "fix(react-federation-module): simplify rate-limit guard to use Expres…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fba8a2c56326d571372e3fe35308224fb9847f6d",
"body": "…trap\n\nConfigure Express trust-proxy setting in bootstrap using TRUST_PROXY_HOPS\nenvironment variable to enable secure X-Forwarded-For header parsing. This\ndelegates IP resolution to Express instead of unsafe manual header parsing\nin guards, and ensures the rate-limit guard receives the correctly-resolved\nclient IP address via request.ip.\n\nRefs #97",
"is_bot": false,
"headline": "fix(react-federation-service): configure Express trust-proxy in boots…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59a274a2c66a244dec79dc24679970a6e4223caa",
"body": "… variable\n\nAdded TRUST_PROXY_HOPS to the validation schema with a default value of 0\n(no proxy trust) to ensure secure handling of X-Forwarded-For headers. This\nenvironment variable controls how many proxy hops Express will trust when\ndetermining the client IP address, preventing IP spoofing attacks in\ndeployments without proper trust-proxy setup.\n\nRefs #97",
"is_bot": false,
"headline": "fix(react-federation-service): add TRUST_PROXY_HOPS validation schema…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63003c7722d98db432f748b762542287ea5d28e3",
"body": "…gnored by @nx/dependency-checks\n\nThe Dependencies section now explicitly documents which dependencies are\nexcluded from the @nx/dependency-checks linter and why — they are imported\nonly transitively or as side-effects. This prevents future confusion and\ndocumentation drift between CLAUDE.md and the actual eslint.config.mjs\nrationale.\n\nFixes #94",
"is_bot": false,
"headline": "docs(react-federation-module): clarify why certain dependencies are i…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e6cdd9793237075291250bc0ac0cb233722777e",
"body": "…CLAUDE.md\n\nThe documented gap—that tsconfig.lib.json lacked a project reference for\nreact-federation-module due to missing imports—was incorrect. Verification\nconfirmed both the tsconfig reference and multiple real imports\n(app.module.ts, resolvers.ts) already exist in the current codebase.\nDocumentation is now accurate.\n\nFixes #95",
"is_bot": false,
"headline": "docs(react-federation-service): remove stale Known Gaps section from …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f25b3ff19c4899def32b70dd818a6d5f1d06c71b",
"body": "The ParsePaginationOptions function now strictly validates skip and limit\nquery parameters, rejecting non-numeric, negative, or non-integer values\nwith BadRequestException. This prevents NaN values from silently reaching\nthe repository layer.\n\nRefs #98",
"is_bot": false,
"headline": "fix(react-federation-module): validate pagination query parameters",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8fed25131ab25225b3ff5838b5c4d0b1aa86327a",
"body": "…tegration test\n\nRoot cause: The concurrent requests test was experiencing ECONNRESET errors because\nthe HTTP server lacked proper initialization and connection pooling. Creating separate\nsupertest instances for each concurrent request forced the Express/NestJS server to\nspawn multiple independent c\n[…]\n an immediate tick in beforeAll to\nensure the server event loop is initialized before concurrent requests begin.\n\nThe test is now unskipped and verified to handle 5 concurrent requests without errors.",
"is_bot": false,
"headline": "test(react-federation-service): fix concurrent request handling in in…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0e698b0eded66f2eed55be63934e0ee41a8401d0",
"body": "…idation\n\nAdd regex safety check in applyFieldFilter to validate patterns before\ncompilation. Detects and rejects dangerous nested quantifier patterns that\ncause catastrophic backtracking. Check runs as part of the in-memory filter\nevaluation to protect subscription resolvers.\n\nAdds 10 new tests cov\n[…]\nn rejection in the subscription filter\npath. Both query-builder and subscription-filter code paths now consistently\nvalidate regex patterns against known catastrophic backtracking patterns.\n\nFixes #88",
"is_bot": false,
"headline": "fix(graphql-mongoose): prevent ReDoS in subscription filter regex val…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a0e7373489bdf90a3d3d2628f5b5001e6dbc8e29",
"body": "Add regex safety check in buildScalarFieldFilter to validate patterns before\ncompilation. Detects and rejects dangerous nested quantifier patterns that\ncause catastrophic backtracking. Check runs after length validation to\nefficiently reject known dangerous patterns.\n\nAdds 10 new tests covering ReDoS pattern rejection in the query-builder path.\n\nRefs #88",
"is_bot": false,
"headline": "fix(graphql-mongoose): prevent ReDoS in query-builder regex validation",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e6a6bb35fd355c4be39568700ee7e99dfb427d9",
"body": "…S detection\n\nCreate isRegexPatternSafe utility that detects known catastrophic backtracking\npatterns in regex strings. Uses a heuristic approach to identify dangerous nested\nquantifiers like (a+)+, (a*)*, and similar patterns that can cause exponential\ntime complexity during matching.\n\nIncludes 24 comprehensive tests covering safe patterns, dangerous nested\nquantifiers, alternation groups, escaping, and edge cases.\n\nRefs #88",
"is_bot": false,
"headline": "feat(graphql-mongoose): add regex pattern validation utility for ReDo…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b76aaad50075cc4374d07c45cae570ab6a1e3b6",
"body": "…lementation\n\nRemoves outdated 'Status: scaffold only' banner — the service is now fully wired\nwith production infrastructure (app.module.ts, main.ts, resolvers.ts, health checks,\nmetrics endpoints, audit interceptor, OpenTelemetry tracing, integration tests).\n\nRewrites 'Planned Architecture' sectio\n[…]\nroject reference\nsync is needed; shebang line is now prepended by build.\n\nResolves issue #85. Lands before issue #95's narrower Known-Gaps documentation fix\nto avoid concurrent edits to the same file.",
"is_bot": false,
"headline": "docs(react-federation-service): rewrite CLAUDE.md to reflect full imp…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "602c5ad1bf41d9fcbe9b4b77b131223983098604",
"body": "…kspace 80% floor\n\nUpdate the vitest configuration to set the branch coverage threshold to 80%,\nmatching the workspace-mandated floor for all four coverage metrics (lines,\nstatements, branches, functions). The existing test suite already achieves\n80% branch coverage through comprehensive integration tests that exercise\nboth test and production NODE_ENV conditions.\n\nFixes #96",
"is_bot": false,
"headline": "fix(react-federation-service): align branch coverage threshold to wor…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4fc266420975b962c36dec3391b3b90adf96f9bc",
"body": "…sts for subscription filters\n\nAdded 3 new test cases to ensure subscription filter $regex handler properly\nvalidates and rejects malicious patterns. Tests cover: MAX_REGEX_PATTERN_LENGTH\nvalidation (1000 char limit), invalid regex syntax error handling, and ReDoS\ndetection through catastrophic backtracking patterns. Ensures both code paths\n(query-builder and subscription filter) enforce identical security constraints.\n\nFixes #88",
"is_bot": false,
"headline": "test(graphql-mongoose): add comprehensive regex pattern validation te…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47b82a5a215142ac569847f74b0fa90b030e8ad7",
"body": "…lter $regex handler\n\nImplemented identical security guards as the query-builder path to prevent\nReDoS attacks and event loop blocking in subscription filter's $regex string\nhandler. Added MAX_REGEX_PATTERN_LENGTH validation (1000 chars) and try/catch\nerror handling with MongooseFilterError throwing appropriate error codes\n(REGEX_PATTERN_TOO_LONG, INVALID_REGEX_PATTERN).\n\nRefs #88",
"is_bot": false,
"headline": "fix(graphql-mongoose): prevent ReDoS vulnerability in subscription fi…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a89948478f83347da0c1935121ad8fe7ea10f64",
"body": "… cache eviction\n\nUpdate cache interceptor tests to verify invalidatePattern is called instead\nof delete, ensuring glob-pattern eviction works correctly. Add new test that\nvalidates glob patterns like 'registry:*' and 'modules:*' are properly evicted.\n\nFixes #80",
"is_bot": false,
"headline": "test(react-federation-module): verify invalidatePattern is called for…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b43e07befd868fd60fff2ecacf1b8fe2fcebfd7",
"body": "…iction\n\nReplace cacheService.delete() with cacheService.invalidatePattern() in\nCacheInterceptor.evict() to properly support glob-pattern cache eviction.\nThe delete() method only matches exact keys, while invalidatePattern()\ncorrectly invalidates all matching cache keys in both memory and Redis layers.\n\nRefs #80",
"is_bot": false,
"headline": "fix(react-federation-module): use invalidatePattern for glob cache ev…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "438227902349dbcfc7c3daf71d1e4b8b3d159459",
"body": "Update CLAUDE.md to accurately reflect the package's complete implementation:\n- Changed status banner from \"scaffold only\" to \"fully implemented\"\n- Updated to show all 8 work streams complete (#14–#21 under epic #13)\n- Added comprehensive inventory of implemented components: 8 services,\n 4 guards, \n[…]\nesolved defects\n and dead-code paths not reintroduced)\n\nThis prevents agents from being misled about implementation status and\nenables confident review of the real, working implementation.\n\nFixes #84",
"is_bot": false,
"headline": "docs(react-federation-module): document fully implemented package status",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5e33ba3e3356571972643c69ec20b6c64ebe2e29",
"body": "Update guard order verification test to match corrected guard execution\norder (ApiKey -> Jwt -> RateLimit). This ensures the test validates that\nJWT authentication runs before rate-limiting so that request.user is\navailable for per-user rate-limit bucket calculation.\n\nFixes #73",
"is_bot": false,
"headline": "test(react-federation-module): update guard order verification test",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f09abbba18c3f600b21578b000047ff3a06f27c",
"body": "…e RateLimitGuard\n\nReorder guards in AuthenticatedRoute decorator to ensure JWT authentication\npopulates request.user before rate-limit bucket key is computed. This fixes\na critical security vulnerability where per-user rate limiting could be bypassed\nvia IP rotation because the RateLimitGuard was running before JwtGuard.\n\nRefs #73",
"is_bot": false,
"headline": "fix(react-federation-module): reorder UseGuards to run JwtGuard befor…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce154f39a9b8dd573311d94f7172f7702b553552",
"body": "…iguration\n\nThe coverage.enabled flag was set to false, which disabled coverage collection\ndespite the 80% thresholds being declared in the configuration. This prevented\nthe CI pipeline from enforcing coverage metrics and allowed PRs to bypass\ncoverage checks. Enabling coverage collection ensures that yarn test:coverage\nproperly collects and validates branch, function, line, and statement coverage\nagainst the declared 80% floor.\n\nFixes #86",
"is_bot": false,
"headline": "fix(react-federation-core): enable coverage collection in vitest conf…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0ed30682de1e6cfc8bb9aff4d4c6ea594778223d",
"body": "…architecture\n\nReplace scaffolding framing and issue-number references with accurate current-status\ndescriptions of the seven fully-implemented barrels. Each module section now points to\nactual source files and describes the real exported types and functions rather than\nwork-stream references.\n\n- Fe\n[…]\nation\n- Hooks: three public hooks (context, federated module, registry)\n- Components: error boundary and remote component wrapper\n- Errors: hierarchy with machine-readable codes and Error.cause chains",
"is_bot": false,
"headline": "docs(react-federation-core): update CLAUDE.md to reflect implemented …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ed11b7c5ccc029c4827e8b6ad19b23369c3fcb44",
"body": "… abort shared load\n\nAdd comprehensive test case for #76 that verifies unmounting one component\nusing a federated module doesn't abort a sibling component's in-flight load.\n\nThe test renders two concurrent components using the same remote module,\nsimulates a slow load, unmounts one component before completion, and verifies\nthe other component's load succeeds. This validates the reference counting\nfix that prevents a single component's cleanup from aborting the shared\nAbortController.\n\nFixes #76",
"is_bot": false,
"headline": "test(react-federation-core): verify sibling component unmount doesn't…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "444e178deeffaa3d1310b534483b440bfa8c572e",
"body": "…AbortControllers\n\nWhen multiple component instances render the same federated module concurrently,\nthey share a single AbortController. Introduced ControllerInfo interface with\nreference counting and instance tracking via Symbols to ensure only the last\ncomponent instance to unmount will abort the \n[…]\nonent's unmount from\ncancelling a sibling's in-flight load.\n\nThe claimedBy Set prevents double-counting in React Strict Mode where effect\ncleanup may run multiple times on the same instance.\n\nRefs #76",
"is_bot": false,
"headline": "feat(react-federation-core): implement reference counting for shared …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6b4f6108d1c27965bc193fe9bbf18bfb2c6ad2cb",
"body": "…ort/timeout contamination\n\nAdd two regression tests verifying that concurrent callers for the same URL are\nproperly isolated from each other's abort signals and timeouts:\n\n1. \"does not reject concurrent callers when one caller aborts mid-flight\" —\n verifies that when caller A aborts their signal \n[…]\ncross-caller abort contamination bug where\nthe shared in-flight promise was being included in caller-specific AbortSignals,\ncausing one caller's abort to contaminate all concurrent callers.\n\nFixes #78",
"is_bot": false,
"headline": "test(react-federation-core): add regression tests for cross-caller ab…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fb34b964e89269b353051d5d9bcb9e753998024e",
"body": "… loading promise\n\nThe ViteModuleLoader was including each caller's AbortSignal in the shared\nin-flight loading promise. When one caller aborted, it would reject the shared\npromise, contaminating all other concurrent callers for the same URL.\n\nThis fix decouples caller signals from the shared promis\n[…]\n error, or loader-owned max wait). Each concurrent caller races\nthis against their own createAbortableTimer(signal), ensuring one caller's abort\nor timeout only affects that specific caller.\n\nRefs #78",
"is_bot": false,
"headline": "fix(react-federation-core): decouple caller abort signals from shared…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c9f04899f98b9e5cc81200c46ef7d885c02ae416",
"body": "…narios\n\nAdd comprehensive test coverage for script element cleanup on all failure\npaths: timeout, abort, and error. Added regression test ensuring failed\nURLs are not cached, which is critical for proper retry behavior and\npreventing unbounded DOM accumulation when retries occur.\n\nFixes #91",
"is_bot": false,
"headline": "test(react-federation-core): add script removal tests for failure sce…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "075a3b466e3488fdab682bb10d26fe784d5485af",
"body": "Previously, when script injection failed due to timeout, abort, or error, the\nscript DOM element remained attached to the document, causing unbounded DOM\naccumulation on retry attempts. This fix moves script element creation outside\nthe Promise executor and adds a catch handler that explicitly removes the\nelement on any rejection, ensuring cleanup on all failure paths.\n\nRefs #91",
"is_bot": false,
"headline": "fix(react-federation-core): remove script elements on injection failure",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "553c09cfc7b09e0026755d59aff56f25ff0ca756",
"body": "…n registry search/cache\n\nMongooseRegistryRepository.search interpolated the caller-supplied query\nstring directly into a Mongo $regex and spread the caller-supplied\nfilters object straight into the query, letting a caller inject\narbitrary regex syntax or Mongo operators (e.g. $where, $ne, dotted or\n[…]\ntial time) against a non-matching key as the run\nof '*' grows. Both now collapse consecutive '*' to a single wildcard\nbefore escaping, which is a no-op for match semantics but keeps match\ntime linear.",
"is_bot": false,
"headline": "fix(react-federation-module): close NoSQL injection and ReDoS holes i…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "efc06263ef9b886ac23032fd92ff8d5ce14e82de",
"body": "…l leak in module loading\n\nFederationProvider.resolveModule could let a pre-invalidation in-flight\nrequest resolve after invalidateModule/clearModuleCache and clobber a\nfresher cache entry; a per-moduleId request epoch now discards results\nfrom a request that was invalidated while in flight.\n\nViteMo\n[…]\nval on\nthe timeout and abort paths, since pollHandle was only ever cleared from\ninside the readyPromise executor. It is now always cleared once the\ntimeout/readyPromise race settles, on every outcome.",
"is_bot": false,
"headline": "fix(react-federation-core): prevent stale in-flight fetch and interva…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "71a47b0bb3564fbd5ff0fdb20b54ab8ed6544f45",
"body": "…tion\n\nAdd three new packages to root tsconfig.json path mappings and resolve workspace\ndependencies in yarn.lock. The react-federation-* packages are now discoverable and\nresolvable by NX and the TypeScript compiler.",
"is_bot": false,
"headline": "chore(workspace): wire up react-federation packages in root configura…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f7bedbaa6e2859188485874c9ce8a4f2636d677f",
"body": "…Federation\n\nDeployable NestJS 11 application serving as the primary HTTP/GraphQL entry point\nfor the React Module Federation toolkit. Includes production-grade infrastructure:\nenv-var validation, JWT/Keycloak authentication, rate limiting, request auditing,\nOpenTelemetry tracing, Prometheus metrics, and MongoDB/Redis connectivity. Delegates\nregistry operations to @pawells/react-federation-module via GraphQL.\n\nResolves GitHub issues #22-#28 (milestone: react-federation-service).",
"is_bot": false,
"headline": "feat(react-federation-service): Standalone NestJS runtime for Module …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab6eb56f84b94a5e974ce74d4e87d1652372a9a2",
"body": "…gistry\n\nImplements a Global NestJS module providing MongoDB-backed module and version CRUD,\ntwo-layer caching, REST and GraphQL surfaces with real-time subscriptions, and\nreusable security/observability building blocks. Includes a consolidated semver-\nresolution subsystem shared between REST and GraphQL APIs.\n\nResolves GitHub issues #13-#21 (milestone: react-federation-module).",
"is_bot": false,
"headline": "feat(react-federation-module): NestJS module for Module Federation re…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cde3052a86f51bc90930cc56c32bd7347605667b",
"body": "…on registry\n\nImplements a typed, minimal-dependency HTTP client with pluggable module-loading\nstrategies (Webpack 5 MF, Vite, native ESM). Provides a React context provider,\nhooks, and Suspense-compatible components for dynamically discovering and loading\nremote modules with a machine-readable error hierarchy.\n\nResolves GitHub issues #7-#12 (milestone: react-federation-core).",
"is_bot": false,
"headline": "feat(react-federation-core): React client library for Module Federati…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-22T17:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1aff88f26e9de9477e3bd023706f61d4b770ed08",
"body": "The _parsedCache (memoized parsed config values) was not being cleared\nwhen RegisterProvider, RegisterSyncProvider, or Register updated the\nunderlying provider or default values. This caused stale cached values\nto be returned indefinitely, even after correct providers were later\nregistered.\n\nThe fix\n[…]\nation:\n- RegisterProvider and RegisterSyncProvider now clear the entire cache\n- Register now deletes the specific key from the cache\n- Both changes are made alongside existing _dataCache invalidations",
"is_bot": false,
"headline": "fix(config): invalidate parsed-value cache on provider registration",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-21T01:01:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "37cb3a7fb9a13568c3954977c3a466502a56a61c",
"body": "GitHub repo settings changed: allow_squash_merge=false,\nallow_rebase_merge=true. Squash-merge collapsed a PR's individual\ncommits into one commit carrying only the PR's title, which nx\nrelease's changelog generator reads directly from main's git log —\nevery package a squashed PR touched got the same\n[…]\nh\ncommit individually onto main, preserving both linear history and\nper-commit type/scope/message.\n\nUpdated CLAUDE.md, CONTRIBUTING.md, and docs/branching-strategy.md\nto describe the new merge method.",
"is_bot": false,
"headline": "docs(workspace): document switch from squash-merge to rebase-merge",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-21T00:57:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c0e0d2553e296290a80b9a8c3c2e4747a4c21cf8",
"body": "- project: @pawells/graphql-codegen-react 3.1.1\n\n- project: @pawells/logger-transport-file 4.2.1\n\n- project: @pawells/config-provider-json 3.1.1\n\n- project: @pawells/colors-luts-munsell 0.1.2\n\n- project: @pawells/config-provider-env 3.1.1\n\n- project: @pawells/graphql-codegen-ts 3.1.1\n\n- project: @pa\n[…]\n @pawells/react-auth 3.1.1\n\n- project: @pawells/pyroscope 1.1.1\n\n- project: @pawells/metrics 1.1.1\n\n- project: @pawells/colors 2.1.1\n\n- project: @pawells/config 3.1.1\n\n- project: @pawells/logger 4.2.1",
"is_bot": false,
"headline": "chore(release): publish@",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T20:35:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "82ac0b5ec10fdb9dd2d7caa4a0d98865b9076e54",
"body": "… race (#32)\n\nci.yml's own push: branches: [main] trigger and its workflow_call\ninvocation from publish.yml computed the identical concurrency group\n(CI-refs/heads/main) with cancel-in-progress: true, so they raced.\nConfirmed in practice this session: PR #30's merge push had its\nPublish workflow's c\n[…]\nthe only path for main, already safely serialized by publish.yml's\nown concurrency group (publish-main, cancel-in-progress: false).\n\nUpdated docs/publishing.md and docs/branching-strategy.md to match.",
"is_bot": false,
"headline": "fix(workspace): remove ci.yml's push trigger to eliminate concurrency…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T20:10:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0995d6f36b21fba38b12e96b6c0d0ece833fd9fe",
"body": "v4 targets the Node 20 runtime, which GitHub Actions is deprecating\nand was silently force-running on Node 24 (visible as a build\nannotation on PR #30's CI run). v5.0.0 is exactly that fix\n(upstream: 'update action runtime to node24') and is a straight\nmajor-tag bump with no input/output changes.",
"is_bot": false,
"headline": "ci(workspace): bump nrwl/nx-set-shas to v5 (#31)",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T19:36:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4df51fc3d919df0fb60745a4533bb247bce82bdb",
"body": "…(#30)\n\nPRs now validate only projects affected by the diff against main\n(base/head resolved via nrwl/nx-set-shas), cutting CI time for the\ncommon case of a change touching a handful of this workspace's 34\npackages. Direct pushes to main and the workflow_call from\npublish.yml still run the full nx run-many --all suite as an\nunconditional safety net before any release publish. Job name is\nunchanged so branch protection's required status check still applies\nto both paths.",
"is_bot": false,
"headline": "ci(workspace): use nx affected for PR validation, full run elsewhere …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T19:32:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d3a5a962a55a2c475741d45e7d8944858bc784a",
"body": "* docs(workspace): fix broken releasing-strategy doc link in README\n\nRoot README linked to docs/version-and-release-strategy.md, which\ndoes not exist. Repointed to docs/releasing.md, which documents the\nConventional-Commits-driven independent versioning process.\n\n* docs(config-provider-json): correc\n[…]\nample comments\n\nENABLED, SERVER_ADDRESS, and APPLICATION_NAME all have Zod .default()\nvalues guaranteeing a resolved value, so their code-example comments\nincorrectly typed them as possibly undefined.",
"is_bot": false,
"headline": "docs: fix README accuracy issues found in workspace audit (#29)",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T19:19:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5014006c4999ff302ace15d4050b94e5ee15b545",
"body": "Allows manually re-triggering the idempotent publish workflow (e.g.\nafter resolving a partial-failure blocker) without needing a new push\nto main.",
"is_bot": false,
"headline": "feat(workspace): add workflow_dispatch trigger to publish workflow",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T18:13:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ede801c53e1e5197a3a826eb722211de67228d8",
"body": "- Add set +e at start to avoid failing on transient npm view errors\n- Only use first match when finding package.json (handle duplicates)\n- Add safety checks for version extraction\n- Add 0.5s delay between npm view calls to avoid rate limiting\n- Re-enable set -e only for the actual publish command\n- Improve logging output clarity\n\nVerified locally: correctly identifies 30 already-published and 4 new versions.",
"is_bot": false,
"headline": "fix(workspace): improve publish workflow robustness and error handling",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T17:44:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e70aeac1de5bc8dc0d1633507271136a4c87441c",
"body": "…published versions\n\nBefore attempting to publish a package, check if its current version already exists on\nthe npm registry and skip it gracefully. This prevents masking genuine publish failures\nwith \"already published\" errors when the workflow is re-run with the same tags.\n\nVerified locally against all 34 packages: correctly identifies 30 already-published\nversions and 4 needing publication (colors-apca, colors-luts-munsell, colors-material,\nmcp-memory).",
"is_bot": false,
"headline": "fix(workspace): make publish workflow idempotent by skipping already-…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T17:33:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44d3522657e2350db0f63550507a334329252725",
"body": "…tead of nx release publish\n\nnx release publish hard-rejects yarn when a package still has a\nworkspace: protocol dependency at publish time, and the only way to\nsatisfy it is having nx release version permanently rewrite workspace:^\nto pinned semver in the committed package.json — defeating the poin\n[…]\n) and switched publish.yml to\ninvoke them via `nx run-many --target=publish`, which correctly pulls\nin transitive dependency builds through the task graph. workspace:^\nnow persists in git as intended.",
"is_bot": false,
"headline": "feat(workspace): publish via per-project yarn npm publish targets ins…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T17:09:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "43978e2e59e124e3eba5f95058a45781ab37bb41",
"body": "…parent directory rejection in Save()\n\nBranch coverage was at 79.79%, just under the 80% threshold, blocking\nCI. Added a test verifying Save() correctly rejects writes when the\nparent directory path contains a symlink, mirroring the existing\nprotection already tested for Load().",
"is_bot": false,
"headline": "fix(config-provider-json): add missing branch coverage for symlinked …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T16:01:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d350e027813745b45b36ab8ad9f37fd5137dc757",
"body": "mcp-memory's broken @pawells/logger dependency range (fixed in the prior\ncommit) was silently resolving to a stale cached copy of an older\nlogger API. With the dependency now correctly pointing at the real\nlocal package, mcp-memory's own code no longer built: it referenced\nLogLevel/StderrTransport and an object-config Logger constructor that\nno longer exist in the current API (LogLevels/StreamTransport, with\nexplicit transport registration). Updated to the current, documented\nusage pattern.",
"is_bot": false,
"headline": "fix(mcp-memory): update logger usage to match @pawells/logger v4.2.0 API",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T15:39:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "39ca9cd98202bcb2df6dfc3ebba56f367a8b9024",
"body": "…ndencies\n\n66 internal dependency/peerDependency entries across 30 packages used\nhardcoded semver ranges instead of the workspace:^ protocol for sibling\n@pawells/* packages. Three were stale and actively broken (mcp-memory,\nopen-telemetry, and prometheus all pinned @pawells/logger to old 1.x/3.x\nran\n[…]\ntisfied but the same latent failure mode waiting to happen on any\nfuture bump. Normalized all of them to workspace:^ to match this\nrepo's established convention and fix the underlying release blocker.",
"is_bot": false,
"headline": "fix(workspace): use workspace:^ protocol for internal @pawells/* depe…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T15:39:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "54917921a9582e0e42fb12720089fc68f4cee3c2",
"body": "- project: @pawells/graphql-codegen-react 3.1.0\n\n- project: @pawells/logger-transport-file 4.2.0\n\n- project: @pawells/config-provider-json 3.1.0\n\n- project: @pawells/colors-luts-munsell 0.1.1\n\n- project: @pawells/config-provider-env 3.1.0\n\n- project: @pawells/graphql-codegen-ts 3.1.0\n\n- project: @pa\n[…]\n @pawells/react-auth 3.1.0\n\n- project: @pawells/pyroscope 1.1.0\n\n- project: @pawells/metrics 1.1.0\n\n- project: @pawells/colors 2.1.0\n\n- project: @pawells/config 3.1.0\n\n- project: @pawells/logger 4.2.0",
"is_bot": false,
"headline": "chore(release): publish@",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T15:03:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3e93bc84a03d679d9b313becb258ecccc642e664",
"body": null,
"is_bot": false,
"headline": "fix(nx.json): update changelog configuration to disable author rendering",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T15:02:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7bf6eff4149311b6d7b45accc2587c74d32f1cb1",
"body": "Every packages/*/project.json had a custom \"publish\" target running a\nbare npm/yarn publish command with no gating. nx release publish never\ninvoked these (it uses its own implicit nx-release-publish target), so\nthey were dead code — and they directly contradicted the policy just\nadded to CLAUDE.md forbidding manual npm publish against the real\nregistry. Removed from all 34 packages; publishing is handled\nexclusively by the workflow documented in docs/publishing.md.",
"is_bot": false,
"headline": "chore(workspace): remove dead publish targets from all packages",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T14:23:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "454ae44024263e64de72de477abea4263df6e92b",
"body": "…d, enforce in CLAUDE.md\n\ndocuments the branch model (main is the sole protected branch, PR + squash-merge workflow) in docs/branching-strategy.md; removes development/* branch support entirely (ci.yml's push trigger simplified to branches:[main] only, per an explicit decision not to use that struct\n[…]\nure (was missing 4 of 6, had stale release-process content); adds an enforcement section to root CLAUDE.md directing any future agent to the branching/releasing/publishing docs instead of improvising.",
"is_bot": false,
"headline": "docs(workspace): establish branching strategy, rewrite CONTRIBUTING.m…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T14:14:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d5306083234170d4bb9216371e9e1852d42b3ad0",
"body": "…triggered publish workflow\n\nversion bumps now happen via a local `nx release` step (documented in docs/releasing.md) instead of an automated push-to-main CI step, because branch protection on main blocks the GITHUB_TOKEN from pushing a release commit directly; publishing is handled by a new push-to\n[…]\n) that detects release tags at HEAD and batch-publishes them, replacing the old single combined release.yml (which also replaces the now-superseded docs/version-and-release-strategy.md migration doc).",
"is_bot": false,
"headline": "feat(workspace): replace release.yml with two-stage nx release + tag-…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T14:13:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4e89c56559dec5b6dc91205d11715c25e45dfa16",
"body": "…lease inclusion\n\nrenamed the unscoped nx project name to the scoped npm name so its release tag follows the `@pawells/*@*` format; removed the stray `projectType: \"application\"` field (every other package omits it) since nx release's default project selection only includes graph nodes of type `lib` — this package was previously silently excluded from `nx release` entirely.",
"is_bot": false,
"headline": "fix(mcp-memory): scope project name to @pawells/mcp-memory, enable re…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-17T14:13:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7cd00f914e86488b1ca6b042bdf02b059d8ae2dd",
"body": "… update CLAUDE.md test runtime documentation, expand package.json description and keywords",
"is_bot": false,
"headline": "docs(workspace): enhance README with comprehensive monorepo overview,…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:51:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a774c93506a303bf6c2c6fbefb886aed39cfb27",
"body": "…o utility modules and iterators",
"is_bot": false,
"headline": "docs(typescript-common): enhance README and package.json, add JSDoc t…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cab082437d3d339b0eae2dbd3ee387f17947ee1",
"body": "…mprehensive JSDoc with @example blocks to mock utilities",
"is_bot": false,
"headline": "docs(rxjs-events): enhance CLAUDE.md, README and package.json, add co…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c069589bc6264faabc2149ab62628b42ff612a4",
"body": "…shared components and utilities",
"is_bot": false,
"headline": "docs(react-shared): enhance CLAUDE.md and package.json, add JSDoc to …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf5829b831a78574b608f88cf30f937eff56996e",
"body": "…ient and provider exports",
"is_bot": false,
"headline": "docs(react-graphql): enhance README and package.json, add JSDoc to cl…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3950b82cc46b326e3c32b82f5e9d0fefd54f6dd9",
"body": "…oc to useAuthAxios hook",
"is_bot": false,
"headline": "docs(react-auth): enhance CLAUDE.md, README and package.json, add JSD…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "75b6d7844000710fc996a843c9c85e58d3b231db",
"body": "…ager module",
"is_bot": false,
"headline": "docs(pyroscope): enhance CLAUDE.md and package.json, add JSDoc to man…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "690080e3d3423213c6a4ccefafc93d65ecb85624",
"body": "…nfig and manager modules",
"is_bot": false,
"headline": "docs(prometheus): enhance CLAUDE.md and package.json, add JSDoc to co…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8add5fdca1ab4548b77739b982a1130e8cbcd48e",
"body": "….json",
"is_bot": false,
"headline": "docs(open-telemetry): add CHANGELOG.md, enhance CLAUDE.md and package…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a0b27705e1791442f6dbc11a17ae99093605817",
"body": "…oc to executor builders",
"is_bot": false,
"headline": "docs(nx-graphql): enhance CLAUDE.md, README and package.json, add JSD…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f0fc0cac19b5bf843676b3d07902f3b37b0b02c1",
"body": "…package.json, add JSDoc to server.ts",
"is_bot": false,
"headline": "docs(nestjs-server): add CHANGELOG.md, enhance CLAUDE.md, README and …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eec61ac3964c74036a592ca8e6d4a7ed33db3210",
"body": "…package.json, add JSDoc to decorators, model, and module",
"is_bot": false,
"headline": "docs(nestjs-qdrant): add CHANGELOG.md, enhance CLAUDE.md, README and …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "298ed5e1706fbb04bbe19048f6da972f3de64363",
"body": null,
"is_bot": false,
"headline": "docs(nestjs-nats): enhance CLAUDE.md, README and package.json",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5ea9be0787d0a5b2f8a2c2ca232dc12141d0121",
"body": "…e.json",
"is_bot": false,
"headline": "docs(nestjs-mongoose): add CHANGELOG.md, enhance CLAUDE.md and packag…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ffa51e2df929f22f0d334a80708777c6fe342f47",
"body": "…o metrics guards, module utilities, and controllers",
"is_bot": false,
"headline": "docs(nestjs-metrics): enhance CLAUDE.md and package.json, add JSDoc t…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e9f4fa586c81143afaf36319289847f0567e586",
"body": null,
"is_bot": false,
"headline": "docs(nestjs-logger): enhance README and package.json",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6eb81a98574e24197dcdf43a1527b9ee323e9572",
"body": "… package.json, add JSDoc to config.ts",
"is_bot": false,
"headline": "docs(nestjs-graphql): add CHANGELOG.md, enhance CLAUDE.md, README and…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d79716f9239b389ca8ad7cd298074bcaa19c6d6",
"body": "…Doc to testing utilities and mocks",
"is_bot": false,
"headline": "docs(nestjs-auth): enhance CLAUDE.md, README and package.json, add JS…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ced2bbe1739e40dec71c417b02aadc019e72c90c",
"body": null,
"is_bot": false,
"headline": "docs(metrics): enhance CLAUDE.md, README and package.json",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89041556da4fcff07e44b0f074fd3b4e30afeae0",
"body": "…kage.json, add JSDoc to memory services and tools",
"is_bot": false,
"headline": "docs(mcp-memory): add CHANGELOG.md, enhance CLAUDE.md, README and pac…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df73150d4f54fc1a7fb4c1d994605825f1239532",
"body": null,
"is_bot": false,
"headline": "docs(math-extended): enhance README and package.json",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6dd0b660df0c392a1b7b59fad8dc08cc9f41fe54",
"body": "…on, add JSDoc to file rotation utility",
"is_bot": false,
"headline": "docs(logger-transport-file): enhance CLAUDE.md, README and package.js…",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7088227d19a01622f3e65895735b0ed62b0b8fcb",
"body": "…JSDoc to logger.error.ts",
"is_bot": false,
"headline": "docs(logger): enhance CLAUDE.md and README, update package.json, add …",
"author_name": "Aaron Wells",
"author_login": "PhillipAWells",
"committed_at": "2026-07-16T19:50:18Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 0,
"commits_last_year": 174,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 2,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 57,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@pawells/colors",
"exists": true,
"license": "MIT",
"keywords": [
"color",
"colors",
"color-space",
"color-conversion",
"rgb",
"hsl",
"lab",
"oklch",
"color-science",
"delta-e",
"wcag",
"contrast",
"gamut-mapping",
"color-blindness",
"css-color-4",
"typescript"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/colors",
"is_deprecated": false,
"latest_version": "2.1.1",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 6,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 380,
"first_published_at": "2026-02-25T16:58:39.454000Z",
"latest_published_at": "2026-07-17T20:57:06.185000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@pawells/config",
"exists": true,
"license": "MIT",
"keywords": [
"config",
"configuration",
"schema",
"validation",
"zod",
"secrets",
"typescript",
"nodejs"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/config",
"is_deprecated": false,
"latest_version": "3.1.1",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 10,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1305,
"first_published_at": "2026-05-23T19:26:27.067000Z",
"latest_published_at": "2026-07-17T20:57:02.075000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@pawells/logger",
"exists": true,
"license": "MIT",
"keywords": [
"logger",
"logging",
"structured-logging",
"typescript",
"nodejs"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/logger",
"is_deprecated": false,
"latest_version": "4.2.1",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1455,
"first_published_at": "2026-02-24T18:36:35.303000Z",
"latest_published_at": "2026-07-17T20:57:00.606000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@pawells/metrics",
"exists": true,
"license": "MIT",
"keywords": [
"metrics",
"observability",
"instrumentation",
"descriptor",
"exporter"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/metrics",
"is_deprecated": false,
"latest_version": "1.1.1",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 4,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 824,
"first_published_at": "2026-06-29T19:31:03.974000Z",
"latest_published_at": "2026-07-17T20:57:03.714000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@pawells/colors-apca",
"exists": true,
"license": "MIT",
"keywords": [
"apca",
"contrast",
"accessibility",
"wcag",
"colors",
"color-science"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/colors-apca",
"is_deprecated": false,
"latest_version": "0.1.2",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 3,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 426,
"first_published_at": "2026-07-17T18:09:02.625000Z",
"latest_published_at": "2026-07-17T20:57:25.121000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@pawells/http-common",
"exists": true,
"license": "MIT",
"keywords": [
"http",
"http-errors",
"status-codes",
"problem-details",
"rfc7807",
"typescript",
"nodejs"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/http-common",
"is_deprecated": false,
"latest_version": "4.2.1",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 9,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1182,
"first_published_at": "2026-05-04T20:50:02.714000Z",
"latest_published_at": "2026-07-17T20:57:22.385000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@pawells/nestjs-auth",
"exists": true,
"license": "MIT",
"keywords": [
"nestjs",
"keycloak",
"authentication",
"authorization",
"jwt",
"jwks",
"guards",
"decorators"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/nestjs-auth",
"is_deprecated": false,
"latest_version": "4.2.1",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 38,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1489,
"first_published_at": "2026-03-26T14:08:40.425000Z",
"latest_published_at": "2026-07-17T20:57:32.692000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@pawells/math-extended",
"exists": true,
"license": "MIT",
"keywords": [
"math",
"mathematics",
"vectors",
"matrices",
"quaternions",
"linear-algebra",
"geometry",
"interpolation",
"statistics",
"typescript",
"utilities"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@pawells/math-extended",
"is_deprecated": false,
"latest_version": "3.2.1",
"repository_url": "https://github.com/PhillipAWells/workspace",
"versions_count": 10,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 609,
"first_published_at": "2026-02-21T22:29:31.829000Z",
"latest_published_at": "2026-07-17T20:57:04.514000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 52
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": true,
"typecheck_configs": [
"packages/colors-apca/tsconfig.json",
"packages/colors-luts-munsell/tsconfig.json",
"packages/colors-material/tsconfig.json",
"packages/colors/tsconfig.json",
"packages/config-provider-env/tsconfig.json",
"packages/config-provider-json/tsconfig.json",
"packages/config/tsconfig.json",
"packages/graphql-codegen-react/tsconfig.json",
"packages/graphql-codegen-ts/tsconfig.json",
"packages/graphql-common/tsconfig.json",
"packages/graphql-mongoose/tsconfig.json",
"packages/http-common/tsconfig.json",
"packages/logger-transport-file/tsconfig.json",
"packages/logger/tsconfig.json",
"packages/math-extended/tsconfig.json",
"packages/metrics/tsconfig.json",
"packages/nestjs-auth/tsconfig.json",
"packages/nestjs-graphql/tsconfig.json",
"packages/nestjs-logger/tsconfig.json",
"packages/nestjs-metrics/tsconfig.json",
"packages/nestjs-mongoose/tsconfig.json",
"packages/nestjs-nats/tsconfig.json",
"packages/nestjs-qdrant/tsconfig.json",
"packages/nestjs-server/tsconfig.json",
"packages/nx-graphql/tsconfig.json",
"packages/open-telemetry/tsconfig.json",
"packages/prometheus/tsconfig.json",
"packages/pyroscope/tsconfig.json",
"packages/react-auth/tsconfig.json",
"packages/react-federation-core/tsconfig.json",
"packages/react-federation-module/tsconfig.json",
"packages/react-federation-service/tsconfig.json",
"packages/react-graphql/tsconfig.json",
"packages/react-shared/tsconfig.json",
"packages/rxjs-events/tsconfig.json",
"packages/typescript-common/tsconfig.json",
"tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 129720,
"source_files_sampled": 1098,
"oversized_source_files": 4,
"agent_instruction_files": [
"CLAUDE.md",
"packages/colors-apca/CLAUDE.md",
"packages/colors-luts-munsell/CLAUDE.md",
"packages/colors-material/CLAUDE.md",
"packages/colors/CLAUDE.md",
"packages/config-provider-env/CLAUDE.md",
"packages/config-provider-json/CLAUDE.md",
"packages/config/CLAUDE.md",
"packages/graphql-codegen-react/CLAUDE.md",
"packages/graphql-codegen-ts/CLAUDE.md",
"packages/graphql-common/CLAUDE.md",
"packages/graphql-mongoose/CLAUDE.md",
"packages/http-common/CLAUDE.md",
"packages/logger-transport-file/CLAUDE.md",
"packages/logger/CLAUDE.md",
"packages/math-extended/CLAUDE.md",
"packages/metrics/CLAUDE.md",
"packages/nestjs-auth/CLAUDE.md",
"packages/nestjs-graphql/CLAUDE.md",
"packages/nestjs-logger/CLAUDE.md",
"packages/nestjs-metrics/CLAUDE.md",
"packages/nestjs-mongoose/CLAUDE.md",
"packages/nestjs-nats/CLAUDE.md",
"packages/nestjs-qdrant/CLAUDE.md",
"packages/nestjs-server/CLAUDE.md",
"packages/nx-graphql/CLAUDE.md",
"packages/open-telemetry/CLAUDE.md",
"packages/prometheus/CLAUDE.md",
"packages/pyroscope/CLAUDE.md",
"packages/react-auth/CLAUDE.md",
"packages/react-federation-core/CLAUDE.md",
"packages/react-federation-module/CLAUDE.md",
"packages/react-federation-service/CLAUDE.md",
"packages/react-graphql/CLAUDE.md",
"packages/react-shared/CLAUDE.md",
"packages/rxjs-events/CLAUDE.md",
"packages/typescript-common/CLAUDE.md"
],
"agent_instruction_max_bytes": 6446
},
"dependencies": {
"manifests": [
"package.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "tslib",
"manifest": "packages/colors-apca/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/colors-luts-munsell/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/colors-luts-munsell/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "@pawells/math-extended",
"manifest": "packages/colors-material/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/colors-material/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/colors-material/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/math-extended",
"manifest": "packages/colors/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/colors/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/colors/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/colors/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/config",
"manifest": "packages/config-provider-env/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/config-provider-env/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/config-provider-env/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/config-provider-env/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/config",
"manifest": "packages/config-provider-json/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/config-provider-json/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/config-provider-json/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/config-provider-json/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/config/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/config/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/config/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@graphql-codegen/plugin-helpers",
"manifest": "packages/graphql-codegen-react/package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.1"
},
{
"name": "code-block-writer",
"manifest": "packages/graphql-codegen-react/package.json",
"ecosystem": "npm",
"version_constraint": "^13.0.3"
},
{
"name": "tslib",
"manifest": "packages/graphql-codegen-react/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "@graphql-codegen/plugin-helpers",
"manifest": "packages/graphql-codegen-ts/package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.1"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/graphql-codegen-ts/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "code-block-writer",
"manifest": "packages/graphql-codegen-ts/package.json",
"ecosystem": "npm",
"version_constraint": "^13.0.3"
},
{
"name": "graphql-ws",
"manifest": "packages/graphql-codegen-ts/package.json",
"ecosystem": "npm",
"version_constraint": "^6.1.1"
},
{
"name": "strongly-typed-events",
"manifest": "packages/graphql-codegen-ts/package.json",
"ecosystem": "npm",
"version_constraint": "^3.0.11"
},
{
"name": "tslib",
"manifest": "packages/graphql-codegen-ts/package.json",
"ecosystem": "npm",
"version_constraint": "2.8.1"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/graphql-common/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "async-mutex",
"manifest": "packages/graphql-common/package.json",
"ecosystem": "npm",
"version_constraint": "^0.5.0"
},
{
"name": "graphql-subscriptions",
"manifest": "packages/graphql-common/package.json",
"ecosystem": "npm",
"version_constraint": "^3.0.0"
},
{
"name": "tslib",
"manifest": "packages/graphql-common/package.json",
"ecosystem": "npm",
"version_constraint": "2.8.1"
},
{
"name": "zod",
"manifest": "packages/graphql-common/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/graphql-mongoose/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/graphql-mongoose/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/http-common/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/http-common/package.json",
"ecosystem": "npm",
"version_constraint": "^2.3.0"
},
{
"name": "zod",
"manifest": "packages/http-common/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/logger-transport-file/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/logger-transport-file/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "@pawells/rxjs-events",
"manifest": "packages/logger/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/logger/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/logger/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/logger/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/math-extended/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/math-extended/package.json",
"ecosystem": "npm",
"version_constraint": "^2.3.0"
},
{
"name": "zod",
"manifest": "packages/math-extended/package.json",
"ecosystem": "npm",
"version_constraint": "~4.4.3"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/metrics/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/metrics/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/metrics/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@pawells/logger",
"manifest": "packages/nestjs-auth/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "@pawells/metrics",
"manifest": "packages/nestjs-auth/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "@pawells/typescript-common",
"manifest": "packages/nestjs-auth/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "express",
"manifest": "packages/nestjs-auth/package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.0"
},
{
"name": "jose",
"manifest": "packages/nestjs-auth/package.json",
"ecosystem": "npm",
"version_constraint": "^6.2.4"
},
{
"name": "tslib",
"manifest": "packages/nestjs-auth/package.json",
"ecosystem": "npm",
"version_constraint": "^2.3.0"
},
{
"name": "zod",
"manifest": "packages/nestjs-auth/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@apollo/server-plugin-response-cache",
"manifest": "packages/nestjs-graphql/package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.0"
},
{
"name": "@apollo/utils.keyvaluecache",
"manifest": "packages/nestjs-graphql/package.json",
"ecosystem": "npm",
"version_constraint": "^4.0.0"
},
{
"name": "@escape.tech/graphql-armor",
"manifest": "packages/nestjs-graphql/package.json",
"ecosystem": "npm",
"version_constraint": "^3.0.0"
},
{
"name": "@escape.tech/graphql-armor-types",
"manifest": "packages/nestjs-graphql/package.json",
"ecosystem": "npm",
"version_constraint": "^0.7.0"
},
{
"name": "@pawells/config",
"manifest": "packages/nestjs-graphql/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/nestjs-graphql/package.json",
"ecosystem": "npm",
"version_constraint": "^2.3.0"
},
{
"name": "zod",
"manifest": "packages/nestjs-graphql/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
},
{
"name": "@opentelemetry/api",
"manifest": "packages/nestjs-logger/package.json",
"ecosystem": "npm",
"version_constraint": "^1.9.1"
},
{
"name": "@pawells/logger",
"manifest": "packages/nestjs-logger/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "graphql-type-json",
"manifest": "packages/nestjs-logger/package.json",
"ecosystem": "npm",
"version_constraint": "^0.3.2"
},
{
"name": "tslib",
"manifest": "packages/nestjs-logger/package.json",
"ecosystem": "npm",
"version_constraint": "^2.3.0"
},
{
"name": "@pawells/config",
"manifest": "packages/nestjs-metrics/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:^"
},
{
"name": "tslib",
"manifest": "packages/nestjs-metrics/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.1"
},
{
"name": "zod",
"manifest": "packages/nestjs-metrics/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.3"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 14,
"open_issues": 52,
"closed_ratio": 0.509,
"closed_issues": 54,
"closed_unmerged_prs": 10
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "PhillipAWells",
"commits": 173,
"avatar_url": "https://avatars.githubusercontent.com/u/69355326?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"publish.yml"
],
"has_docs_dir": true,
"linter_configs": [
"eslint.config.mjs"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"yarn.lock"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "7 out of 7 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/6 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 10,
"reason": "project is fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "20 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "ca2ecf25e31c872aa22d8860e4373142588e82cd",
"ran_at": "2026-07-23T05:18:24Z",
"aggregate_score": 4.6,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-22T20:10:19Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-22T20:05:01Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 34,
"created_at": "2026-07-21T00:12:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 35,
"created_at": "2026-07-21T00:12:38Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 36,
"created_at": "2026-07-21T00:12:41Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 37,
"created_at": "2026-07-21T00:12:50Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 38,
"created_at": "2026-07-21T00:12:51Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 39,
"created_at": "2026-07-21T00:12:59Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 40,
"created_at": "2026-07-21T00:13:00Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 41,
"created_at": "2026-07-21T00:13:04Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 42,
"created_at": "2026-07-21T00:13:07Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 43,
"created_at": "2026-07-21T00:13:12Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 44,
"created_at": "2026-07-21T00:13:15Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 45,
"created_at": "2026-07-21T00:13:16Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 46,
"created_at": "2026-07-21T00:13:19Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 47,
"created_at": "2026-07-21T00:13:22Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 48,
"created_at": "2026-07-21T00:13:22Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 49,
"created_at": "2026-07-21T00:13:24Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 50,
"created_at": "2026-07-21T00:13:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 51,
"created_at": "2026-07-21T00:13:31Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 52,
"created_at": "2026-07-21T00:13:31Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 53,
"created_at": "2026-07-21T00:13:37Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/PhillipAWells/workspace",
"host": "github.com",
"name": "workspace",
"owner": "PhillipAWells"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 48,
"inputs": {
"security": 46,
"vitality": 33,
"community": 41,
"governance": 43,
"engineering": 80
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 33,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"commits_last_year": 174,
"human_commit_share": 0.99,
"days_since_last_push": 0,
"active_weeks_last_year": 2
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "2/52 weeks with commits",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 2
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "174 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 174
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "critical",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"releases_count": 0
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "no releases published",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases_published",
"params": {}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 41,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 65,
"inputs": {
"packages": [
"@pawells/colors",
"@pawells/config",
"@pawells/logger",
"@pawells/metrics",
"@pawells/colors-apca",
"@pawells/http-common",
"@pawells/nestjs-auth",
"@pawells/math-extended"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 7670
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "7,670 downloads/month across npm",
"points": 51.8,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 7670,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 43,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "at_risk",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 46,
"inputs": {
"merged_prs": 14,
"open_issues": 52,
"closed_issues": 54,
"issue_closed_ratio": 0.509,
"closed_unmerged_prs": 10
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "51% of issues closed",
"points": 23.8,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 51
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "14/24 decided PRs merged",
"points": 22.3,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 14,
"decided": 24
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/6 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 33,
"inputs": {
"followers": 0,
"owner_type": "User",
"is_verified": null,
"owner_login": "PhillipAWells",
"public_repos": 3,
"account_age_days": 2175
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "0 followers of PhillipAWells",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "PhillipAWells"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "3 public repos, account ~5 yr old",
"points": 16.3,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 3
}
},
{
"code": "account_age_years",
"params": {
"years": 5
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@pawells/colors",
"@pawells/config",
"@pawells/logger",
"@pawells/metrics",
"@pawells/colors-apca",
"@pawells/http-common",
"@pawells/nestjs-auth",
"@pawells/math-extended"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "8 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 8,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "38 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 38
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 80,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": "eslint.config.mjs",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.mjs"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "7 out of 7 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 46,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 46,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.6
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "7 out of 7 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/6 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "20 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 75,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"CLAUDE.md",
"packages/colors-apca/CLAUDE.md",
"packages/colors-luts-munsell/CLAUDE.md",
"packages/colors-material/CLAUDE.md",
"packages/colors/CLAUDE.md",
"packages/config-provider-env/CLAUDE.md",
"packages/config-provider-json/CLAUDE.md",
"packages/config/CLAUDE.md",
"packages/graphql-codegen-react/CLAUDE.md",
"packages/graphql-codegen-ts/CLAUDE.md",
"packages/graphql-common/CLAUDE.md",
"packages/graphql-mongoose/CLAUDE.md",
"packages/http-common/CLAUDE.md",
"packages/logger-transport-file/CLAUDE.md",
"packages/logger/CLAUDE.md",
"packages/math-extended/CLAUDE.md",
"packages/metrics/CLAUDE.md",
"packages/nestjs-auth/CLAUDE.md",
"packages/nestjs-graphql/CLAUDE.md",
"packages/nestjs-logger/CLAUDE.md",
"packages/nestjs-metrics/CLAUDE.md",
"packages/nestjs-mongoose/CLAUDE.md",
"packages/nestjs-nats/CLAUDE.md",
"packages/nestjs-qdrant/CLAUDE.md",
"packages/nestjs-server/CLAUDE.md",
"packages/nx-graphql/CLAUDE.md",
"packages/open-telemetry/CLAUDE.md",
"packages/prometheus/CLAUDE.md",
"packages/pyroscope/CLAUDE.md",
"packages/react-auth/CLAUDE.md",
"packages/react-federation-core/CLAUDE.md",
"packages/react-federation-module/CLAUDE.md",
"packages/react-federation-service/CLAUDE.md",
"packages/react-graphql/CLAUDE.md",
"packages/react-shared/CLAUDE.md",
"packages/rxjs-events/CLAUDE.md",
"packages/typescript-common/CLAUDE.md"
],
"agent_instruction_max_bytes": 6446
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md, packages/colors-apca/CLAUDE.md, packages/colors-luts-munsell/CLAUDE.md, packages/colors-material/CLAUDE.md, packages/colors/CLAUDE.md, packages/config-provider-env/CLAUDE.md, packages/config-provider-json/CLAUDE.md, packages/config/CLAUDE.md, packages/graphql-codegen-react/CLAUDE.md, packages/graphql-codegen-ts/CLAUDE.md, packages/graphql-common/CLAUDE.md, packages/graphql-mongoose/CLAUDE.md, packages/http-common/CLAUDE.md, packages/logger-transport-file/CLAUDE.md, packages/logger/CLAUDE.md, packages/math-extended/CLAUDE.md, packages/metrics/CLAUDE.md, packages/nestjs-auth/CLAUDE.md, packages/nestjs-graphql/CLAUDE.md, packages/nestjs-logger/CLAUDE.md, packages/nestjs-metrics/CLAUDE.md, packages/nestjs-mongoose/CLAUDE.md, packages/nestjs-nats/CLAUDE.md, packages/nestjs-qdrant/CLAUDE.md, packages/nestjs-server/CLAUDE.md, packages/nx-graphql/CLAUDE.md, packages/open-telemetry/CLAUDE.md, packages/prometheus/CLAUDE.md, packages/pyroscope/CLAUDE.md, packages/react-auth/CLAUDE.md, packages/react-federation-core/CLAUDE.md, packages/react-federation-module/CLAUDE.md, packages/react-federation-service/CLAUDE.md, packages/react-graphql/CLAUDE.md, packages/react-shared/CLAUDE.md, packages/rxjs-events/CLAUDE.md, packages/typescript-common/CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md, packages/colors-apca/CLAUDE.md, packages/colors-luts-munsell/CLAUDE.md, packages/colors-material/CLAUDE.md, packages/colors/CLAUDE.md, packages/config-provider-env/CLAUDE.md, packages/config-provider-json/CLAUDE.md, packages/config/CLAUDE.md, packages/graphql-codegen-react/CLAUDE.md, packages/graphql-codegen-ts/CLAUDE.md, packages/graphql-common/CLAUDE.md, packages/graphql-mongoose/CLAUDE.md, packages/http-common/CLAUDE.md, packages/logger-transport-file/CLAUDE.md, packages/logger/CLAUDE.md, packages/math-extended/CLAUDE.md, packages/metrics/CLAUDE.md, packages/nestjs-auth/CLAUDE.md, packages/nestjs-graphql/CLAUDE.md, packages/nestjs-logger/CLAUDE.md, packages/nestjs-metrics/CLAUDE.md, packages/nestjs-mongoose/CLAUDE.md, packages/nestjs-nats/CLAUDE.md, packages/nestjs-qdrant/CLAUDE.md, packages/nestjs-server/CLAUDE.md, packages/nx-graphql/CLAUDE.md, packages/open-telemetry/CLAUDE.md, packages/prometheus/CLAUDE.md, packages/pyroscope/CLAUDE.md, packages/react-auth/CLAUDE.md, packages/react-federation-core/CLAUDE.md, packages/react-federation-module/CLAUDE.md, packages/react-federation-service/CLAUDE.md, packages/react-graphql/CLAUDE.md, packages/react-shared/CLAUDE.md, packages/rxjs-events/CLAUDE.md, packages/typescript-common/CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "99 of 99 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 99,
"sampled": 99
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 72,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"yarn.lock"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": true,
"has_linter_config": true,
"typecheck_configs": [
"packages/colors-apca/tsconfig.json",
"packages/colors-luts-munsell/tsconfig.json",
"packages/colors-material/tsconfig.json",
"packages/colors/tsconfig.json",
"packages/config-provider-env/tsconfig.json",
"packages/config-provider-json/tsconfig.json",
"packages/config/tsconfig.json",
"packages/graphql-codegen-react/tsconfig.json",
"packages/graphql-codegen-ts/tsconfig.json",
"packages/graphql-common/tsconfig.json",
"packages/graphql-mongoose/tsconfig.json",
"packages/http-common/tsconfig.json",
"packages/logger-transport-file/tsconfig.json",
"packages/logger/tsconfig.json",
"packages/math-extended/tsconfig.json",
"packages/metrics/tsconfig.json",
"packages/nestjs-auth/tsconfig.json",
"packages/nestjs-graphql/tsconfig.json",
"packages/nestjs-logger/tsconfig.json",
"packages/nestjs-metrics/tsconfig.json",
"packages/nestjs-mongoose/tsconfig.json",
"packages/nestjs-nats/tsconfig.json",
"packages/nestjs-qdrant/tsconfig.json",
"packages/nestjs-server/tsconfig.json",
"packages/nx-graphql/tsconfig.json",
"packages/open-telemetry/tsconfig.json",
"packages/prometheus/tsconfig.json",
"packages/pyroscope/tsconfig.json",
"packages/react-auth/tsconfig.json",
"packages/react-federation-core/tsconfig.json",
"packages/react-federation-module/tsconfig.json",
"packages/react-federation-service/tsconfig.json",
"packages/react-graphql/tsconfig.json",
"packages/react-shared/tsconfig.json",
"packages/rxjs-events/tsconfig.json",
"packages/typescript-common/tsconfig.json",
"tsconfig.json"
],
"agent_commit_share": 0.05,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0.01
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": "eslint.config.mjs",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.mjs"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "packages/colors-apca/tsconfig.json, packages/colors-luts-munsell/tsconfig.json, packages/colors-material/tsconfig.json, packages/colors/tsconfig.json, packages/config-provider-env/tsconfig.json, packages/config-provider-json/tsconfig.json, packages/config/tsconfig.json, packages/graphql-codegen-react/tsconfig.json, packages/graphql-codegen-ts/tsconfig.json, packages/graphql-common/tsconfig.json, packages/graphql-mongoose/tsconfig.json, packages/http-common/tsconfig.json, packages/logger-transport-file/tsconfig.json, packages/logger/tsconfig.json, packages/math-extended/tsconfig.json, packages/metrics/tsconfig.json, packages/nestjs-auth/tsconfig.json, packages/nestjs-graphql/tsconfig.json, packages/nestjs-logger/tsconfig.json, packages/nestjs-metrics/tsconfig.json, packages/nestjs-mongoose/tsconfig.json, packages/nestjs-nats/tsconfig.json, packages/nestjs-qdrant/tsconfig.json, packages/nestjs-server/tsconfig.json, packages/nx-graphql/tsconfig.json, packages/open-telemetry/tsconfig.json, packages/prometheus/tsconfig.json, packages/pyroscope/tsconfig.json, packages/react-auth/tsconfig.json, packages/react-federation-core/tsconfig.json, packages/react-federation-module/tsconfig.json, packages/react-federation-service/tsconfig.json, packages/react-graphql/tsconfig.json, packages/react-shared/tsconfig.json, packages/rxjs-events/tsconfig.json, packages/typescript-common/tsconfig.json, tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "packages/colors-apca/tsconfig.json, packages/colors-luts-munsell/tsconfig.json, packages/colors-material/tsconfig.json, packages/colors/tsconfig.json, packages/config-provider-env/tsconfig.json, packages/config-provider-json/tsconfig.json, packages/config/tsconfig.json, packages/graphql-codegen-react/tsconfig.json, packages/graphql-codegen-ts/tsconfig.json, packages/graphql-common/tsconfig.json, packages/graphql-mongoose/tsconfig.json, packages/http-common/tsconfig.json, packages/logger-transport-file/tsconfig.json, packages/logger/tsconfig.json, packages/math-extended/tsconfig.json, packages/metrics/tsconfig.json, packages/nestjs-auth/tsconfig.json, packages/nestjs-graphql/tsconfig.json, packages/nestjs-logger/tsconfig.json, packages/nestjs-metrics/tsconfig.json, packages/nestjs-mongoose/tsconfig.json, packages/nestjs-nats/tsconfig.json, packages/nestjs-qdrant/tsconfig.json, packages/nestjs-server/tsconfig.json, packages/nx-graphql/tsconfig.json, packages/open-telemetry/tsconfig.json, packages/prometheus/tsconfig.json, packages/pyroscope/tsconfig.json, packages/react-auth/tsconfig.json, packages/react-federation-core/tsconfig.json, packages/react-federation-module/tsconfig.json, packages/react-federation-service/tsconfig.json, packages/react-graphql/tsconfig.json, packages/react-shared/tsconfig.json, packages/rxjs-events/tsconfig.json, packages/typescript-common/tsconfig.json, tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "devcontainer, Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "devcontainer, Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "5 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 5,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "1 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 1,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 129720,
"source_files_sampled": 1098,
"oversized_source_files": 4
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "4/1098 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 1098,
"oversized": 4
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@pawells/colors@2.1.1; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-23T05:18:38.846019Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/PhillipAWells/workspace.svg",
"full_name": "PhillipAWells/workspace",
"license_state": "standard",
"license_spdx": "MIT"
}