From 1a8b60548803a227212e9f8ffc2d728781fd5aee Mon Sep 17 00:00:00 2001 From: nicolethoen Date: Wed, 18 Mar 2026 17:34:26 -0400 Subject: [PATCH 1/5] chore: add agentic guidance --- BOOKMARKS.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ CLAUDE.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 BOOKMARKS.md create mode 100644 CLAUDE.md diff --git a/BOOKMARKS.md b/BOOKMARKS.md new file mode 100644 index 0000000..aa91ae1 --- /dev/null +++ b/BOOKMARKS.md @@ -0,0 +1,48 @@ +# Bookmarks + +Progressive disclosure for task-specific documentation and references. + +## Table of Contents +- [PatternFly Documentation](#patternfly-documentation) +- [Design & Guidelines](#design--guidelines) +- [Development Resources](#development-resources) + +--- + +## PatternFly Documentation + +### [PatternFly 6 React Docs](https://www.patternfly.org/) + +Official PatternFly 6 React component documentation and API reference. + +**Added by**: Initial setup | **Date**: 2026-03-18 + +### [PatternFly MCP Server](https://www.npmjs.com/package/@patternfly/patternfly-mcp) + +MCP server for PatternFly development rules and documentation - use with Ambient/Claude for inline guidance. + +**Added by**: Initial setup | **Date**: 2026-03-18 + +--- + +## Design & Guidelines + +### [Design Guidelines (Local)](./packages/module/patternfly-docs/content/design-guidelines/) + +Local design guidelines provided by PatternFly team for this extension. + +**Added by**: Initial setup | **Date**: 2026-03-18 | **Note**: Authoritative source for UX patterns + +--- + +## Development Resources + +### [Component Examples (Local)](./packages/module/patternfly-docs/content/examples/) + +Live code examples and markdown documentation for all components in this extension. + +**Added by**: Initial setup | **Date**: 2026-03-18 | **Note**: Start with URL.tsx for basic usage + +--- + +**Tip**: Use `/bookmark ` in Ambient to add to this list collaboratively with your team. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b158b61 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,52 @@ +# react-user-feedback + +A React component library for collecting user feedback via a form in a modal. Built with React, TypeScript, PatternFly, and Webpack. + +## Structure + +- `/packages/module/src/Feedback` - React components specific to this PatternFly extension +- `/packages/module/patternfly-docs/content/examples/` - MD files and live code examples for API documentation +- `/packages/module/patternfly-docs/content/design-guidelines/` - Design guidelines from PatternFly for this extension + +## Key Files + +- Monorepo root: `/package.json` +- Library package: `/packages/module/package.json` +- Setup instructions: `/README.md` +- Custom styling: `/packages/module/src/Feedback/Feedback.css` +- Usage entry point: `/packages/module/patternfly-docs/content/examples/URL.tsx` + +## Commands + +```bash +yarn build # Build the library +yarn test # Run tests (currently disabled) +yarn lint # Lint the codebase +``` + +For accessibility testing: +```bash +yarn build:docs && yarn serve:docs # Start docs server +yarn test:a11y # Run a11y tests (in separate terminal) +``` + +## Important Context + +- **Use PatternFly 6 components** - no inline styles, minimal custom styles +- **Do NOT use TailwindCSS** - this uses PatternFly design system +- PatternFly MCP available for development rules and docs: + ```json + { + "mcpServers": { + "patternfly-docs": { + "command": "npx", + "args": ["-y", "@patternfly/patternfly-mcp"], + "description": "PatternFly React development rules and documentation" + } + } + } + ``` + +## More Info + +See [BOOKMARKS.md](BOOKMARKS.md) for PatternFly documentation, design guidelines, and contribution resources. From 1c667614e0e352419580e9ccdfd48fa559c7db1c Mon Sep 17 00:00:00 2001 From: nicolethoen Date: Fri, 10 Apr 2026 10:43:31 -0400 Subject: [PATCH 2/5] address agent readiness gaps --- .github/ISSUE_TEMPLATE/bug_report.yml | 57 + .github/ISSUE_TEMPLATE/config.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.yml | 55 + .github/PULL_REQUEST_TEMPLATE.md | 40 + .github/workflows/build-lint-test.yml | 37 +- .github/workflows/build.yml | 8 +- .github/workflows/promote.yml | 4 +- .github/workflows/release.yml | 8 +- .gitignore | 14 +- .husky/pre-commit | 2 +- .markdownlint.json | 7 + .markdownlintignore | 6 + .pre-commit-config.yaml | 29 + BOOKMARKS.md | 12 + CLAUDE.md | 18 +- README.md | 75 +- .../0001-monorepo-layout-packages-module.md | 23 + docs/adr/0002-unit-testing-with-jest.md | 24 + ...0003-ci-pr-checks-via-reusable-workflow.md | 23 + .../assessment-20260409-161920.json | 1041 ++++++ .../assessment-latest.json | 1 + .../report-20260409-161920.html | 2889 +++++++++++++++++ .../report-20260409-161920.md | 844 +++++ docs/agentready-baseline/report-latest.html | 1 + docs/agentready-baseline/report-latest.md | 1 + .../assessment-20260410-092152.json | 778 +++++ .../assessment-latest.json | 1 + .../report-20260410-092152.html | 2431 ++++++++++++++ .../report-20260410-092152.md | 417 +++ .../report-latest.html | 1 + .../report-latest.md | 1 + jest.setup.js | 2 + package.json | 60 +- .../react-user-feedback/design-guidelines.js | 34 - .../extensions/react-user-feedback/react.js | 111 - .../user-feedback/design-guidelines.js | 157 - .../extensions/user-feedback/react.js | 184 -- .../module/patternfly-docs/generated/index.js | 23 - packages/module/src/__tests__/smoke.test.ts | 5 + tsconfig.json | 6 + yarn.lock | 856 ++++- 41 files changed, 9653 insertions(+), 634 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .markdownlint.json create mode 100644 .markdownlintignore create mode 100644 .pre-commit-config.yaml create mode 100644 docs/adr/0001-monorepo-layout-packages-module.md create mode 100644 docs/adr/0002-unit-testing-with-jest.md create mode 100644 docs/adr/0003-ci-pr-checks-via-reusable-workflow.md create mode 100644 docs/agentready-baseline/assessment-20260409-161920.json create mode 120000 docs/agentready-baseline/assessment-latest.json create mode 100644 docs/agentready-baseline/report-20260409-161920.html create mode 100644 docs/agentready-baseline/report-20260409-161920.md create mode 120000 docs/agentready-baseline/report-latest.html create mode 120000 docs/agentready-baseline/report-latest.md create mode 100644 docs/agentready-post-remediation/assessment-20260410-092152.json create mode 120000 docs/agentready-post-remediation/assessment-latest.json create mode 100644 docs/agentready-post-remediation/report-20260410-092152.html create mode 100644 docs/agentready-post-remediation/report-20260410-092152.md create mode 120000 docs/agentready-post-remediation/report-latest.html create mode 120000 docs/agentready-post-remediation/report-latest.md delete mode 100644 packages/module/patternfly-docs/generated/extensions/react-user-feedback/design-guidelines.js delete mode 100644 packages/module/patternfly-docs/generated/extensions/react-user-feedback/react.js delete mode 100644 packages/module/patternfly-docs/generated/extensions/user-feedback/design-guidelines.js delete mode 100644 packages/module/patternfly-docs/generated/extensions/user-feedback/react.js delete mode 100644 packages/module/patternfly-docs/generated/index.js create mode 100644 packages/module/src/__tests__/smoke.test.ts create mode 100644 tsconfig.json diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..7052beb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,57 @@ +name: Bug report +description: Report a problem with the PatternFly User feedback extension +title: '[User feedback] - [short description]' +type: bug +body: + - type: markdown + attributes: + value: | + Thanks for the report. Please include enough detail for maintainers to reproduce the issue. + + - type: textarea + id: description + attributes: + label: Description + description: What is going wrong? What did you expect instead? + validations: + required: true + + - type: textarea + id: reproduction + attributes: + label: Steps to reproduce + placeholder: | + 1. … + 2. … + 3. … + validations: + required: true + + - type: textarea + id: environment + attributes: + label: Environment + description: Versions help narrow the issue. + placeholder: | + - @patternfly/react-user-feedback version: + - @patternfly/react-core version: + - React version: + - Browser: + validations: + required: false + + - type: textarea + id: code + attributes: + label: Minimal example or code snippet (optional) + description: Short snippet or CodeSandbox-style reference if possible. + validations: + required: false + + - type: textarea + id: accessibility + attributes: + label: Accessibility (optional) + description: Keyboard, screen reader, or focus issues? + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..0086358 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..8180b08 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,55 @@ +name: Feature request +description: Suggest an improvement or new capability for the User feedback extension +title: '[User feedback] - [short description]' +type: feature +body: + - type: markdown + attributes: + value: | + Share enough context for maintainers to evaluate fit with PatternFly and this extension. + + - type: dropdown + id: area + attributes: + label: Area + description: Which part of the extension is this about? + options: + - Modal / feedback flow + - Forms (feedback, bug report, mailing list) + - Locales / i18n + - Documentation or examples + - Build / tooling + - Other + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem or use case + description: What are you trying to achieve? + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Ideas, API shape, or UX notes. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + validations: + required: false + + - type: textarea + id: accessibility + attributes: + label: Accessibility (optional) + description: Any specific a11y requirements? + validations: + required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..2fd75a4 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,40 @@ +Closes # + +## Summary + + + +## Documentation preview (Surge) + + + +**Preview URL:** + +## Screenshots / recordings (optional) + + + +## Testing + +- [ ] `yarn lint` +- [ ] `yarn build` +- [ ] `yarn test` (if applicable for this change) +- [ ] Docs: `yarn build:docs` (and `yarn test:a11y` if the change affects UI or docs in a way that warrants it) + +## Breaking changes + + + +## Follow-up work + + + +- + +## Review + +- [ ] This PR needs review from **a maintainer of this repository** before merge. + +## AI-assisted changes + + diff --git a/.github/workflows/build-lint-test.yml b/.github/workflows/build-lint-test.yml index 44c4e31..0e630e5 100644 --- a/.github/workflows/build-lint-test.yml +++ b/.github/workflows/build-lint-test.yml @@ -2,6 +2,15 @@ name: build-lint-test on: workflow_call: jobs: + actionlint: + name: Lint workflow YAML + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Download actionlint + run: curl -fsSL https://raw.githubusercontent.com/rhysd/actionlint/v1.7.7/scripts/download-actionlint.bash | bash -s -- 1.7.7 + - name: Run actionlint + run: ./actionlint -color build: runs-on: ubuntu-latest env: @@ -14,7 +23,7 @@ jobs: git fetch origin pull/$GH_PR_NUM/head:tmp git checkout tmp fi - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20' - uses: actions/cache@v4 @@ -22,8 +31,8 @@ jobs: name: Cache npm deps with: path: | - node_modules - **/node_modules + node_modules + **/node_modules key: ${{ runner.os }}-yarn-14-${{ secrets.CACHE_VERSION }}-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile if: steps.yarn-cache.outputs.cache-hit != 'true' @@ -50,7 +59,7 @@ jobs: git fetch origin pull/$GH_PR_NUM/head:tmp git checkout tmp fi - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20' - uses: actions/cache@v4 @@ -58,8 +67,8 @@ jobs: name: Cache npm deps with: path: | - node_modules - **/node_modules + node_modules + **/node_modules key: ${{ runner.os }}-yarn-14-${{ secrets.CACHE_VERSION }}-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile if: steps.yarn-cache.outputs.cache-hit != 'true' @@ -87,7 +96,7 @@ jobs: git fetch origin pull/$GH_PR_NUM/head:tmp git checkout tmp fi - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20' - uses: actions/cache@v4 @@ -95,9 +104,9 @@ jobs: name: Cache npm deps with: path: | - node_modules - **/node_modules - ~/.cache/Cypress + node_modules + **/node_modules + ~/.cache/Cypress key: ${{ runner.os }}-yarn-14-${{ secrets.CACHE_VERSION }}-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile if: steps.yarn-cache.outputs.cache-hit != 'true' @@ -128,7 +137,7 @@ jobs: git fetch origin pull/$GH_PR_NUM/head:tmp git checkout tmp fi - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20' - uses: actions/cache@v4 @@ -136,9 +145,9 @@ jobs: name: Cache npm deps with: path: | - node_modules - **/node_modules - ~/.cache/Cypress + node_modules + **/node_modules + ~/.cache/Cypress key: ${{ runner.os }}-yarn-14-${{ secrets.CACHE_VERSION }}-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile if: steps.yarn-cache.outputs.cache-hit != 'true' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b10b8d0..561b976 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,7 +30,7 @@ jobs: run: ./devSetup.sh shell: bash if: steps.setup-cache.outputs.cache-hit != 'true' - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20' - uses: actions/cache@v4 @@ -38,8 +38,8 @@ jobs: name: Cache npm deps with: path: | - node_modules - **/node_modules + node_modules + **/node_modules key: ${{ runner.os }}-yarn-14-${{ secrets.CACHE_VERSION }}-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile if: steps.yarn-cache.outputs.cache-hit != 'true' @@ -52,4 +52,4 @@ jobs: key: ${{ runner.os }}-dist-14-${{ secrets.CACHE_VERSION }}-${{ hashFiles('yarn.lock', 'package.json', 'packages/*/*', '!packages/*/dist', '!packages/*/node_modules') }} - name: Build dist run: yarn build - if: steps.dist.outputs.cache-hit != 'true' \ No newline at end of file + if: steps.dist.outputs.cache-hit != 'true' diff --git a/.github/workflows/promote.yml b/.github/workflows/promote.yml index 8512887..485e912 100644 --- a/.github/workflows/promote.yml +++ b/.github/workflows/promote.yml @@ -2,7 +2,7 @@ name: promote on: push: # Sequence of patterns matched against refs/tags - tags: + tags: - v6.* jobs: build-and-promote: @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v4 - name: Build for promotion run: yarn install --frozen-lockfile && yarn build - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20.x' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 82a423b..98c1983 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20' - uses: actions/cache@v4 @@ -23,9 +23,9 @@ jobs: name: Cache npm deps with: path: | - node_modules - **/node_modules - ~/.cache/Cypress + node_modules + **/node_modules + ~/.cache/Cypress key: ${{ runner.os }}-yarn-14-${{ secrets.CACHE_VERSION }}-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile if: steps.yarn-cache.outputs.cache-hit != 'true' diff --git a/.gitignore b/.gitignore index e61a201..a971cff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ # Javascript builds node_modules +.npm/ dist tsc_out +*.tsbuildinfo .out .changelog .DS_Store @@ -10,8 +12,9 @@ coverage .tmp .eslintcache -# package managers +# package managers and logs yarn-error.log +*.log lerna-debug.log # IDEs and editors @@ -30,5 +33,12 @@ lerna-debug.log .vscode # For vim *.swp +*.swo -public \ No newline at end of file +public + +# actionlint binary when downloaded locally (CI downloads to workspace) +/actionlint + +# PatternFly docs framework output (regenerated by docs:develop / docs:build) +packages/module/patternfly-docs/generated/ \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index 93b2a70..5a182ef 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -yarn lint && yarn test +yarn lint-staged diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..a2622fc --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,7 @@ +{ + "default": true, + "MD013": false, + "MD024": false, + "MD033": false, + "MD041": false +} diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 0000000..63bb023 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,6 @@ +node_modules +**/node_modules +packages/*/dist +**/coverage +docs/agentready-baseline/** +packages/module/patternfly-docs/** diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..57198ec --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,29 @@ +# Optional: `pip install pre-commit && pre-commit install` (Husky + lint-staged remains the primary path). +default_install_hook_types: [pre-commit] +default_stages: [pre-commit] + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-merge-conflict + + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.44.0 + hooks: + - id: markdownlint + + - repo: https://github.com/rhysd/actionlint + rev: v1.7.7 + hooks: + - id: actionlint + + - repo: local + hooks: + - id: yarn-lint-staged + name: yarn lint-staged + language: system + entry: yarn lint-staged + pass_filenames: false diff --git a/BOOKMARKS.md b/BOOKMARKS.md index aa91ae1..e27187f 100644 --- a/BOOKMARKS.md +++ b/BOOKMARKS.md @@ -3,8 +3,10 @@ Progressive disclosure for task-specific documentation and references. ## Table of Contents + - [PatternFly Documentation](#patternfly-documentation) - [Design & Guidelines](#design--guidelines) +- [Architecture decisions](#architecture-decisions) - [Development Resources](#development-resources) --- @@ -35,6 +37,16 @@ Local design guidelines provided by PatternFly team for this extension. --- +## Architecture decisions + +### [ADR 0001 — Monorepo layout (local)](./docs/adr/0001-monorepo-layout-packages-module.md) + +Why the library lives under `packages/module/` instead of a root `src/` / `tests/` layout. + +**Added by**: AgentReady remediation | **Date**: 2026-04-09 + +--- + ## Development Resources ### [Component Examples (Local)](./packages/module/patternfly-docs/content/examples/) diff --git a/CLAUDE.md b/CLAUDE.md index b158b61..7c8a24a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,15 +4,20 @@ A React component library for collecting user feedback via a form in a modal. Bu ## Structure -- `/packages/module/src/Feedback` - React components specific to this PatternFly extension -- `/packages/module/patternfly-docs/content/examples/` - MD files and live code examples for API documentation -- `/packages/module/patternfly-docs/content/design-guidelines/` - Design guidelines from PatternFly for this extension +This repo is a **Yarn workspaces** monorepo. The **shipped library** is **`@patternfly/react-user-feedback`** from **`packages/module`**. There is **no** repository-root `src/` or `tests/` folder by design: implementation and tests live under the package (see [`docs/adr/0001-monorepo-layout-packages-module.md`](docs/adr/0001-monorepo-layout-packages-module.md)). + +- `/packages/module/src/` — TypeScript/React source (e.g. `Feedback/`) +- `/packages/module/patternfly-docs/content/examples/` — MD files and live code examples for API documentation +- `/packages/module/patternfly-docs/content/design-guidelines/` — Design guidelines from PatternFly for this extension + +**Jest** is configured at the monorepo root with `roots` under `packages/`; add or run tests from paths the package already uses (e.g. `packages/module/src/**/__tests__` or `*.test.*` per `jest.config.js`). ## Key Files - Monorepo root: `/package.json` - Library package: `/packages/module/package.json` - Setup instructions: `/README.md` +- TypeScript: **`/tsconfig.json`** at the repo root **extends** **`/packages/module/tsconfig.json`** (canonical options and build for the shipped library live in the package; the root file exists for IDEs, agents, and tools that only look at the repository root) - Custom styling: `/packages/module/src/Feedback/Feedback.css` - Usage entry point: `/packages/module/patternfly-docs/content/examples/URL.tsx` @@ -20,11 +25,13 @@ A React component library for collecting user feedback via a form in a modal. Bu ```bash yarn build # Build the library -yarn test # Run tests (currently disabled) -yarn lint # Lint the codebase +yarn test # Run Jest for packages/ +yarn lint # Lint all of packages/ (like CI) +yarn lint-staged # What Husky runs on commit: Prettier + ESLint + jest --findRelatedTests on staged files only ``` For accessibility testing: + ```bash yarn build:docs && yarn serve:docs # Start docs server yarn test:a11y # Run a11y tests (in separate terminal) @@ -35,6 +42,7 @@ yarn test:a11y # Run a11y tests (in separate terminal) - **Use PatternFly 6 components** - no inline styles, minimal custom styles - **Do NOT use TailwindCSS** - this uses PatternFly design system - PatternFly MCP available for development rules and docs: + ```json { "mcpServers": { diff --git a/README.md b/README.md index 7c78820..1e85c67 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,24 @@ # User feedback -This project is a [PatternFly](https://github.com/patternfly/patternfly-react) React extension that products can use to collect feedback from users. To view examples of this extension’s use, [view its documentation on PatternFly](https://www.patternfly.org/v4/extensions/user-feedback). +[![PR checks](https://github.com/patternfly/react-user-feedback/actions/workflows/check-pr.yml/badge.svg)](https://github.com/patternfly/react-user-feedback/actions/workflows/check-pr.yml) -## Installing dependencies +[PatternFly](https://github.com/patternfly/patternfly-react) React extension for collecting product feedback (modal, forms, optional mailing-list and bug flows). Live docs and examples: [PatternFly — User feedback extension](https://www.patternfly.org/v4/extensions/user-feedback). -[Yarn](https://yarnpkg.com/) is used to develop and build user feedback. To install dependencies for this project, use the `yarn install` terminal command: +The shipped package is **`@patternfly/react-user-feedback`**, built from **`packages/module/`** (not a root-level `src/`). See [ADR 0001](docs/adr/0001-monorepo-layout-packages-module.md). Contributor and agent context: [`CLAUDE.md`](CLAUDE.md), [`BOOKMARKS.md`](BOOKMARKS.md). -``` -yarn install -``` - -## Building the extension +**Install and build:** -Once dependencies are installed, you can build user feedback locally using the `yard build` terminal command: - -``` +```bash +yarn install yarn build ``` -## Development instructions - -### Using the development server - -The development server runs and develops user feedback, and also contains documentation and working examples. To start the development server, use the `yarn start` terminal command: - - -``` -yarn start -``` - -### Running unit tests - -User feedback is tested with [Jest](https://jestjs.io) and the [React testing library](https://testing-library.com/docs/react-testing-library/intro/). To run unit tests, use the `yarn test` terminal command: - - -``` -yarn test -``` - -### Linting - -[ESLint](https://eslint.org/) is used to analyze user feedback’s source code to flag potential quality errors. This also ensures that all contributors follow the same best practices. To run the linter, use the `yarn lint` terminal command: - - -``` -yarn lint -``` - -### Accessibility -Accessibility (a11y) tests are used to ensure that user feedback meets the same a11y guidelines as PatternFly. To run a11y tests, you must build and serve its documentation by using the `yarn build:docs` and `yarn serve:docs` terminal commands: - - -``` -yarn build:docs -yarn serve:docs -``` - -In a new terminal window, use the `yarn test:a11y` to run accessibility tests: - -``` -yarn test:a11y -``` - -Once the accessibility tests have finished running, you can locally view the generated report using the the `yarn serve:a11y` terminal command: - -``` -yarn serve:a11y -``` +**Docs development:** **`yarn start`** — builds the library, then runs the PatternFly docs dev server (examples + hot reload). **`yarn build:docs`** — production docs build. **`yarn serve:docs`** — serves the built docs (port from the docs framework). -### Committing changes +**Lint:** **`yarn lint`** — ESLint for JS/TS and Markdown under `packages/` (see `package.json` for `lint:js` / `lint:md` / `lint:markdownlint`). -When commiting changes to this repo follow the [semantic release guidelines](https://github.com/semantic-release/semantic-release). +**Unit tests:** Jest uses `jest.setup.js`; tests live under `packages/`. Run **`yarn test`**. **Husky** runs **`lint-staged`** on commit; on staged `packages/**/*.{js,jsx,ts,tsx}` it runs Prettier, ESLint, and **`jest --findRelatedTests`**. -### AI-assisted development guidelines +**Accessibility:** use two terminals — (1) `yarn build:docs && yarn serve:docs` (2) `yarn test:a11y`. **`yarn serve:a11y`** opens the generated a11y report after tests. -Please reference [PatternFly's AI-assisted development guidelines](https://github.com/patternfly/.github/blob/main/CONTRIBUTING.md) if you'd like to contribute code generated using AI. +**Contributing:** follow [semantic-release / conventional commits](https://github.com/semantic-release/semantic-release). For AI-assisted changes, use [PatternFly AI-assisted development guidelines](https://github.com/patternfly/.github/blob/main/CONTRIBUTING.md). diff --git a/docs/adr/0001-monorepo-layout-packages-module.md b/docs/adr/0001-monorepo-layout-packages-module.md new file mode 100644 index 0000000..abf8aad --- /dev/null +++ b/docs/adr/0001-monorepo-layout-packages-module.md @@ -0,0 +1,23 @@ +# 1. Monorepo layout: library source in `packages/module` (no root `src/` / `tests/`) + +Date: 2026-04-09 + +## Status + +Accepted + +## Context + +This repository is a **Yarn workspaces** monorepo. The shipped npm package **`@patternfly/react-user-feedback`** is built from **`packages/module`**. Some automated “agent readiness” or scaffolding tools expect a **repository-root** `src/` directory and a **repository-root** `tests/` directory. This project does **not** use that layout. + +## Decision + +- **Source code** for the extension lives under **`packages/module/src/`** (not `/src` at the repo root). +- **Unit tests** are colocated with the package (e.g. under `packages/module/src/**/__tests__` or `*.test.*` as configured) and **Jest** is configured with **`roots`** aimed at **`packages/`** (see root `jest.config.js`). +- We **do not** add a root-level `src/` or `tests/` directory solely to satisfy generic directory checks; agents and contributors should treat **`packages/module`** as the library root. + +## Consequences + +- **Positive:** One canonical path for the published package; matches `yarn build` and workspace layout. +- **Positive:** Agents reading `CLAUDE.md` or this ADR know where to edit and test without guessing. +- **Neutral:** Tools that only look for `/src` and `/tests` at the repo root may still report a “standard layout” finding until they understand workspaces—documented here as intentional. diff --git a/docs/adr/0002-unit-testing-with-jest.md b/docs/adr/0002-unit-testing-with-jest.md new file mode 100644 index 0000000..ac4a61d --- /dev/null +++ b/docs/adr/0002-unit-testing-with-jest.md @@ -0,0 +1,24 @@ +# 2. Unit testing with Jest at the workspace root + +Date: 2026-04-10 + +## Status + +Accepted + +## Context + +The library ships from **`packages/module`**, but contributors expect a single **`yarn test`** entry point from the repository root. We need consistent time zones for snapshots, a minimal guard against an empty Jest configuration, and fast feedback on pre-commit for staged changes. + +## Decision + +- **Jest is configured at the repo root** (`jest.config.js`, `jest.setup.js`) with **`roots`** aimed at **`packages/`** so tests in the workspace are discovered without a root-level `tests/` directory. +- **Default timezone** for tests is set in **`jest.setup.js`** (and mirrored in the **`yarn test`** script where needed) so date-sensitive output is stable in CI and locally. +- A small **smoke test** under `packages/module` ensures the suite is non-empty and the wiring stays valid. +- **lint-staged** may run **`jest --findRelatedTests`** on staged source files to keep pre-commit fast. + +## Consequences + +- **Positive:** One obvious command for CI and local runs; aligns with Yarn workspaces. +- **Positive:** Related-tests mode keeps Husky commits quick for small edits. +- **Neutral:** Agents must look under **`packages/`** (and package-local `__tests__` / `*.test.*` patterns) rather than a single top-level `tests/` folder. diff --git a/docs/adr/0003-ci-pr-checks-via-reusable-workflow.md b/docs/adr/0003-ci-pr-checks-via-reusable-workflow.md new file mode 100644 index 0000000..bbe09c5 --- /dev/null +++ b/docs/adr/0003-ci-pr-checks-via-reusable-workflow.md @@ -0,0 +1,23 @@ +# 3. CI: PR checks via a reusable build / lint / test workflow + +Date: 2026-04-10 + +## Status + +Accepted + +## Context + +We need reliable **lint**, **unit**, and **accessibility** checks on pull requests without duplicating workflow steps across repositories or branches. GitHub Actions **reusable workflows** let one definition drive **`check-pr`** (and similar callers) while keeping caching and checkout behavior consistent. + +## Decision + +- **`.github/workflows/check-pr.yml`** runs on pull requests to protected branches and **calls** **`.github/workflows/build-lint-test.yml`** via **`workflow_call`**. +- The reusable workflow performs **install**, **build**, **lint**, **Jest**, and **docs + a11y** steps appropriate to this repo (including caches where configured). +- **Workflow hygiene** (e.g. validating Action YAML) is treated as part of CI maintenance alongside ESLint and tests. + +## Consequences + +- **Positive:** One place to adjust CI steps; PR contributors see a single “pipeline” for the repo. +- **Positive:** Callers can pass **environment** (e.g. PR number) for checkout behavior without copying job YAML. +- **Neutral:** Changes to the reusable workflow affect every workflow that references it; review those edits carefully. diff --git a/docs/agentready-baseline/assessment-20260409-161920.json b/docs/agentready-baseline/assessment-20260409-161920.json new file mode 100644 index 0000000..0a5c09e --- /dev/null +++ b/docs/agentready-baseline/assessment-20260409-161920.json @@ -0,0 +1,1041 @@ +{ + "schema_version": "1.0.0", + "metadata": { + "agentready_version": "2.30.1", + "research_version": "1.0.1", + "assessment_timestamp": "2026-04-09T16:19:20.792448", + "assessment_timestamp_human": "April 09, 2026 at 4:19 PM", + "executed_by": "nthoen@nthoen-mac", + "command": "/Library/Frameworks/Python.framework/Versions/3.12/bin/agentready assess . -o docs/agentready-baseline -v", + "working_directory": "/Users/nthoen/Projects/react-user-feedback" + }, + "repository": { + "path": "/Users/nthoen/Projects/react-user-feedback", + "name": "react-user-feedback", + "url": "git@github.com:patternfly/react-user-feedback.git", + "branch": "main", + "commit_hash": "402ab4199df0bb24c1bb6d32d414eb331e3e743c", + "languages": { + "JSON": 8, + "YAML": 6, + "Markdown": 3, + "JavaScript": 20, + "TypeScript": 15 + }, + "total_files": 74, + "total_lines": 25342 + }, + "timestamp": "2026-04-09T16:19:20.792448", + "overall_score": 45.9, + "certification_level": "Bronze", + "attributes_assessed": 18, + "attributes_skipped": 7, + "attributes_total": 25, + "findings": [ + { + "attribute": { + "id": "claude_md_file", + "name": "CLAUDE.md Configuration Files", + "category": "Context Window Optimization", + "tier": 1, + "description": "Project-specific configuration for Claude Code", + "criteria": "CLAUDE.md file exists in repository root", + "default_weight": 0.1 + }, + "status": "fail", + "score": 0.0, + "measured_value": "missing", + "threshold": "present", + "evidence": [ + "CLAUDE.md not found in repository root", + "AGENTS.md not found (alternative)" + ], + "remediation": { + "summary": "Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants", + "steps": [ + "Choose one of three approaches:", + " Option 1: Create standalone CLAUDE.md (>50 bytes) with project context", + " Option 2: Create AGENTS.md and symlink CLAUDE.md to it (cross-tool compatibility)", + " Option 3: Create AGENTS.md and reference it with @AGENTS.md in minimal CLAUDE.md", + "Add project overview and purpose", + "Document key architectural patterns", + "Specify coding standards and conventions", + "Include build/test/deployment commands", + "Add any project-specific context that helps AI assistants" + ], + "tools": [], + "commands": [ + "# Option 1: Standalone CLAUDE.md", + "touch CLAUDE.md", + "# Add content describing your project", + "", + "# Option 2: Symlink CLAUDE.md to AGENTS.md", + "touch AGENTS.md", + "# Add content to AGENTS.md", + "ln -s AGENTS.md CLAUDE.md", + "", + "# Option 3: @ reference in CLAUDE.md", + "echo '@AGENTS.md' > CLAUDE.md", + "touch AGENTS.md", + "# Add content to AGENTS.md" + ], + "examples": [ + "# Standalone CLAUDE.md (Option 1)\n\n## Overview\nBrief description of what this project does.\n\n## Architecture\nKey patterns and structure.\n\n## Development\n```bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build\nnpm run build\n```\n\n## Coding Standards\n- Use TypeScript strict mode\n- Follow ESLint configuration\n- Write tests for new features\n", + "# CLAUDE.md with @ reference (Option 3)\n@AGENTS.md\n", + "# AGENTS.md (shared by multiple tools)\n\n## Project Overview\nThis project implements a REST API for user management.\n\n## Architecture\n- Layered architecture: controllers, services, repositories\n- PostgreSQL database with SQLAlchemy ORM\n- FastAPI web framework\n\n## Development Workflow\n```bash\n# Setup\npython -m venv .venv\nsource .venv/bin/activate\npip install -e .\n\n# Run tests\npytest\n\n# Start server\nuvicorn app.main:app --reload\n```\n\n## Code Conventions\n- Use type hints for all functions\n- Follow PEP 8 style guide\n- Write docstrings for public APIs\n- Maintain >80% test coverage\n" + ], + "citations": [ + { + "source": "Anthropic", + "title": "Claude Code Documentation", + "url": "https://docs.anthropic.com/claude-code", + "relevance": "Official guidance on CLAUDE.md configuration" + }, + { + "source": "agents.md", + "title": "AGENTS.md Specification", + "url": "https://agents.md/", + "relevance": "Emerging standard for cross-tool AI assistant configuration" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "readme_structure", + "name": "README Structure", + "category": "Documentation Standards", + "tier": 1, + "description": "Well-structured README with key sections", + "criteria": "README.md with installation, usage, and development sections", + "default_weight": 0.1 + }, + "status": "pass", + "score": 100.0, + "measured_value": "3/3 sections", + "threshold": "3/3 sections", + "evidence": [ + "Found 3/3 essential sections", + "Installation: \u2713", + "Usage: \u2713", + "Development: \u2713" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "type_annotations", + "name": "Type Annotations", + "category": "Code Quality", + "tier": 1, + "description": "Type hints in function signatures", + "criteria": ">80% of functions have type annotations", + "default_weight": 0.1 + }, + "status": "fail", + "score": 0.0, + "measured_value": "missing tsconfig.json", + "threshold": "strict mode enabled", + "evidence": [ + "tsconfig.json not found" + ], + "remediation": { + "summary": "Add type annotations to function signatures", + "steps": [ + "For Python: Add type hints to function parameters and return types", + "For TypeScript: Enable strict mode in tsconfig.json", + "Use mypy or pyright for Python type checking", + "Use tsc --strict for TypeScript", + "Add type annotations gradually to existing code" + ], + "tools": [ + "mypy", + "pyright", + "typescript" + ], + "commands": [ + "# Python", + "pip install mypy", + "mypy --strict src/", + "", + "# TypeScript", + "npm install --save-dev typescript", + "echo '{\"compilerOptions\": {\"strict\": true}}' > tsconfig.json" + ], + "examples": [ + "# Python - Before\ndef calculate(x, y):\n return x + y\n\n# Python - After\ndef calculate(x: float, y: float) -> float:\n return x + y\n", + "// TypeScript - tsconfig.json\n{\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true,\n \"strictNullChecks\": true\n }\n}\n" + ], + "citations": [ + { + "source": "Python.org", + "title": "Type Hints", + "url": "https://docs.python.org/3/library/typing.html", + "relevance": "Official Python type hints documentation" + }, + { + "source": "TypeScript", + "title": "TypeScript Handbook", + "url": "https://www.typescriptlang.org/docs/handbook/2/everyday-types.html", + "relevance": "TypeScript type system guide" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "standard_layout", + "name": "Standard Project Layouts", + "category": "Repository Structure", + "tier": 1, + "description": "Follows standard project structure for language", + "criteria": "Standard directories (src/ or project-named, tests/) present", + "default_weight": 0.1 + }, + "status": "fail", + "score": 0.0, + "measured_value": "0/2 directories", + "threshold": "2/2 directories", + "evidence": [ + "Found 0/2 standard directories", + "source directory: \u2717 (no src/ or project-named dir)", + "tests/: \u2717" + ], + "remediation": { + "summary": "Organize code into standard directories", + "steps": [ + "Create a source directory for your code", + "Option A: Use src/ layout (recommended for packages)", + "Option B: Use project-named directory (e.g., mypackage/)", + "Ensure your package has __init__.py", + "Create tests/ directory for test files", + "Add at least one test file" + ], + "tools": [], + "commands": [ + "# Option A: src layout", + "mkdir -p src/mypackage", + "touch src/mypackage/__init__.py", + "# ---", + "# Option B: flat layout (project-named)", + "mkdir -p mypackage", + "touch mypackage/__init__.py", + "# Create tests directory", + "mkdir -p tests", + "touch tests/__init__.py", + "touch tests/test_example.py" + ], + "examples": [ + "# src layout (recommended for distributable packages)\nproject/\n\u251c\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n\n# flat layout (common in major projects like pandas, numpy)\nproject/\n\u251c\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n" + ], + "citations": [ + { + "source": "Python Packaging Authority", + "title": "src layout vs flat layout", + "url": "https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/", + "relevance": "Official guidance on Python project layouts" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "lock_files", + "name": "Dependency Pinning for Reproducibility", + "category": "Dependency Management", + "tier": 1, + "description": "Dependencies pinned to exact versions in lock files", + "criteria": "Lock file with pinned versions, updated within 6 months", + "default_weight": 0.1 + }, + "status": "pass", + "score": 100.0, + "measured_value": "yarn.lock", + "threshold": "lock file with pinned versions, < 6 months old", + "evidence": [ + "Found lock file(s): yarn.lock" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "dependency_security", + "name": "Dependency Security & Vulnerability Scanning", + "category": "Security", + "tier": 1, + "description": "Security scanning tools configured for dependencies and code", + "criteria": "Dependabot, Renovate, CodeQL, or SAST tools configured; secret detection enabled", + "default_weight": 0.04 + }, + "status": "pass", + "score": 35, + "measured_value": "Security tools configured: Renovate", + "threshold": "\u226560 points (Dependabot/Renovate + SAST or multiple scanners)", + "evidence": [ + "\u2713 Renovate configured for dependency updates", + " Meaningful Renovate configuration detected" + ], + "remediation": { + "summary": "Add more security scanning tools for comprehensive coverage", + "steps": [ + "Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)", + "Add CodeQL scanning workflow for SAST", + "Configure secret detection (detect-secrets, gitleaks)", + "Set up language-specific scanners (pip-audit, npm audit, Snyk)" + ], + "tools": [ + "Dependabot", + "Renovate", + "CodeQL", + "detect-secrets", + "pip-audit", + "npm audit" + ], + "commands": [ + "gh repo edit --enable-security", + "pip install detect-secrets # Python secret detection", + "npm audit # JavaScript dependency audit" + ], + "examples": [ + "# .github/dependabot.yml\nversion: 2\nupdates:\n - package-ecosystem: pip\n directory: /\n schedule:\n interval: weekly" + ], + "citations": [ + { + "source": "OWASP", + "title": "Dependency-Check Project", + "url": "https://owasp.org/www-project-dependency-check/", + "relevance": "Open-source tool for detecting known vulnerabilities in dependencies" + }, + { + "source": "GitHub", + "title": "Dependabot Documentation", + "url": "https://docs.github.com/en/code-security/dependabot", + "relevance": "Official guide for configuring automated dependency updates and security alerts" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "test_coverage", + "name": "Test Coverage Requirements", + "category": "Testing & CI/CD", + "tier": 2, + "description": "Test coverage thresholds configured and enforced", + "criteria": ">80% code coverage", + "default_weight": 0.03 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "precommit_hooks", + "name": "Pre-commit Hooks & CI/CD Linting", + "category": "Testing & CI/CD", + "tier": 2, + "description": "Pre-commit hooks configured for linting and formatting", + "criteria": ".pre-commit-config.yaml exists", + "default_weight": 0.03 + }, + "status": "fail", + "score": 0.0, + "measured_value": "not configured", + "threshold": "configured", + "evidence": [ + ".pre-commit-config.yaml not found" + ], + "remediation": { + "summary": "Configure pre-commit hooks for automated code quality checks", + "steps": [ + "Install pre-commit framework", + "Create .pre-commit-config.yaml", + "Add hooks for linting and formatting", + "Install hooks: pre-commit install", + "Run on all files: pre-commit run --all-files" + ], + "tools": [ + "pre-commit" + ], + "commands": [ + "pip install pre-commit", + "pre-commit install", + "pre-commit run --all-files" + ], + "examples": [ + "# .pre-commit-config.yaml\nrepos:\n - repo: https://github.com/pre-commit/pre-commit-hooks\n rev: v4.4.0\n hooks:\n - id: trailing-whitespace\n - id: end-of-file-fixer\n - id: check-yaml\n - id: check-added-large-files\n\n - repo: https://github.com/psf/black\n rev: 23.3.0\n hooks:\n - id: black\n\n - repo: https://github.com/pycqa/isort\n rev: 5.12.0\n hooks:\n - id: isort\n" + ], + "citations": [ + { + "source": "pre-commit.com", + "title": "Pre-commit Framework", + "url": "https://pre-commit.com/", + "relevance": "Official pre-commit documentation" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "conventional_commits", + "name": "Conventional Commit Messages", + "category": "Git & Version Control", + "tier": 2, + "description": "Follows conventional commit format", + "criteria": "\u226580% of recent commits follow convention", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "configured", + "threshold": "configured", + "evidence": [ + "Commit linting configured" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "gitignore_completeness", + "name": ".gitignore Completeness", + "category": "Git & Version Control", + "tier": 2, + "description": "Comprehensive .gitignore file with language-specific patterns", + "criteria": ".gitignore exists and includes language-specific patterns from GitHub templates", + "default_weight": 0.03 + }, + "status": "fail", + "score": 63.63636363636363, + "measured_value": "7/11 patterns", + "threshold": "\u226570% of language-specific patterns", + "evidence": [ + ".gitignore found (322 bytes)", + "Pattern coverage: 7/11 (64%)", + "Missing 4 recommended patterns" + ], + "remediation": { + "summary": "Add missing language-specific ignore patterns", + "steps": [ + "Review GitHub's gitignore templates for your language", + "Add the 4 missing patterns", + "Ensure editor/IDE patterns are included" + ], + "tools": [], + "commands": [], + "examples": [ + "# Missing patterns:\n.npm/\n*.log\n*.tsbuildinfo\n*.swo" + ], + "citations": [ + { + "source": "GitHub", + "title": "gitignore Templates Collection", + "url": "https://github.com/github/gitignore", + "relevance": "Comprehensive collection of language-specific gitignore patterns" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "one_command_setup", + "name": "One-Command Build/Setup", + "category": "Build & Development", + "tier": 2, + "description": "Single command to set up development environment from fresh clone", + "criteria": "Single command (make setup, npm install, etc.) documented prominently", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100, + "measured_value": "yarn install", + "threshold": "single command", + "evidence": [ + "Setup command found in README: 'yarn install'", + "Setup automation found: package.json", + "Setup instructions in prominent location" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "file_size_limits", + "name": "File Size Limits", + "category": "Context Window Optimization", + "tier": 2, + "description": "Files are reasonably sized for AI context windows", + "criteria": "<5% of files >500 lines, no files >1000 lines", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "0 huge, 0 large out of 35", + "threshold": "<5% files >500 lines, 0 files >1000 lines", + "evidence": [ + "All 35 source files are <500 lines" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "separation_of_concerns", + "name": "Separation of Concerns", + "category": "Code Organization", + "tier": 2, + "description": "Code organized with single responsibility per module", + "criteria": "Feature-based organization, cohesive modules, low coupling", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "organization:100, cohesion:100, naming:100", + "threshold": "\u226575 overall", + "evidence": [ + "Good directory organization (feature-based or flat)", + "File cohesion: 0/0 files >500 lines", + "No catch-all modules (utils.py, helpers.py) detected" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "concise_documentation", + "name": "Concise Documentation", + "category": "Documentation", + "tier": 2, + "description": "Documentation maximizes information density while minimizing token consumption", + "criteria": "README <500 lines with clear structure, bullet points over prose", + "default_weight": 0.03 + }, + "status": "fail", + "score": 67.0, + "measured_value": "77 lines, 10 headings, 0 bullets", + "threshold": "<500 lines, structured format", + "evidence": [ + "README length: 77 lines (excellent)", + "Heading density: 13.0 per 100 lines (target: 3-5)", + "Only 0 bullet points (prefer bullets over prose)" + ], + "remediation": { + "summary": "Make documentation more concise and structured", + "steps": [ + "Break long README into multiple documents (docs/ directory)", + "Add clear Markdown headings (##, ###) for structure", + "Convert prose paragraphs to bullet points where possible", + "Add table of contents for documents >100 lines", + "Use code blocks instead of describing commands in prose", + "Move detailed content to wiki or docs/, keep README focused" + ], + "tools": [], + "commands": [ + "# Check README length", + "wc -l README.md", + "", + "# Count headings", + "grep -c '^#' README.md" + ], + "examples": [ + "# Good: Concise with structure\n\n## Quick Start\n```bash\npip install -e .\nagentready assess .\n```\n\n## Features\n- Fast repository scanning\n- HTML and Markdown reports\n- 25 agent-ready attributes\n\n## Documentation\nSee [docs/](docs/) for detailed guides.\n", + "# Bad: Verbose prose\n\nThis project is a tool that helps you assess your repository\nagainst best practices for AI-assisted development. It works by\nscanning your codebase and checking for various attributes that\nmake repositories more effective when working with AI coding\nassistants like Claude Code...\n\n[Many more paragraphs of prose...]\n" + ], + "citations": [ + { + "source": "ArXiv", + "title": "LongCodeBench: Evaluating Coding LLMs at 1M Context Windows", + "url": "https://arxiv.org/abs/2501.00343", + "relevance": "Research showing performance degradation with long contexts" + }, + { + "source": "Markdown Guide", + "title": "Basic Syntax", + "url": "https://www.markdownguide.org/basic-syntax/", + "relevance": "Best practices for Markdown formatting" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "inline_documentation", + "name": "Inline Documentation", + "category": "Documentation", + "tier": 2, + "description": "Function, class, and module-level documentation using language-specific conventions", + "criteria": "\u226580% of public functions/classes have docstrings", + "default_weight": 0.03 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "cyclomatic_complexity", + "name": "Cyclomatic Complexity Thresholds", + "category": "Code Quality", + "tier": 3, + "description": "Cyclomatic complexity thresholds enforced", + "criteria": "Average complexity <10, no functions >15", + "default_weight": 0.03 + }, + "status": "skipped", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Missing tool: lizard" + ], + "remediation": { + "summary": "Install with: pip install lizard", + "steps": [ + "Install with: pip install lizard" + ], + "tools": [], + "commands": [], + "examples": [], + "citations": [] + }, + "error_message": null + }, + { + "attribute": { + "id": "architecture_decisions", + "name": "Architecture Decision Records (ADRs)", + "category": "Documentation Standards", + "tier": 3, + "description": "Lightweight documents capturing architectural decisions", + "criteria": "ADR directory with documented decisions", + "default_weight": 0.015 + }, + "status": "fail", + "score": 0.0, + "measured_value": "no ADR directory", + "threshold": "ADR directory with decisions", + "evidence": [ + "No ADR directory found (checked docs/adr/, .adr/, adr/, docs/decisions/)" + ], + "remediation": { + "summary": "Create Architecture Decision Records (ADRs) directory and document key decisions", + "steps": [ + "Create docs/adr/ directory in repository root", + "Use Michael Nygard ADR template or MADR format", + "Document each significant architectural decision", + "Number ADRs sequentially (0001-*.md, 0002-*.md)", + "Include Status, Context, Decision, and Consequences sections", + "Update ADR status when decisions are revised (Superseded, Deprecated)" + ], + "tools": [ + "adr-tools", + "log4brains" + ], + "commands": [ + "# Create ADR directory", + "mkdir -p docs/adr", + "", + "# Create first ADR using template", + "cat > docs/adr/0001-use-architecture-decision-records.md << 'EOF'", + "# 1. Use Architecture Decision Records", + "", + "Date: 2025-11-22", + "", + "## Status", + "Accepted", + "", + "## Context", + "We need to record architectural decisions made in this project.", + "", + "## Decision", + "We will use Architecture Decision Records (ADRs) as described by Michael Nygard.", + "", + "## Consequences", + "- Decisions are documented with context", + "- Future contributors understand rationale", + "- ADRs are lightweight and version-controlled", + "EOF" + ], + "examples": [ + "# Example ADR Structure\n\n```markdown\n# 2. Use PostgreSQL for Database\n\nDate: 2025-11-22\n\n## Status\nAccepted\n\n## Context\nWe need a relational database for complex queries and ACID transactions.\nTeam has PostgreSQL experience. Need full-text search capabilities.\n\n## Decision\nUse PostgreSQL 15+ as primary database.\n\n## Consequences\n- Positive: Robust ACID, full-text search, team familiarity\n- Negative: Higher resource usage than SQLite\n- Neutral: Need to manage migrations, backups\n```\n" + ], + "citations": [ + { + "source": "Michael Nygard", + "title": "Documenting Architecture Decisions", + "url": "https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions", + "relevance": "Original ADR format and rationale" + }, + { + "source": "GitHub adr/madr", + "title": "Markdown ADR (MADR) Template", + "url": "https://github.com/adr/madr", + "relevance": "Modern ADR template with examples" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "issue_pr_templates", + "name": "Issue & Pull Request Templates", + "category": "Repository Structure", + "tier": 3, + "description": "Standardized templates for issues and PRs", + "criteria": "PR template and issue templates in .github/", + "default_weight": 0.015 + }, + "status": "fail", + "score": 0, + "measured_value": "PR:False, Issues:0", + "threshold": "PR template + \u22652 issue templates", + "evidence": [ + "No PR template found", + "No issue template directory found" + ], + "remediation": { + "summary": "Create GitHub issue and PR templates in .github/ directory", + "steps": [ + "Create .github/ directory if it doesn't exist", + "Add PULL_REQUEST_TEMPLATE.md for PRs", + "Create .github/ISSUE_TEMPLATE/ directory", + "Add bug_report.md for bug reports", + "Add feature_request.md for feature requests", + "Optionally add config.yml to configure template chooser" + ], + "tools": [ + "gh" + ], + "commands": [ + "# Create directories", + "mkdir -p .github/ISSUE_TEMPLATE", + "", + "# Create PR template", + "cat > .github/PULL_REQUEST_TEMPLATE.md << 'EOF'", + "## Summary", + "", + "", + "## Related Issues", + "Fixes #", + "", + "## Testing", + "- [ ] Tests added/updated", + "- [ ] All tests pass", + "", + "## Checklist", + "- [ ] Documentation updated", + "- [ ] CHANGELOG.md updated", + "EOF" + ], + "examples": [ + "# Bug Report Template (.github/ISSUE_TEMPLATE/bug_report.md)\n\n```markdown\n---\nname: Bug Report\nabout: Create a report to help us improve\ntitle: '[BUG] '\nlabels: bug\nassignees: ''\n---\n\n**Describe the bug**\nA clear description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce:\n1. Go to '...'\n2. Click on '....'\n3. See error\n\n**Expected behavior**\nWhat you expected to happen.\n\n**Environment**\n- OS: [e.g. macOS 13.0]\n- Version: [e.g. 1.0.0]\n```\n" + ], + "citations": [ + { + "source": "GitHub Docs", + "title": "About issue and pull request templates", + "url": "https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/about-issue-and-pull-request-templates", + "relevance": "Official GitHub guide for templates" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "cicd_pipeline_visibility", + "name": "CI/CD Pipeline Visibility", + "category": "Testing & CI/CD", + "tier": 3, + "description": "Clear, well-documented CI/CD configuration files", + "criteria": "CI config with descriptive names, caching, parallelization", + "default_weight": 0.015 + }, + "status": "fail", + "score": 70, + "measured_value": "basic config", + "threshold": "CI with best practices", + "evidence": [ + "CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml", + "Descriptive job/step names found", + "Caching configured", + "No parallelization detected" + ], + "remediation": { + "summary": "Add or improve CI/CD pipeline configuration", + "steps": [ + "Create CI config for your platform (GitHub Actions, GitLab CI, etc.)", + "Define jobs: lint, test, build", + "Use descriptive job and step names", + "Configure dependency caching", + "Enable parallel job execution", + "Upload artifacts: test results, coverage reports", + "Add status badge to README" + ], + "tools": [ + "github-actions", + "gitlab-ci", + "circleci" + ], + "commands": [ + "# Create GitHub Actions workflow", + "mkdir -p .github/workflows", + "touch .github/workflows/ci.yml", + "", + "# Validate workflow", + "gh workflow view ci.yml" + ], + "examples": [ + "# .github/workflows/ci.yml - Good example\n\nname: CI Pipeline\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n lint:\n name: Lint Code\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip' # Caching\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run linters\n run: |\n black --check .\n isort --check .\n ruff check .\n\n test:\n name: Run Tests\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip'\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run tests with coverage\n run: pytest --cov --cov-report=xml\n\n - name: Upload coverage reports\n uses: codecov/codecov-action@v3\n with:\n files: ./coverage.xml\n\n build:\n name: Build Package\n runs-on: ubuntu-latest\n needs: [lint, test] # Runs after lint/test pass\n steps:\n - uses: actions/checkout@v4\n\n - name: Build package\n run: python -m build\n\n - name: Upload build artifacts\n uses: actions/upload-artifact@v3\n with:\n name: dist\n path: dist/\n" + ], + "citations": [ + { + "source": "GitHub", + "title": "GitHub Actions Documentation", + "url": "https://docs.github.com/en/actions", + "relevance": "Official GitHub Actions guide" + }, + { + "source": "CircleCI", + "title": "CI/CD Best Practices", + "url": "https://circleci.com/blog/ci-cd-best-practices/", + "relevance": "Industry best practices for CI/CD" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "semantic_naming", + "name": "Semantic Naming", + "category": "Code Quality", + "tier": 3, + "description": "Systematic naming patterns following language conventions", + "criteria": "Language conventions followed, avoid generic names", + "default_weight": 0.015 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "structured_logging", + "name": "Structured Logging", + "category": "Code Quality", + "tier": 3, + "description": "Logging in structured format (JSON) with consistent fields", + "criteria": "Structured logging library configured (structlog, winston, zap)", + "default_weight": 0.015 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "openapi_specs", + "name": "OpenAPI/Swagger Specifications", + "category": "API Documentation", + "tier": 3, + "description": "Machine-readable API documentation in OpenAPI format", + "criteria": "OpenAPI 3.x spec with complete endpoint documentation", + "default_weight": 0.015 + }, + "status": "fail", + "score": 0.0, + "measured_value": "no OpenAPI spec", + "threshold": "OpenAPI 3.x spec present", + "evidence": [ + "No OpenAPI specification found", + "Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json" + ], + "remediation": { + "summary": "Create OpenAPI specification for API endpoints", + "steps": [ + "Create openapi.yaml in repository root", + "Define OpenAPI version 3.x", + "Document all API endpoints with full schemas", + "Add request/response examples", + "Define security schemes (API keys, OAuth, etc.)", + "Validate spec with Swagger Editor or Spectral", + "Generate API documentation with Swagger UI or ReDoc" + ], + "tools": [ + "swagger-editor", + "spectral", + "openapi-generator" + ], + "commands": [ + "# Install OpenAPI validator", + "npm install -g @stoplight/spectral-cli", + "", + "# Validate spec", + "spectral lint openapi.yaml", + "", + "# Generate client SDK", + "npx @openapitools/openapi-generator-cli generate \\", + " -i openapi.yaml \\", + " -g python \\", + " -o client/" + ], + "examples": [ + "# openapi.yaml - Minimal example\nopenapi: 3.1.0\ninfo:\n title: My API\n version: 1.0.0\n description: API for managing users\n\nservers:\n - url: https://api.example.com/v1\n\npaths:\n /users/{userId}:\n get:\n summary: Get user by ID\n parameters:\n - name: userId\n in: path\n required: true\n schema:\n type: string\n responses:\n '200':\n description: User found\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/User'\n '404':\n description: User not found\n\ncomponents:\n schemas:\n User:\n type: object\n required:\n - id\n - email\n properties:\n id:\n type: string\n example: \"user_123\"\n email:\n type: string\n format: email\n example: \"user@example.com\"\n name:\n type: string\n example: \"John Doe\"\n" + ], + "citations": [ + { + "source": "OpenAPI Initiative", + "title": "OpenAPI Specification", + "url": "https://spec.openapis.org/oas/v3.1.0", + "relevance": "Official OpenAPI 3.1 specification" + }, + { + "source": "Swagger", + "title": "API Documentation Best Practices", + "url": "https://swagger.io/resources/articles/best-practices-in-api-documentation/", + "relevance": "Guide to writing effective API docs" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "branch_protection", + "name": "Branch Protection Rules", + "category": "Git & Version Control", + "tier": 4, + "description": "Required status checks and review approvals before merging", + "criteria": "Branch protection enabled with status checks and required reviews", + "default_weight": 0.005 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements." + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "code_smells", + "name": "Code Smell Elimination", + "category": "Code Quality", + "tier": 4, + "description": "Linter configuration for detecting code smells and anti-patterns", + "criteria": "Language-specific linters configured (pylint, ESLint, RuboCop, etc.)", + "default_weight": 0.01 + }, + "status": "fail", + "score": 50.0, + "measured_value": "ESLint", + "threshold": "\u226560% of applicable linters configured", + "evidence": [ + "Linters configured: ESLint", + "Coverage: 20/40 points (50%)" + ], + "remediation": { + "summary": "Configure 2 missing linter(s)", + "steps": [ + "Add actionlint for GitHub Actions workflow validation", + "Configure markdownlint for documentation quality" + ], + "tools": [ + "actionlint", + "markdownlint" + ], + "commands": [ + "npm install --save-dev markdownlint-cli && touch .markdownlint.json" + ], + "examples": [ + "# .pylintrc example\n[MASTER]\nmax-line-length=100\n\n[MESSAGES CONTROL]\ndisable=C0111", + "# .eslintrc.json example\n{\n \"extends\": \"eslint:recommended\",\n \"rules\": {\n \"no-console\": \"warn\"\n }\n}" + ], + "citations": [ + { + "source": "Pylint", + "title": "Pylint Documentation", + "url": "https://pylint.readthedocs.io/", + "relevance": "Official documentation for Pylint code analysis tool" + }, + { + "source": "ESLint", + "title": "ESLint Documentation", + "url": "https://eslint.org/docs/latest/", + "relevance": "Official documentation for ESLint JavaScript/TypeScript linter" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "container_setup", + "name": "Container/Virtualization Setup", + "category": "Build & Development", + "tier": 4, + "description": "Container configuration for consistent development environments", + "criteria": "Dockerfile/Containerfile, docker-compose.yml, .dockerignore, multi-stage builds", + "default_weight": 0.01 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + } + ], + "config": { + "weights": {}, + "excluded_attributes": [], + "language_overrides": {}, + "output_dir": null, + "report_theme": "default", + "custom_theme": null + }, + "duration_seconds": 7.3, + "discovered_skills": [] +} \ No newline at end of file diff --git a/docs/agentready-baseline/assessment-latest.json b/docs/agentready-baseline/assessment-latest.json new file mode 120000 index 0000000..1d00028 --- /dev/null +++ b/docs/agentready-baseline/assessment-latest.json @@ -0,0 +1 @@ +assessment-20260409-161920.json \ No newline at end of file diff --git a/docs/agentready-baseline/report-20260409-161920.html b/docs/agentready-baseline/report-20260409-161920.html new file mode 100644 index 0000000..7206035 --- /dev/null +++ b/docs/agentready-baseline/report-20260409-161920.html @@ -0,0 +1,2889 @@ + + + + + + + AgentReady Assessment - react-user-feedback + + + + +
+ + +
+ +
+
+

🤖 AgentReady Assessment Report

+
+
+

react-user-feedback

+
📁 ~/Projects/react-user-feedback
+
🌿 main @ 402ab419
+
+ +
+
Assessed: April 09, 2026 at 4:19 PM
+
AgentReady: v2.30.1
+
Run by: nthoen@nthoen-mac
+
+ +
+
+ + +
+
+

Overall Score

+
45.9
+
+
+

Certification

+
Bronze
+
+
+

Assessed

+
18/25
+
+
+

Duration

+
7.3s
+
+
+ + +
+
+

💎 Platinum

+

90-100

+
+
+

🥇 Gold

+

75-89

+
+
+

🥈 Silver

+

60-74

+
+
+

🥉 Bronze

+

40-59

+
+
+

⚠️ Needs Work

+

0-39

+
+
+ + +
+
+ + + + + +
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + ❌ + + +
+

CLAUDE.md Configuration Files

+
+ Context Window Optimization • + Tier 1 + • missing +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • CLAUDE.md not found in repository root
  • + +
  • AGENTS.md not found (alternative)
  • + +
+
+ + + +
+

Remediation

+

Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants

+ + +
    + +
  1. Choose one of three approaches:
  2. + +
  3. Option 1: Create standalone CLAUDE.md (>50 bytes) with project context
  4. + +
  5. Option 2: Create AGENTS.md and symlink CLAUDE.md to it (cross-tool compatibility)
  6. + +
  7. Option 3: Create AGENTS.md and reference it with @AGENTS.md in minimal CLAUDE.md
  8. + +
  9. Add project overview and purpose
  10. + +
  11. Document key architectural patterns
  12. + +
  13. Specify coding standards and conventions
  14. + +
  15. Include build/test/deployment commands
  16. + +
  17. Add any project-specific context that helps AI assistants
  18. + +
+ + + +

Commands

+
# Option 1: Standalone CLAUDE.md
+touch CLAUDE.md
+# Add content describing your project
+
+# Option 2: Symlink CLAUDE.md to AGENTS.md
+touch AGENTS.md
+# Add content to AGENTS.md
+ln -s AGENTS.md CLAUDE.md
+
+# Option 3: @ reference in CLAUDE.md
+echo '@AGENTS.md' > CLAUDE.md
+touch AGENTS.md
+# Add content to AGENTS.md
+ + + +

Examples

+ +
# Standalone CLAUDE.md (Option 1)
+
+## Overview
+Brief description of what this project does.
+
+## Architecture
+Key patterns and structure.
+
+## Development
+```bash
+# Install dependencies
+npm install
+
+# Run tests
+npm test
+
+# Build
+npm run build
+```
+
+## Coding Standards
+- Use TypeScript strict mode
+- Follow ESLint configuration
+- Write tests for new features
+
+ +
# CLAUDE.md with @ reference (Option 3)
+@AGENTS.md
+
+ +
# AGENTS.md (shared by multiple tools)
+
+## Project Overview
+This project implements a REST API for user management.
+
+## Architecture
+- Layered architecture: controllers, services, repositories
+- PostgreSQL database with SQLAlchemy ORM
+- FastAPI web framework
+
+## Development Workflow
+```bash
+# Setup
+python -m venv .venv
+source .venv/bin/activate
+pip install -e .
+
+# Run tests
+pytest
+
+# Start server
+uvicorn app.main:app --reload
+```
+
+## Code Conventions
+- Use type hints for all functions
+- Follow PEP 8 style guide
+- Write docstrings for public APIs
+- Maintain >80% test coverage
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ✅ + + +
+

README Structure

+
+ Documentation Standards • + Tier 1 + • 3/3 sections +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Found 3/3 essential sections
  • + +
  • Installation: ✓
  • + +
  • Usage: ✓
  • + +
  • Development: ✓
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Type Annotations

+
+ Code Quality • + Tier 1 + • missing tsconfig.json +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • tsconfig.json not found
  • + +
+
+ + + +
+

Remediation

+

Add type annotations to function signatures

+ + +
    + +
  1. For Python: Add type hints to function parameters and return types
  2. + +
  3. For TypeScript: Enable strict mode in tsconfig.json
  4. + +
  5. Use mypy or pyright for Python type checking
  6. + +
  7. Use tsc --strict for TypeScript
  8. + +
  9. Add type annotations gradually to existing code
  10. + +
+ + + +

Commands

+
# Python
+pip install mypy
+mypy --strict src/
+
+# TypeScript
+npm install --save-dev typescript
+echo '{"compilerOptions": {"strict": true}}' > tsconfig.json
+ + + +

Examples

+ +
# Python - Before
+def calculate(x, y):
+    return x + y
+
+# Python - After
+def calculate(x: float, y: float) -> float:
+    return x + y
+
+ +
// TypeScript - tsconfig.json
+{
+  "compilerOptions": {
+    "strict": true,
+    "noImplicitAny": true,
+    "strictNullChecks": true
+  }
+}
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Standard Project Layouts

+
+ Repository Structure • + Tier 1 + • 0/2 directories +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Found 0/2 standard directories
  • + +
  • source directory: ✗ (no src/ or project-named dir)
  • + +
  • tests/: ✗
  • + +
+
+ + + +
+

Remediation

+

Organize code into standard directories

+ + +
    + +
  1. Create a source directory for your code
  2. + +
  3. Option A: Use src/ layout (recommended for packages)
  4. + +
  5. Option B: Use project-named directory (e.g., mypackage/)
  6. + +
  7. Ensure your package has __init__.py
  8. + +
  9. Create tests/ directory for test files
  10. + +
  11. Add at least one test file
  12. + +
+ + + +

Commands

+
# Option A: src layout
+mkdir -p src/mypackage
+touch src/mypackage/__init__.py
+# ---
+# Option B: flat layout (project-named)
+mkdir -p mypackage
+touch mypackage/__init__.py
+# Create tests directory
+mkdir -p tests
+touch tests/__init__.py
+touch tests/test_example.py
+ + + +

Examples

+ +
# src layout (recommended for distributable packages)
+project/
+├── src/
+│   └── mypackage/
+│       ├── __init__.py
+│       └── module.py
+├── tests/
+│   └── test_module.py
+└── pyproject.toml
+
+# flat layout (common in major projects like pandas, numpy)
+project/
+├── mypackage/
+│   ├── __init__.py
+│   └── module.py
+├── tests/
+│   └── test_module.py
+└── pyproject.toml
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Dependency Pinning for Reproducibility

+
+ Dependency Management • + Tier 1 + • yarn.lock +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Found lock file(s): yarn.lock
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Dependency Security & Vulnerability Scanning

+
+ Security • + Tier 1 + • Security tools configured: Renovate +
+
+
+ +
+ 35 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • ✓ Renovate configured for dependency updates
  • + +
  • Meaningful Renovate configuration detected
  • + +
+
+ + + +
+

Remediation

+

Add more security scanning tools for comprehensive coverage

+ + +
    + +
  1. Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)
  2. + +
  3. Add CodeQL scanning workflow for SAST
  4. + +
  5. Configure secret detection (detect-secrets, gitleaks)
  6. + +
  7. Set up language-specific scanners (pip-audit, npm audit, Snyk)
  8. + +
+ + + +

Commands

+
gh repo edit --enable-security
+pip install detect-secrets  # Python secret detection
+npm audit  # JavaScript dependency audit
+ + + +

Examples

+ +
# .github/dependabot.yml
+version: 2
+updates:
+  - package-ecosystem: pip
+    directory: /
+    schedule:
+      interval: weekly
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Test Coverage Requirements

+
+ Testing & CI/CD • + Tier 2 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Pre-commit Hooks & CI/CD Linting

+
+ Testing & CI/CD • + Tier 2 + • not configured +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • .pre-commit-config.yaml not found
  • + +
+
+ + + +
+

Remediation

+

Configure pre-commit hooks for automated code quality checks

+ + +
    + +
  1. Install pre-commit framework
  2. + +
  3. Create .pre-commit-config.yaml
  4. + +
  5. Add hooks for linting and formatting
  6. + +
  7. Install hooks: pre-commit install
  8. + +
  9. Run on all files: pre-commit run --all-files
  10. + +
+ + + +

Commands

+
pip install pre-commit
+pre-commit install
+pre-commit run --all-files
+ + + +

Examples

+ +
# .pre-commit-config.yaml
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.4.0
+    hooks:
+      - id: trailing-whitespace
+      - id: end-of-file-fixer
+      - id: check-yaml
+      - id: check-added-large-files
+
+  - repo: https://github.com/psf/black
+    rev: 23.3.0
+    hooks:
+      - id: black
+
+  - repo: https://github.com/pycqa/isort
+    rev: 5.12.0
+    hooks:
+      - id: isort
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Conventional Commit Messages

+
+ Git & Version Control • + Tier 2 + • configured +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Commit linting configured
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

.gitignore Completeness

+
+ Git & Version Control • + Tier 2 + • 7/11 patterns +
+
+
+ +
+ 64 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • .gitignore found (322 bytes)
  • + +
  • Pattern coverage: 7/11 (64%)
  • + +
  • Missing 4 recommended patterns
  • + +
+
+ + + +
+

Remediation

+

Add missing language-specific ignore patterns

+ + +
    + +
  1. Review GitHub's gitignore templates for your language
  2. + +
  3. Add the 4 missing patterns
  4. + +
  5. Ensure editor/IDE patterns are included
  6. + +
+ + + + + +

Examples

+ +
# Missing patterns:
+.npm/
+*.log
+*.tsbuildinfo
+*.swo
+ + +
+ + + +
+
+ +
+ +
+
+ + ✅ + + +
+

One-Command Build/Setup

+
+ Build & Development • + Tier 2 + • yarn install +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Setup command found in README: 'yarn install'
  • + +
  • Setup automation found: package.json
  • + +
  • Setup instructions in prominent location
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

File Size Limits

+
+ Context Window Optimization • + Tier 2 + • 0 huge, 0 large out of 35 +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • All 35 source files are <500 lines
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Separation of Concerns

+
+ Code Organization • + Tier 2 + • organization:100, cohesion:100, naming:100 +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Good directory organization (feature-based or flat)
  • + +
  • File cohesion: 0/0 files >500 lines
  • + +
  • No catch-all modules (utils.py, helpers.py) detected
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Concise Documentation

+
+ Documentation • + Tier 2 + • 77 lines, 10 headings, 0 bullets +
+
+
+ +
+ 67 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • README length: 77 lines (excellent)
  • + +
  • Heading density: 13.0 per 100 lines (target: 3-5)
  • + +
  • Only 0 bullet points (prefer bullets over prose)
  • + +
+
+ + + +
+

Remediation

+

Make documentation more concise and structured

+ + +
    + +
  1. Break long README into multiple documents (docs/ directory)
  2. + +
  3. Add clear Markdown headings (##, ###) for structure
  4. + +
  5. Convert prose paragraphs to bullet points where possible
  6. + +
  7. Add table of contents for documents >100 lines
  8. + +
  9. Use code blocks instead of describing commands in prose
  10. + +
  11. Move detailed content to wiki or docs/, keep README focused
  12. + +
+ + + +

Commands

+
# Check README length
+wc -l README.md
+
+# Count headings
+grep -c '^#' README.md
+ + + +

Examples

+ +
# Good: Concise with structure
+
+## Quick Start
+```bash
+pip install -e .
+agentready assess .
+```
+
+## Features
+- Fast repository scanning
+- HTML and Markdown reports
+- 25 agent-ready attributes
+
+## Documentation
+See [docs/](docs/) for detailed guides.
+
+ +
# Bad: Verbose prose
+
+This project is a tool that helps you assess your repository
+against best practices for AI-assisted development. It works by
+scanning your codebase and checking for various attributes that
+make repositories more effective when working with AI coding
+assistants like Claude Code...
+
+[Many more paragraphs of prose...]
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Inline Documentation

+
+ Documentation • + Tier 2 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Cyclomatic Complexity Thresholds

+
+ Code Quality • + Tier 3 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Missing tool: lizard
  • + +
+
+ + + +
+

Remediation

+

Install with: pip install lizard

+ + +
    + +
  1. Install with: pip install lizard
  2. + +
+ + + + + +
+ + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Architecture Decision Records (ADRs)

+
+ Documentation Standards • + Tier 3 + • no ADR directory +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • No ADR directory found (checked docs/adr/, .adr/, adr/, docs/decisions/)
  • + +
+
+ + + +
+

Remediation

+

Create Architecture Decision Records (ADRs) directory and document key decisions

+ + +
    + +
  1. Create docs/adr/ directory in repository root
  2. + +
  3. Use Michael Nygard ADR template or MADR format
  4. + +
  5. Document each significant architectural decision
  6. + +
  7. Number ADRs sequentially (0001-*.md, 0002-*.md)
  8. + +
  9. Include Status, Context, Decision, and Consequences sections
  10. + +
  11. Update ADR status when decisions are revised (Superseded, Deprecated)
  12. + +
+ + + +

Commands

+
# Create ADR directory
+mkdir -p docs/adr
+
+# Create first ADR using template
+cat > docs/adr/0001-use-architecture-decision-records.md << 'EOF'
+# 1. Use Architecture Decision Records
+
+Date: 2025-11-22
+
+## Status
+Accepted
+
+## Context
+We need to record architectural decisions made in this project.
+
+## Decision
+We will use Architecture Decision Records (ADRs) as described by Michael Nygard.
+
+## Consequences
+- Decisions are documented with context
+- Future contributors understand rationale
+- ADRs are lightweight and version-controlled
+EOF
+ + + +

Examples

+ +
# Example ADR Structure
+
+```markdown
+# 2. Use PostgreSQL for Database
+
+Date: 2025-11-22
+
+## Status
+Accepted
+
+## Context
+We need a relational database for complex queries and ACID transactions.
+Team has PostgreSQL experience. Need full-text search capabilities.
+
+## Decision
+Use PostgreSQL 15+ as primary database.
+
+## Consequences
+- Positive: Robust ACID, full-text search, team familiarity
+- Negative: Higher resource usage than SQLite
+- Neutral: Need to manage migrations, backups
+```
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Issue & Pull Request Templates

+
+ Repository Structure • + Tier 3 + • PR:False, Issues:0 +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • No PR template found
  • + +
  • No issue template directory found
  • + +
+
+ + + +
+

Remediation

+

Create GitHub issue and PR templates in .github/ directory

+ + +
    + +
  1. Create .github/ directory if it doesn't exist
  2. + +
  3. Add PULL_REQUEST_TEMPLATE.md for PRs
  4. + +
  5. Create .github/ISSUE_TEMPLATE/ directory
  6. + +
  7. Add bug_report.md for bug reports
  8. + +
  9. Add feature_request.md for feature requests
  10. + +
  11. Optionally add config.yml to configure template chooser
  12. + +
+ + + +

Commands

+
# Create directories
+mkdir -p .github/ISSUE_TEMPLATE
+
+# Create PR template
+cat > .github/PULL_REQUEST_TEMPLATE.md << 'EOF'
+## Summary
+<!-- Describe the changes in this PR -->
+
+## Related Issues
+Fixes #
+
+## Testing
+- [ ] Tests added/updated
+- [ ] All tests pass
+
+## Checklist
+- [ ] Documentation updated
+- [ ] CHANGELOG.md updated
+EOF
+ + + +

Examples

+ +
# Bug Report Template (.github/ISSUE_TEMPLATE/bug_report.md)
+
+```markdown
+---
+name: Bug Report
+about: Create a report to help us improve
+title: '[BUG] '
+labels: bug
+assignees: ''
+---
+
+**Describe the bug**
+A clear description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce:
+1. Go to '...'
+2. Click on '....'
+3. See error
+
+**Expected behavior**
+What you expected to happen.
+
+**Environment**
+- OS: [e.g. macOS 13.0]
+- Version: [e.g. 1.0.0]
+```
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ❌ + + +
+

CI/CD Pipeline Visibility

+
+ Testing & CI/CD • + Tier 3 + • basic config +
+
+
+ +
+ 70 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml
  • + +
  • Descriptive job/step names found
  • + +
  • Caching configured
  • + +
  • No parallelization detected
  • + +
+
+ + + +
+

Remediation

+

Add or improve CI/CD pipeline configuration

+ + +
    + +
  1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.)
  2. + +
  3. Define jobs: lint, test, build
  4. + +
  5. Use descriptive job and step names
  6. + +
  7. Configure dependency caching
  8. + +
  9. Enable parallel job execution
  10. + +
  11. Upload artifacts: test results, coverage reports
  12. + +
  13. Add status badge to README
  14. + +
+ + + +

Commands

+
# Create GitHub Actions workflow
+mkdir -p .github/workflows
+touch .github/workflows/ci.yml
+
+# Validate workflow
+gh workflow view ci.yml
+ + + +

Examples

+ +
# .github/workflows/ci.yml - Good example
+
+name: CI Pipeline
+
+on:
+  push:
+    branches: [main]
+  pull_request:
+    branches: [main]
+
+jobs:
+  lint:
+    name: Lint Code
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: '3.11'
+          cache: 'pip'  # Caching
+
+      - name: Install dependencies
+        run: pip install -r requirements.txt
+
+      - name: Run linters
+        run: |
+          black --check .
+          isort --check .
+          ruff check .
+
+  test:
+    name: Run Tests
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: '3.11'
+          cache: 'pip'
+
+      - name: Install dependencies
+        run: pip install -r requirements.txt
+
+      - name: Run tests with coverage
+        run: pytest --cov --cov-report=xml
+
+      - name: Upload coverage reports
+        uses: codecov/codecov-action@v3
+        with:
+          files: ./coverage.xml
+
+  build:
+    name: Build Package
+    runs-on: ubuntu-latest
+    needs: [lint, test]  # Runs after lint/test pass
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Build package
+        run: python -m build
+
+      - name: Upload build artifacts
+        uses: actions/upload-artifact@v3
+        with:
+          name: dist
+          path: dist/
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Semantic Naming

+
+ Code Quality • + Tier 3 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Structured Logging

+
+ Code Quality • + Tier 3 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

OpenAPI/Swagger Specifications

+
+ API Documentation • + Tier 3 + • no OpenAPI spec +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • No OpenAPI specification found
  • + +
  • Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json
  • + +
+
+ + + +
+

Remediation

+

Create OpenAPI specification for API endpoints

+ + +
    + +
  1. Create openapi.yaml in repository root
  2. + +
  3. Define OpenAPI version 3.x
  4. + +
  5. Document all API endpoints with full schemas
  6. + +
  7. Add request/response examples
  8. + +
  9. Define security schemes (API keys, OAuth, etc.)
  10. + +
  11. Validate spec with Swagger Editor or Spectral
  12. + +
  13. Generate API documentation with Swagger UI or ReDoc
  14. + +
+ + + +

Commands

+
# Install OpenAPI validator
+npm install -g @stoplight/spectral-cli
+
+# Validate spec
+spectral lint openapi.yaml
+
+# Generate client SDK
+npx @openapitools/openapi-generator-cli generate \
+  -i openapi.yaml \
+  -g python \
+  -o client/
+ + + +

Examples

+ +
# openapi.yaml - Minimal example
+openapi: 3.1.0
+info:
+  title: My API
+  version: 1.0.0
+  description: API for managing users
+
+servers:
+  - url: https://api.example.com/v1
+
+paths:
+  /users/{userId}:
+    get:
+      summary: Get user by ID
+      parameters:
+        - name: userId
+          in: path
+          required: true
+          schema:
+            type: string
+      responses:
+        '200':
+          description: User found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/User'
+        '404':
+          description: User not found
+
+components:
+  schemas:
+    User:
+      type: object
+      required:
+        - id
+        - email
+      properties:
+        id:
+          type: string
+          example: "user_123"
+        email:
+          type: string
+          format: email
+          example: "user@example.com"
+        name:
+          type: string
+          example: "John Doe"
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Branch Protection Rules

+
+ Git & Version Control • + Tier 4 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements.
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Code Smell Elimination

+
+ Code Quality • + Tier 4 + • ESLint +
+
+
+ +
+ 50 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Linters configured: ESLint
  • + +
  • Coverage: 20/40 points (50%)
  • + +
+
+ + + +
+

Remediation

+

Configure 2 missing linter(s)

+ + +
    + +
  1. Add actionlint for GitHub Actions workflow validation
  2. + +
  3. Configure markdownlint for documentation quality
  4. + +
+ + + +

Commands

+
npm install --save-dev markdownlint-cli && touch .markdownlint.json
+ + + +

Examples

+ +
# .pylintrc example
+[MASTER]
+max-line-length=100
+
+[MESSAGES CONTROL]
+disable=C0111
+ +
# .eslintrc.json example
+{
+  "extends": "eslint:recommended",
+  "rules": {
+    "no-console": "warn"
+  }
+}
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Container/Virtualization Setup

+
+ Build & Development • + Tier 4 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+ +

Generated by AgentReady v2.30.1 (Research v1.0.1)

+

Repository: ~/Projects/react-user-feedback • Branch: main • Commit: 402ab419

+

Assessed by nthoen@nthoen-mac on April 09, 2026 at 4:19 PM

+ +

+ 🤖 Generated with Claude Code +

+
+
+ + + + \ No newline at end of file diff --git a/docs/agentready-baseline/report-20260409-161920.md b/docs/agentready-baseline/report-20260409-161920.md new file mode 100644 index 0000000..42efbc9 --- /dev/null +++ b/docs/agentready-baseline/report-20260409-161920.md @@ -0,0 +1,844 @@ +# 🤖 AgentReady Assessment Report + +**Repository**: react-user-feedback +**Path**: `/Users/nthoen/Projects/react-user-feedback` +**Branch**: `main` | **Commit**: `402ab419` +**Assessed**: April 09, 2026 at 4:19 PM +**AgentReady Version**: 2.30.1 +**Run by**: nthoen@nthoen-mac + +--- + +## 📊 Summary + +| Metric | Value | +|--------|-------| +| **Overall Score** | **45.9/100** 🥉 **Bronze** ([Tier Definitions](https://agentready.dev/attributes.html#tier-system)) | +| **Attributes Assessed** | 18/25 | +| **Attributes Not Assessed** | 7 | +| **Assessment Duration** | 7.3s | + +### Languages Detected + +- **JavaScript**: 20 files +- **TypeScript**: 15 files +- **JSON**: 8 files +- **YAML**: 6 files +- **Markdown**: 3 files + +### Repository Stats + +- **Total Files**: 74 +- **Total Lines**: 25,342 + +## 🎯 Priority Improvements + +Focus on these high-impact fixes first: + +1. **CLAUDE.md Configuration Files** (Tier 1) - +10.0 points potential + - Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants +2. **Type Annotations** (Tier 1) - +10.0 points potential + - Add type annotations to function signatures +3. **Standard Project Layouts** (Tier 1) - +10.0 points potential + - Organize code into standard directories +4. **Pre-commit Hooks & CI/CD Linting** (Tier 2) - +3.0 points potential + - Configure pre-commit hooks for automated code quality checks +5. **.gitignore Completeness** (Tier 2) - +3.0 points potential + - Add missing language-specific ignore patterns + +## 📋 Detailed Findings + +Findings sorted by priority (Tier 1 failures first, then Tier 2, etc.) + +![T1](https://img.shields.io/badge/T1-CLAUDE.md_Configuration_Files_0--100-red) **CLAUDE.md Configuration Files** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: missing (Threshold: present) + +**Evidence**: +- CLAUDE.md not found in repository root +- AGENTS.md not found (alternative) + +Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants + +1. Choose one of three approaches: +2. Option 1: Create standalone CLAUDE.md (>50 bytes) with project context +3. Option 2: Create AGENTS.md and symlink CLAUDE.md to it (cross-tool compatibility) +4. Option 3: Create AGENTS.md and reference it with @AGENTS.md in minimal CLAUDE.md +5. Add project overview and purpose +6. Document key architectural patterns +7. Specify coding standards and conventions +8. Include build/test/deployment commands +9. Add any project-specific context that helps AI assistants + +**Commands**: +```bash +# Option 1: Standalone CLAUDE.md +touch CLAUDE.md +# Add content describing your project + +# Option 2: Symlink CLAUDE.md to AGENTS.md +touch AGENTS.md +# Add content to AGENTS.md +ln -s AGENTS.md CLAUDE.md + +# Option 3: @ reference in CLAUDE.md +echo '@AGENTS.md' > CLAUDE.md +touch AGENTS.md +# Add content to AGENTS.md +``` + +**Examples**: +``` +# Standalone CLAUDE.md (Option 1) + +## Overview +Brief description of what this project does. + +## Architecture +Key patterns and structure. + +## Development +```bash +# Install dependencies +npm install + +# Run tests +npm test + +# Build +npm run build +``` + +## Coding Standards +- Use TypeScript strict mode +- Follow ESLint configuration +- Write tests for new features + +``` +``` +# CLAUDE.md with @ reference (Option 3) +@AGENTS.md + +``` +``` +# AGENTS.md (shared by multiple tools) + +## Project Overview +This project implements a REST API for user management. + +## Architecture +- Layered architecture: controllers, services, repositories +- PostgreSQL database with SQLAlchemy ORM +- FastAPI web framework + +## Development Workflow +```bash +# Setup +python -m venv .venv +source .venv/bin/activate +pip install -e . + +# Run tests +pytest + +# Start server +uvicorn app.main:app --reload +``` + +## Code Conventions +- Use type hints for all functions +- Follow PEP 8 style guide +- Write docstrings for public APIs +- Maintain >80% test coverage + +``` + +
+ +![T1](https://img.shields.io/badge/T1-Type_Annotations_0--100-red) **Type Annotations** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: missing tsconfig.json (Threshold: strict mode enabled) + +**Evidence**: +- tsconfig.json not found + +Add type annotations to function signatures + +1. For Python: Add type hints to function parameters and return types +2. For TypeScript: Enable strict mode in tsconfig.json +3. Use mypy or pyright for Python type checking +4. Use tsc --strict for TypeScript +5. Add type annotations gradually to existing code + +**Commands**: +```bash +# Python +pip install mypy +mypy --strict src/ + +# TypeScript +npm install --save-dev typescript +echo '{"compilerOptions": {"strict": true}}' > tsconfig.json +``` + +**Examples**: +``` +# Python - Before +def calculate(x, y): + return x + y + +# Python - After +def calculate(x: float, y: float) -> float: + return x + y + +``` +``` +// TypeScript - tsconfig.json +{ + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true + } +} + +``` + +
+ +![T1](https://img.shields.io/badge/T1-Standard_Project_Layouts_0--100-red) **Standard Project Layouts** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: 0/2 directories (Threshold: 2/2 directories) + +**Evidence**: +- Found 0/2 standard directories +- source directory: ✗ (no src/ or project-named dir) +- tests/: ✗ + +Organize code into standard directories + +1. Create a source directory for your code +2. Option A: Use src/ layout (recommended for packages) +3. Option B: Use project-named directory (e.g., mypackage/) +4. Ensure your package has __init__.py +5. Create tests/ directory for test files +6. Add at least one test file + +**Commands**: +```bash +# Option A: src layout +mkdir -p src/mypackage +touch src/mypackage/__init__.py +# --- +# Option B: flat layout (project-named) +mkdir -p mypackage +touch mypackage/__init__.py +# Create tests directory +mkdir -p tests +touch tests/__init__.py +touch tests/test_example.py +``` + +**Examples**: +``` +# src layout (recommended for distributable packages) +project/ +├── src/ +│ └── mypackage/ +│ ├── __init__.py +│ └── module.py +├── tests/ +│ └── test_module.py +└── pyproject.toml + +# flat layout (common in major projects like pandas, numpy) +project/ +├── mypackage/ +│ ├── __init__.py +│ └── module.py +├── tests/ +│ └── test_module.py +└── pyproject.toml + +``` + +
+ +![T1](https://img.shields.io/badge/T1-Dependency_Security_%26_Vulnerability_Scanning_35--100-green) **Dependency Security & Vulnerability Scanning** ✅ 35/100 + +![T1](https://img.shields.io/badge/T1-README_Structure_100--100-green) **README Structure** ✅ 100/100 + +![T1](https://img.shields.io/badge/T1-Dependency_Pinning_for_Reproducibility_100--100-green) **Dependency Pinning for Reproducibility** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-Pre-commit_Hooks_%26_CI%2FCD_Linting_0--100-red) **Pre-commit Hooks & CI/CD Linting** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: not configured (Threshold: configured) + +**Evidence**: +- .pre-commit-config.yaml not found + +Configure pre-commit hooks for automated code quality checks + +1. Install pre-commit framework +2. Create .pre-commit-config.yaml +3. Add hooks for linting and formatting +4. Install hooks: pre-commit install +5. Run on all files: pre-commit run --all-files + +**Commands**: +```bash +pip install pre-commit +pre-commit install +pre-commit run --all-files +``` + +**Examples**: +``` +# .pre-commit-config.yaml +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + +``` + +
+ +![T2](https://img.shields.io/badge/T2-.gitignore_Completeness_64--100-red) **.gitignore Completeness** ❌ 64/100 +
+📝 Remediation Steps + +**Measured**: 7/11 patterns (Threshold: ≥70% of language-specific patterns) + +**Evidence**: +- .gitignore found (322 bytes) +- Pattern coverage: 7/11 (64%) +- Missing 4 recommended patterns + +Add missing language-specific ignore patterns + +1. Review GitHub's gitignore templates for your language +2. Add the 4 missing patterns +3. Ensure editor/IDE patterns are included + +**Examples**: +``` +# Missing patterns: +.npm/ +*.log +*.tsbuildinfo +*.swo +``` + +
+ +![T2](https://img.shields.io/badge/T2-Concise_Documentation_67--100-red) **Concise Documentation** ❌ 67/100 +
+📝 Remediation Steps + +**Measured**: 77 lines, 10 headings, 0 bullets (Threshold: <500 lines, structured format) + +**Evidence**: +- README length: 77 lines (excellent) +- Heading density: 13.0 per 100 lines (target: 3-5) +- Only 0 bullet points (prefer bullets over prose) + +Make documentation more concise and structured + +1. Break long README into multiple documents (docs/ directory) +2. Add clear Markdown headings (##, ###) for structure +3. Convert prose paragraphs to bullet points where possible +4. Add table of contents for documents >100 lines +5. Use code blocks instead of describing commands in prose +6. Move detailed content to wiki or docs/, keep README focused + +**Commands**: +```bash +# Check README length +wc -l README.md + +# Count headings +grep -c '^#' README.md +``` + +**Examples**: +``` +# Good: Concise with structure + +## Quick Start +```bash +pip install -e . +agentready assess . +``` + +## Features +- Fast repository scanning +- HTML and Markdown reports +- 25 agent-ready attributes + +## Documentation +See [docs/](docs/) for detailed guides. + +``` +``` +# Bad: Verbose prose + +This project is a tool that helps you assess your repository +against best practices for AI-assisted development. It works by +scanning your codebase and checking for various attributes that +make repositories more effective when working with AI coding +assistants like Claude Code... + +[Many more paragraphs of prose...] + +``` + +
+ +![T2](https://img.shields.io/badge/T2-Conventional_Commit_Messages_100--100-green) **Conventional Commit Messages** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-One-Command_Build%2FSetup_100--100-green) **One-Command Build/Setup** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-File_Size_Limits_100--100-green) **File Size Limits** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-Separation_of_Concerns_100--100-green) **Separation of Concerns** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-Test_Coverage_Requirements_N--A-lightgray) **Test Coverage Requirements** ⊘ + +![T2](https://img.shields.io/badge/T2-Inline_Documentation_N--A-lightgray) **Inline Documentation** ⊘ + +![T3](https://img.shields.io/badge/T3-Architecture_Decision_Records_%28ADRs%29_0--100-red) **Architecture Decision Records (ADRs)** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: no ADR directory (Threshold: ADR directory with decisions) + +**Evidence**: +- No ADR directory found (checked docs/adr/, .adr/, adr/, docs/decisions/) + +Create Architecture Decision Records (ADRs) directory and document key decisions + +1. Create docs/adr/ directory in repository root +2. Use Michael Nygard ADR template or MADR format +3. Document each significant architectural decision +4. Number ADRs sequentially (0001-*.md, 0002-*.md) +5. Include Status, Context, Decision, and Consequences sections +6. Update ADR status when decisions are revised (Superseded, Deprecated) + +**Commands**: +```bash +# Create ADR directory +mkdir -p docs/adr + +# Create first ADR using template +cat > docs/adr/0001-use-architecture-decision-records.md << 'EOF' +# 1. Use Architecture Decision Records + +Date: 2025-11-22 + +## Status +Accepted + +## Context +We need to record architectural decisions made in this project. + +## Decision +We will use Architecture Decision Records (ADRs) as described by Michael Nygard. + +## Consequences +- Decisions are documented with context +- Future contributors understand rationale +- ADRs are lightweight and version-controlled +EOF +``` + +**Examples**: +``` +# Example ADR Structure + +```markdown +# 2. Use PostgreSQL for Database + +Date: 2025-11-22 + +## Status +Accepted + +## Context +We need a relational database for complex queries and ACID transactions. +Team has PostgreSQL experience. Need full-text search capabilities. + +## Decision +Use PostgreSQL 15+ as primary database. + +## Consequences +- Positive: Robust ACID, full-text search, team familiarity +- Negative: Higher resource usage than SQLite +- Neutral: Need to manage migrations, backups +``` + +``` + +
+ +![T3](https://img.shields.io/badge/T3-Issue_%26_Pull_Request_Templates_0--100-red) **Issue & Pull Request Templates** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: PR:False, Issues:0 (Threshold: PR template + ≥2 issue templates) + +**Evidence**: +- No PR template found +- No issue template directory found + +Create GitHub issue and PR templates in .github/ directory + +1. Create .github/ directory if it doesn't exist +2. Add PULL_REQUEST_TEMPLATE.md for PRs +3. Create .github/ISSUE_TEMPLATE/ directory +4. Add bug_report.md for bug reports +5. Add feature_request.md for feature requests +6. Optionally add config.yml to configure template chooser + +**Commands**: +```bash +# Create directories +mkdir -p .github/ISSUE_TEMPLATE + +# Create PR template +cat > .github/PULL_REQUEST_TEMPLATE.md << 'EOF' +## Summary + + +## Related Issues +Fixes # + +## Testing +- [ ] Tests added/updated +- [ ] All tests pass + +## Checklist +- [ ] Documentation updated +- [ ] CHANGELOG.md updated +EOF +``` + +**Examples**: +``` +# Bug Report Template (.github/ISSUE_TEMPLATE/bug_report.md) + +```markdown +--- +name: Bug Report +about: Create a report to help us improve +title: '[BUG] ' +labels: bug +assignees: '' +--- + +**Describe the bug** +A clear description of what the bug is. + +**To Reproduce** +Steps to reproduce: +1. Go to '...' +2. Click on '....' +3. See error + +**Expected behavior** +What you expected to happen. + +**Environment** +- OS: [e.g. macOS 13.0] +- Version: [e.g. 1.0.0] +``` + +``` + +
+ +![T3](https://img.shields.io/badge/T3-OpenAPI%2FSwagger_Specifications_0--100-red) **OpenAPI/Swagger Specifications** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: no OpenAPI spec (Threshold: OpenAPI 3.x spec present) + +**Evidence**: +- No OpenAPI specification found +- Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json + +Create OpenAPI specification for API endpoints + +1. Create openapi.yaml in repository root +2. Define OpenAPI version 3.x +3. Document all API endpoints with full schemas +4. Add request/response examples +5. Define security schemes (API keys, OAuth, etc.) +6. Validate spec with Swagger Editor or Spectral +7. Generate API documentation with Swagger UI or ReDoc + +**Commands**: +```bash +# Install OpenAPI validator +npm install -g @stoplight/spectral-cli + +# Validate spec +spectral lint openapi.yaml + +# Generate client SDK +npx @openapitools/openapi-generator-cli generate \ + -i openapi.yaml \ + -g python \ + -o client/ +``` + +**Examples**: +``` +# openapi.yaml - Minimal example +openapi: 3.1.0 +info: + title: My API + version: 1.0.0 + description: API for managing users + +servers: + - url: https://api.example.com/v1 + +paths: + /users/{userId}: + get: + summary: Get user by ID + parameters: + - name: userId + in: path + required: true + schema: + type: string + responses: + '200': + description: User found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '404': + description: User not found + +components: + schemas: + User: + type: object + required: + - id + - email + properties: + id: + type: string + example: "user_123" + email: + type: string + format: email + example: "user@example.com" + name: + type: string + example: "John Doe" + +``` + +
+ +![T3](https://img.shields.io/badge/T3-CI%2FCD_Pipeline_Visibility_70--100-red) **CI/CD Pipeline Visibility** ❌ 70/100 +
+📝 Remediation Steps + +**Measured**: basic config (Threshold: CI with best practices) + +**Evidence**: +- CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml +- Descriptive job/step names found +- Caching configured +- No parallelization detected + +Add or improve CI/CD pipeline configuration + +1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.) +2. Define jobs: lint, test, build +3. Use descriptive job and step names +4. Configure dependency caching +5. Enable parallel job execution +6. Upload artifacts: test results, coverage reports +7. Add status badge to README + +**Commands**: +```bash +# Create GitHub Actions workflow +mkdir -p .github/workflows +touch .github/workflows/ci.yml + +# Validate workflow +gh workflow view ci.yml +``` + +**Examples**: +``` +# .github/workflows/ci.yml - Good example + +name: CI Pipeline + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + lint: + name: Lint Code + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' # Caching + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Run linters + run: | + black --check . + isort --check . + ruff check . + + test: + name: Run Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Run tests with coverage + run: pytest --cov --cov-report=xml + + - name: Upload coverage reports + uses: codecov/codecov-action@v3 + with: + files: ./coverage.xml + + build: + name: Build Package + runs-on: ubuntu-latest + needs: [lint, test] # Runs after lint/test pass + steps: + - uses: actions/checkout@v4 + + - name: Build package + run: python -m build + + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: dist + path: dist/ + +``` + +
+ +![T3](https://img.shields.io/badge/T3-Cyclomatic_Complexity_Thresholds_N--A-lightgray) **Cyclomatic Complexity Thresholds** ⊘ + +![T3](https://img.shields.io/badge/T3-Semantic_Naming_N--A-lightgray) **Semantic Naming** ⊘ + +![T3](https://img.shields.io/badge/T3-Structured_Logging_N--A-lightgray) **Structured Logging** ⊘ + +![T4](https://img.shields.io/badge/T4-Code_Smell_Elimination_50--100-red) **Code Smell Elimination** ❌ 50/100 +
+📝 Remediation Steps + +**Measured**: ESLint (Threshold: ≥60% of applicable linters configured) + +**Evidence**: +- Linters configured: ESLint +- Coverage: 20/40 points (50%) + +Configure 2 missing linter(s) + +1. Add actionlint for GitHub Actions workflow validation +2. Configure markdownlint for documentation quality + +**Commands**: +```bash +npm install --save-dev markdownlint-cli && touch .markdownlint.json +``` + +**Examples**: +``` +# .pylintrc example +[MASTER] +max-line-length=100 + +[MESSAGES CONTROL] +disable=C0111 +``` +``` +# .eslintrc.json example +{ + "extends": "eslint:recommended", + "rules": { + "no-console": "warn" + } +} +``` + +
+ +![T4](https://img.shields.io/badge/T4-Branch_Protection_Rules_N--A-lightgray) **Branch Protection Rules** ⊘ + +![T4](https://img.shields.io/badge/T4-Container%2FVirtualization_Setup_N--A-lightgray) **Container/Virtualization Setup** ⊘ + + +--- + +## 📝 Assessment Metadata + +- **AgentReady Version**: v2.30.1 +- **Research Version**: v1.0.1 +- **Repository Snapshot**: 402ab4199df0bb24c1bb6d32d414eb331e3e743c +- **Assessment Duration**: 7.3s +- **Assessed By**: nthoen@nthoen-mac +- **Assessment Date**: April 09, 2026 at 4:19 PM + +🤖 Generated with [Claude Code](https://claude.com/claude-code) \ No newline at end of file diff --git a/docs/agentready-baseline/report-latest.html b/docs/agentready-baseline/report-latest.html new file mode 120000 index 0000000..0165b74 --- /dev/null +++ b/docs/agentready-baseline/report-latest.html @@ -0,0 +1 @@ +report-20260409-161920.html \ No newline at end of file diff --git a/docs/agentready-baseline/report-latest.md b/docs/agentready-baseline/report-latest.md new file mode 120000 index 0000000..12d699d --- /dev/null +++ b/docs/agentready-baseline/report-latest.md @@ -0,0 +1 @@ +report-20260409-161920.md \ No newline at end of file diff --git a/docs/agentready-post-remediation/assessment-20260410-092152.json b/docs/agentready-post-remediation/assessment-20260410-092152.json new file mode 100644 index 0000000..c2a9a5d --- /dev/null +++ b/docs/agentready-post-remediation/assessment-20260410-092152.json @@ -0,0 +1,778 @@ +{ + "schema_version": "1.0.0", + "metadata": { + "agentready_version": "2.30.1", + "research_version": "1.0.1", + "assessment_timestamp": "2026-04-10T09:21:52.466541", + "assessment_timestamp_human": "April 10, 2026 at 9:21 AM", + "executed_by": "nthoen@nthoen-mac", + "command": "/Library/Frameworks/Python.framework/Versions/3.12/bin/agentready assess . -o docs/agentready-post-remediation", + "working_directory": "/Users/nthoen/Projects/react-user-feedback" + }, + "repository": { + "path": "/Users/nthoen/Projects/react-user-feedback", + "name": "react-user-feedback", + "url": "git@github.com:patternfly/react-user-feedback.git", + "branch": "agent_ready_files", + "commit_hash": "1a8b60548803a227212e9f8ffc2d728781fd5aee", + "languages": { + "JSON": 8, + "YAML": 6, + "Markdown": 5, + "JavaScript": 20, + "TypeScript": 16 + }, + "total_files": 77, + "total_lines": 26159 + }, + "timestamp": "2026-04-10T09:21:52.466541", + "overall_score": 73.5, + "certification_level": "Silver", + "attributes_assessed": 18, + "attributes_skipped": 7, + "attributes_total": 25, + "findings": [ + { + "attribute": { + "id": "claude_md_file", + "name": "CLAUDE.md Configuration Files", + "category": "Context Window Optimization", + "tier": 1, + "description": "Project-specific configuration for Claude Code", + "criteria": "CLAUDE.md file exists in repository root", + "default_weight": 0.1 + }, + "status": "pass", + "score": 100.0, + "measured_value": "present", + "threshold": "present", + "evidence": [ + "CLAUDE.md found at /Users/nthoen/Projects/react-user-feedback/CLAUDE.md" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "readme_structure", + "name": "README Structure", + "category": "Documentation Standards", + "tier": 1, + "description": "Well-structured README with key sections", + "criteria": "README.md with installation, usage, and development sections", + "default_weight": 0.1 + }, + "status": "pass", + "score": 100.0, + "measured_value": "3/3 sections", + "threshold": "3/3 sections", + "evidence": [ + "Found 3/3 essential sections", + "Installation: \u2713", + "Usage: \u2713", + "Development: \u2713" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "type_annotations", + "name": "Type Annotations", + "category": "Code Quality", + "tier": 1, + "description": "Type hints in function signatures", + "criteria": ">80% of functions have type annotations", + "default_weight": 0.1 + }, + "status": "fail", + "score": 50.0, + "measured_value": "strict mode disabled", + "threshold": "strict mode enabled", + "evidence": [ + "tsconfig.json missing strict: true" + ], + "remediation": { + "summary": "Add type annotations to function signatures", + "steps": [ + "For Python: Add type hints to function parameters and return types", + "For TypeScript: Enable strict mode in tsconfig.json", + "Use mypy or pyright for Python type checking", + "Use tsc --strict for TypeScript", + "Add type annotations gradually to existing code" + ], + "tools": [ + "mypy", + "pyright", + "typescript" + ], + "commands": [ + "# Python", + "pip install mypy", + "mypy --strict src/", + "", + "# TypeScript", + "npm install --save-dev typescript", + "echo '{\"compilerOptions\": {\"strict\": true}}' > tsconfig.json" + ], + "examples": [ + "# Python - Before\ndef calculate(x, y):\n return x + y\n\n# Python - After\ndef calculate(x: float, y: float) -> float:\n return x + y\n", + "// TypeScript - tsconfig.json\n{\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true,\n \"strictNullChecks\": true\n }\n}\n" + ], + "citations": [ + { + "source": "Python.org", + "title": "Type Hints", + "url": "https://docs.python.org/3/library/typing.html", + "relevance": "Official Python type hints documentation" + }, + { + "source": "TypeScript", + "title": "TypeScript Handbook", + "url": "https://www.typescriptlang.org/docs/handbook/2/everyday-types.html", + "relevance": "TypeScript type system guide" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "standard_layout", + "name": "Standard Project Layouts", + "category": "Repository Structure", + "tier": 1, + "description": "Follows standard project structure for language", + "criteria": "Standard directories (src/ or project-named, tests/) present", + "default_weight": 0.1 + }, + "status": "fail", + "score": 0.0, + "measured_value": "0/2 directories", + "threshold": "2/2 directories", + "evidence": [ + "Found 0/2 standard directories", + "source directory: \u2717 (no src/ or project-named dir)", + "tests/: \u2717" + ], + "remediation": { + "summary": "Organize code into standard directories", + "steps": [ + "Create a source directory for your code", + "Option A: Use src/ layout (recommended for packages)", + "Option B: Use project-named directory (e.g., mypackage/)", + "Ensure your package has __init__.py", + "Create tests/ directory for test files", + "Add at least one test file" + ], + "tools": [], + "commands": [ + "# Option A: src layout", + "mkdir -p src/mypackage", + "touch src/mypackage/__init__.py", + "# ---", + "# Option B: flat layout (project-named)", + "mkdir -p mypackage", + "touch mypackage/__init__.py", + "# Create tests directory", + "mkdir -p tests", + "touch tests/__init__.py", + "touch tests/test_example.py" + ], + "examples": [ + "# src layout (recommended for distributable packages)\nproject/\n\u251c\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n\n# flat layout (common in major projects like pandas, numpy)\nproject/\n\u251c\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n" + ], + "citations": [ + { + "source": "Python Packaging Authority", + "title": "src layout vs flat layout", + "url": "https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/", + "relevance": "Official guidance on Python project layouts" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "lock_files", + "name": "Dependency Pinning for Reproducibility", + "category": "Dependency Management", + "tier": 1, + "description": "Dependencies pinned to exact versions in lock files", + "criteria": "Lock file with pinned versions, updated within 6 months", + "default_weight": 0.1 + }, + "status": "pass", + "score": 100.0, + "measured_value": "yarn.lock", + "threshold": "lock file with pinned versions, < 6 months old", + "evidence": [ + "Found lock file(s): yarn.lock" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "dependency_security", + "name": "Dependency Security & Vulnerability Scanning", + "category": "Security", + "tier": 1, + "description": "Security scanning tools configured for dependencies and code", + "criteria": "Dependabot, Renovate, CodeQL, or SAST tools configured; secret detection enabled", + "default_weight": 0.04 + }, + "status": "pass", + "score": 35, + "measured_value": "Security tools configured: Renovate", + "threshold": "\u226560 points (Dependabot/Renovate + SAST or multiple scanners)", + "evidence": [ + "\u2713 Renovate configured for dependency updates", + " Meaningful Renovate configuration detected" + ], + "remediation": { + "summary": "Add more security scanning tools for comprehensive coverage", + "steps": [ + "Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)", + "Add CodeQL scanning workflow for SAST", + "Configure secret detection (detect-secrets, gitleaks)", + "Set up language-specific scanners (pip-audit, npm audit, Snyk)" + ], + "tools": [ + "Dependabot", + "Renovate", + "CodeQL", + "detect-secrets", + "pip-audit", + "npm audit" + ], + "commands": [ + "gh repo edit --enable-security", + "pip install detect-secrets # Python secret detection", + "npm audit # JavaScript dependency audit" + ], + "examples": [ + "# .github/dependabot.yml\nversion: 2\nupdates:\n - package-ecosystem: pip\n directory: /\n schedule:\n interval: weekly" + ], + "citations": [ + { + "source": "OWASP", + "title": "Dependency-Check Project", + "url": "https://owasp.org/www-project-dependency-check/", + "relevance": "Open-source tool for detecting known vulnerabilities in dependencies" + }, + { + "source": "GitHub", + "title": "Dependabot Documentation", + "url": "https://docs.github.com/en/code-security/dependabot", + "relevance": "Official guide for configuring automated dependency updates and security alerts" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "test_coverage", + "name": "Test Coverage Requirements", + "category": "Testing & CI/CD", + "tier": 2, + "description": "Test coverage thresholds configured and enforced", + "criteria": ">80% code coverage", + "default_weight": 0.03 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "precommit_hooks", + "name": "Pre-commit Hooks & CI/CD Linting", + "category": "Testing & CI/CD", + "tier": 2, + "description": "Pre-commit hooks configured for linting and formatting", + "criteria": ".pre-commit-config.yaml exists", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "configured", + "threshold": "configured", + "evidence": [ + ".pre-commit-config.yaml found" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "conventional_commits", + "name": "Conventional Commit Messages", + "category": "Git & Version Control", + "tier": 2, + "description": "Follows conventional commit format", + "criteria": "\u226580% of recent commits follow convention", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "configured", + "threshold": "configured", + "evidence": [ + "Commit linting configured" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "gitignore_completeness", + "name": ".gitignore Completeness", + "category": "Git & Version Control", + "tier": 2, + "description": "Comprehensive .gitignore file with language-specific patterns", + "criteria": ".gitignore exists and includes language-specific patterns from GitHub templates", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "11/11 patterns", + "threshold": "\u226570% of language-specific patterns", + "evidence": [ + ".gitignore found (559 bytes)", + "Pattern coverage: 11/11 (100%)" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "one_command_setup", + "name": "One-Command Build/Setup", + "category": "Build & Development", + "tier": 2, + "description": "Single command to set up development environment from fresh clone", + "criteria": "Single command (make setup, npm install, etc.) documented prominently", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100, + "measured_value": "yarn install", + "threshold": "single command", + "evidence": [ + "Setup command found in README: 'yarn install'", + "Setup automation found: package.json", + "Setup instructions in prominent location" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "file_size_limits", + "name": "File Size Limits", + "category": "Context Window Optimization", + "tier": 2, + "description": "Files are reasonably sized for AI context windows", + "criteria": "<5% of files >500 lines, no files >1000 lines", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "0 huge, 0 large out of 36", + "threshold": "<5% files >500 lines, 0 files >1000 lines", + "evidence": [ + "All 36 source files are <500 lines" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "separation_of_concerns", + "name": "Separation of Concerns", + "category": "Code Organization", + "tier": 2, + "description": "Code organized with single responsibility per module", + "criteria": "Feature-based organization, cohesive modules, low coupling", + "default_weight": 0.03 + }, + "status": "pass", + "score": 100.0, + "measured_value": "organization:100, cohesion:100, naming:100", + "threshold": "\u226575 overall", + "evidence": [ + "Good directory organization (feature-based or flat)", + "File cohesion: 0/0 files >500 lines", + "No catch-all modules (utils.py, helpers.py) detected" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "concise_documentation", + "name": "Concise Documentation", + "category": "Documentation", + "tier": 2, + "description": "Documentation maximizes information density while minimizing token consumption", + "criteria": "README <500 lines with clear structure, bullet points over prose", + "default_weight": 0.03 + }, + "status": "pass", + "score": 85.0, + "measured_value": "24 lines, 1 headings, 0 bullets", + "threshold": "<500 lines, structured format", + "evidence": [ + "README length: 24 lines (excellent)", + "Heading density: 4.2 per 100 lines (good structure)", + "Only 0 bullet points (prefer bullets over prose)" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "inline_documentation", + "name": "Inline Documentation", + "category": "Documentation", + "tier": 2, + "description": "Function, class, and module-level documentation using language-specific conventions", + "criteria": "\u226580% of public functions/classes have docstrings", + "default_weight": 0.03 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "cyclomatic_complexity", + "name": "Cyclomatic Complexity Thresholds", + "category": "Code Quality", + "tier": 3, + "description": "Cyclomatic complexity thresholds enforced", + "criteria": "Average complexity <10, no functions >15", + "default_weight": 0.03 + }, + "status": "skipped", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Missing tool: lizard" + ], + "remediation": { + "summary": "Install with: pip install lizard", + "steps": [ + "Install with: pip install lizard" + ], + "tools": [], + "commands": [], + "examples": [], + "citations": [] + }, + "error_message": null + }, + { + "attribute": { + "id": "architecture_decisions", + "name": "Architecture Decision Records (ADRs)", + "category": "Documentation Standards", + "tier": 3, + "description": "Lightweight documents capturing architectural decisions", + "criteria": "ADR directory with documented decisions", + "default_weight": 0.015 + }, + "status": "pass", + "score": 82, + "measured_value": "3 ADRs", + "threshold": "\u22653 ADRs with template", + "evidence": [ + "ADR directory found: docs/adr", + "3 architecture decision records", + "Consistent naming pattern detected", + "Sampled 3 ADRs: template compliance 18/20" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "issue_pr_templates", + "name": "Issue & Pull Request Templates", + "category": "Repository Structure", + "tier": 3, + "description": "Standardized templates for issues and PRs", + "criteria": "PR template and issue templates in .github/", + "default_weight": 0.015 + }, + "status": "pass", + "score": 100, + "measured_value": "PR:True, Issues:3", + "threshold": "PR template + \u22652 issue templates", + "evidence": [ + "PR template found", + "Issue templates found: 3 templates" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "cicd_pipeline_visibility", + "name": "CI/CD Pipeline Visibility", + "category": "Testing & CI/CD", + "tier": 3, + "description": "Clear, well-documented CI/CD configuration files", + "criteria": "CI config with descriptive names, caching, parallelization", + "default_weight": 0.015 + }, + "status": "fail", + "score": 70, + "measured_value": "basic config", + "threshold": "CI with best practices", + "evidence": [ + "CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml", + "Descriptive job/step names found", + "Caching configured", + "No parallelization detected" + ], + "remediation": { + "summary": "Add or improve CI/CD pipeline configuration", + "steps": [ + "Create CI config for your platform (GitHub Actions, GitLab CI, etc.)", + "Define jobs: lint, test, build", + "Use descriptive job and step names", + "Configure dependency caching", + "Enable parallel job execution", + "Upload artifacts: test results, coverage reports", + "Add status badge to README" + ], + "tools": [ + "github-actions", + "gitlab-ci", + "circleci" + ], + "commands": [ + "# Create GitHub Actions workflow", + "mkdir -p .github/workflows", + "touch .github/workflows/ci.yml", + "", + "# Validate workflow", + "gh workflow view ci.yml" + ], + "examples": [ + "# .github/workflows/ci.yml - Good example\n\nname: CI Pipeline\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n lint:\n name: Lint Code\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip' # Caching\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run linters\n run: |\n black --check .\n isort --check .\n ruff check .\n\n test:\n name: Run Tests\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip'\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run tests with coverage\n run: pytest --cov --cov-report=xml\n\n - name: Upload coverage reports\n uses: codecov/codecov-action@v3\n with:\n files: ./coverage.xml\n\n build:\n name: Build Package\n runs-on: ubuntu-latest\n needs: [lint, test] # Runs after lint/test pass\n steps:\n - uses: actions/checkout@v4\n\n - name: Build package\n run: python -m build\n\n - name: Upload build artifacts\n uses: actions/upload-artifact@v3\n with:\n name: dist\n path: dist/\n" + ], + "citations": [ + { + "source": "GitHub", + "title": "GitHub Actions Documentation", + "url": "https://docs.github.com/en/actions", + "relevance": "Official GitHub Actions guide" + }, + { + "source": "CircleCI", + "title": "CI/CD Best Practices", + "url": "https://circleci.com/blog/ci-cd-best-practices/", + "relevance": "Industry best practices for CI/CD" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "semantic_naming", + "name": "Semantic Naming", + "category": "Code Quality", + "tier": 3, + "description": "Systematic naming patterns following language conventions", + "criteria": "Language conventions followed, avoid generic names", + "default_weight": 0.015 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "structured_logging", + "name": "Structured Logging", + "category": "Code Quality", + "tier": 3, + "description": "Logging in structured format (JSON) with consistent fields", + "criteria": "Structured logging library configured (structlog, winston, zap)", + "default_weight": 0.015 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "openapi_specs", + "name": "OpenAPI/Swagger Specifications", + "category": "API Documentation", + "tier": 3, + "description": "Machine-readable API documentation in OpenAPI format", + "criteria": "OpenAPI 3.x spec with complete endpoint documentation", + "default_weight": 0.015 + }, + "status": "fail", + "score": 0.0, + "measured_value": "no OpenAPI spec", + "threshold": "OpenAPI 3.x spec present", + "evidence": [ + "No OpenAPI specification found", + "Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json" + ], + "remediation": { + "summary": "Create OpenAPI specification for API endpoints", + "steps": [ + "Create openapi.yaml in repository root", + "Define OpenAPI version 3.x", + "Document all API endpoints with full schemas", + "Add request/response examples", + "Define security schemes (API keys, OAuth, etc.)", + "Validate spec with Swagger Editor or Spectral", + "Generate API documentation with Swagger UI or ReDoc" + ], + "tools": [ + "swagger-editor", + "spectral", + "openapi-generator" + ], + "commands": [ + "# Install OpenAPI validator", + "npm install -g @stoplight/spectral-cli", + "", + "# Validate spec", + "spectral lint openapi.yaml", + "", + "# Generate client SDK", + "npx @openapitools/openapi-generator-cli generate \\", + " -i openapi.yaml \\", + " -g python \\", + " -o client/" + ], + "examples": [ + "# openapi.yaml - Minimal example\nopenapi: 3.1.0\ninfo:\n title: My API\n version: 1.0.0\n description: API for managing users\n\nservers:\n - url: https://api.example.com/v1\n\npaths:\n /users/{userId}:\n get:\n summary: Get user by ID\n parameters:\n - name: userId\n in: path\n required: true\n schema:\n type: string\n responses:\n '200':\n description: User found\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/User'\n '404':\n description: User not found\n\ncomponents:\n schemas:\n User:\n type: object\n required:\n - id\n - email\n properties:\n id:\n type: string\n example: \"user_123\"\n email:\n type: string\n format: email\n example: \"user@example.com\"\n name:\n type: string\n example: \"John Doe\"\n" + ], + "citations": [ + { + "source": "OpenAPI Initiative", + "title": "OpenAPI Specification", + "url": "https://spec.openapis.org/oas/v3.1.0", + "relevance": "Official OpenAPI 3.1 specification" + }, + { + "source": "Swagger", + "title": "API Documentation Best Practices", + "url": "https://swagger.io/resources/articles/best-practices-in-api-documentation/", + "relevance": "Guide to writing effective API docs" + } + ] + }, + "error_message": null + }, + { + "attribute": { + "id": "branch_protection", + "name": "Branch Protection Rules", + "category": "Git & Version Control", + "tier": 4, + "description": "Required status checks and review approvals before merging", + "criteria": "Branch protection enabled with status checks and required reviews", + "default_weight": 0.005 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements." + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "code_smells", + "name": "Code Smell Elimination", + "category": "Code Quality", + "tier": 4, + "description": "Linter configuration for detecting code smells and anti-patterns", + "criteria": "Language-specific linters configured (pylint, ESLint, RuboCop, etc.)", + "default_weight": 0.01 + }, + "status": "pass", + "score": 100.0, + "measured_value": "ESLint, actionlint, markdownlint", + "threshold": "\u226560% of applicable linters configured", + "evidence": [ + "Linters configured: ESLint, actionlint, markdownlint", + "Coverage: 40/40 points (100%)" + ], + "remediation": null, + "error_message": null + }, + { + "attribute": { + "id": "container_setup", + "name": "Container/Virtualization Setup", + "category": "Build & Development", + "tier": 4, + "description": "Container configuration for consistent development environments", + "criteria": "Dockerfile/Containerfile, docker-compose.yml, .dockerignore, multi-stage builds", + "default_weight": 0.01 + }, + "status": "not_applicable", + "score": null, + "measured_value": null, + "threshold": null, + "evidence": [ + "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" + ], + "remediation": null, + "error_message": null + } + ], + "config": { + "weights": {}, + "excluded_attributes": [], + "language_overrides": {}, + "output_dir": null, + "report_theme": "default", + "custom_theme": null + }, + "duration_seconds": 9.5, + "discovered_skills": [] +} \ No newline at end of file diff --git a/docs/agentready-post-remediation/assessment-latest.json b/docs/agentready-post-remediation/assessment-latest.json new file mode 120000 index 0000000..e887323 --- /dev/null +++ b/docs/agentready-post-remediation/assessment-latest.json @@ -0,0 +1 @@ +assessment-20260410-092152.json \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-20260410-092152.html b/docs/agentready-post-remediation/report-20260410-092152.html new file mode 100644 index 0000000..07a59fa --- /dev/null +++ b/docs/agentready-post-remediation/report-20260410-092152.html @@ -0,0 +1,2431 @@ + + + + + + + AgentReady Assessment - react-user-feedback + + + + +
+ + +
+ +
+
+

🤖 AgentReady Assessment Report

+
+
+

react-user-feedback

+
📁 ~/Projects/react-user-feedback
+
🌿 agent_ready_files @ 1a8b6054
+
+ +
+
Assessed: April 10, 2026 at 9:21 AM
+
AgentReady: v2.30.1
+
Run by: nthoen@nthoen-mac
+
+ +
+
+ + +
+
+

Overall Score

+
73.5
+
+
+

Certification

+
Silver
+
+
+

Assessed

+
18/25
+
+
+

Duration

+
9.5s
+
+
+ + +
+
+

💎 Platinum

+

90-100

+
+
+

🥇 Gold

+

75-89

+
+
+

🥈 Silver

+

60-74

+
+
+

🥉 Bronze

+

40-59

+
+
+

⚠️ Needs Work

+

0-39

+
+
+ + +
+
+ + + + + +
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + ✅ + + +
+

CLAUDE.md Configuration Files

+
+ Context Window Optimization • + Tier 1 + • present +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • CLAUDE.md found at /Users/nthoen/Projects/react-user-feedback/CLAUDE.md
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

README Structure

+
+ Documentation Standards • + Tier 1 + • 3/3 sections +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Found 3/3 essential sections
  • + +
  • Installation: ✓
  • + +
  • Usage: ✓
  • + +
  • Development: ✓
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Type Annotations

+
+ Code Quality • + Tier 1 + • strict mode disabled +
+
+
+ +
+ 50 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • tsconfig.json missing strict: true
  • + +
+
+ + + +
+

Remediation

+

Add type annotations to function signatures

+ + +
    + +
  1. For Python: Add type hints to function parameters and return types
  2. + +
  3. For TypeScript: Enable strict mode in tsconfig.json
  4. + +
  5. Use mypy or pyright for Python type checking
  6. + +
  7. Use tsc --strict for TypeScript
  8. + +
  9. Add type annotations gradually to existing code
  10. + +
+ + + +

Commands

+
# Python
+pip install mypy
+mypy --strict src/
+
+# TypeScript
+npm install --save-dev typescript
+echo '{"compilerOptions": {"strict": true}}' > tsconfig.json
+ + + +

Examples

+ +
# Python - Before
+def calculate(x, y):
+    return x + y
+
+# Python - After
+def calculate(x: float, y: float) -> float:
+    return x + y
+
+ +
// TypeScript - tsconfig.json
+{
+  "compilerOptions": {
+    "strict": true,
+    "noImplicitAny": true,
+    "strictNullChecks": true
+  }
+}
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ❌ + + +
+

Standard Project Layouts

+
+ Repository Structure • + Tier 1 + • 0/2 directories +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Found 0/2 standard directories
  • + +
  • source directory: ✗ (no src/ or project-named dir)
  • + +
  • tests/: ✗
  • + +
+
+ + + +
+

Remediation

+

Organize code into standard directories

+ + +
    + +
  1. Create a source directory for your code
  2. + +
  3. Option A: Use src/ layout (recommended for packages)
  4. + +
  5. Option B: Use project-named directory (e.g., mypackage/)
  6. + +
  7. Ensure your package has __init__.py
  8. + +
  9. Create tests/ directory for test files
  10. + +
  11. Add at least one test file
  12. + +
+ + + +

Commands

+
# Option A: src layout
+mkdir -p src/mypackage
+touch src/mypackage/__init__.py
+# ---
+# Option B: flat layout (project-named)
+mkdir -p mypackage
+touch mypackage/__init__.py
+# Create tests directory
+mkdir -p tests
+touch tests/__init__.py
+touch tests/test_example.py
+ + + +

Examples

+ +
# src layout (recommended for distributable packages)
+project/
+├── src/
+│   └── mypackage/
+│       ├── __init__.py
+│       └── module.py
+├── tests/
+│   └── test_module.py
+└── pyproject.toml
+
+# flat layout (common in major projects like pandas, numpy)
+project/
+├── mypackage/
+│   ├── __init__.py
+│   └── module.py
+├── tests/
+│   └── test_module.py
+└── pyproject.toml
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Dependency Pinning for Reproducibility

+
+ Dependency Management • + Tier 1 + • yarn.lock +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Found lock file(s): yarn.lock
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Dependency Security & Vulnerability Scanning

+
+ Security • + Tier 1 + • Security tools configured: Renovate +
+
+
+ +
+ 35 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • ✓ Renovate configured for dependency updates
  • + +
  • Meaningful Renovate configuration detected
  • + +
+
+ + + +
+

Remediation

+

Add more security scanning tools for comprehensive coverage

+ + +
    + +
  1. Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)
  2. + +
  3. Add CodeQL scanning workflow for SAST
  4. + +
  5. Configure secret detection (detect-secrets, gitleaks)
  6. + +
  7. Set up language-specific scanners (pip-audit, npm audit, Snyk)
  8. + +
+ + + +

Commands

+
gh repo edit --enable-security
+pip install detect-secrets  # Python secret detection
+npm audit  # JavaScript dependency audit
+ + + +

Examples

+ +
# .github/dependabot.yml
+version: 2
+updates:
+  - package-ecosystem: pip
+    directory: /
+    schedule:
+      interval: weekly
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Test Coverage Requirements

+
+ Testing & CI/CD • + Tier 2 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Pre-commit Hooks & CI/CD Linting

+
+ Testing & CI/CD • + Tier 2 + • configured +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • .pre-commit-config.yaml found
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Conventional Commit Messages

+
+ Git & Version Control • + Tier 2 + • configured +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Commit linting configured
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

.gitignore Completeness

+
+ Git & Version Control • + Tier 2 + • 11/11 patterns +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • .gitignore found (559 bytes)
  • + +
  • Pattern coverage: 11/11 (100%)
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

One-Command Build/Setup

+
+ Build & Development • + Tier 2 + • yarn install +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Setup command found in README: 'yarn install'
  • + +
  • Setup automation found: package.json
  • + +
  • Setup instructions in prominent location
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

File Size Limits

+
+ Context Window Optimization • + Tier 2 + • 0 huge, 0 large out of 36 +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • All 36 source files are <500 lines
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Separation of Concerns

+
+ Code Organization • + Tier 2 + • organization:100, cohesion:100, naming:100 +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Good directory organization (feature-based or flat)
  • + +
  • File cohesion: 0/0 files >500 lines
  • + +
  • No catch-all modules (utils.py, helpers.py) detected
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Concise Documentation

+
+ Documentation • + Tier 2 + • 24 lines, 1 headings, 0 bullets +
+
+
+ +
+ 85 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • README length: 24 lines (excellent)
  • + +
  • Heading density: 4.2 per 100 lines (good structure)
  • + +
  • Only 0 bullet points (prefer bullets over prose)
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Inline Documentation

+
+ Documentation • + Tier 2 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Cyclomatic Complexity Thresholds

+
+ Code Quality • + Tier 3 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Missing tool: lizard
  • + +
+
+ + + +
+

Remediation

+

Install with: pip install lizard

+ + +
    + +
  1. Install with: pip install lizard
  2. + +
+ + + + + +
+ + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Architecture Decision Records (ADRs)

+
+ Documentation Standards • + Tier 3 + • 3 ADRs +
+
+
+ +
+ 82 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • ADR directory found: docs/adr
  • + +
  • 3 architecture decision records
  • + +
  • Consistent naming pattern detected
  • + +
  • Sampled 3 ADRs: template compliance 18/20
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Issue & Pull Request Templates

+
+ Repository Structure • + Tier 3 + • PR:True, Issues:3 +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • PR template found
  • + +
  • Issue templates found: 3 templates
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

CI/CD Pipeline Visibility

+
+ Testing & CI/CD • + Tier 3 + • basic config +
+
+
+ +
+ 70 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml
  • + +
  • Descriptive job/step names found
  • + +
  • Caching configured
  • + +
  • No parallelization detected
  • + +
+
+ + + +
+

Remediation

+

Add or improve CI/CD pipeline configuration

+ + +
    + +
  1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.)
  2. + +
  3. Define jobs: lint, test, build
  4. + +
  5. Use descriptive job and step names
  6. + +
  7. Configure dependency caching
  8. + +
  9. Enable parallel job execution
  10. + +
  11. Upload artifacts: test results, coverage reports
  12. + +
  13. Add status badge to README
  14. + +
+ + + +

Commands

+
# Create GitHub Actions workflow
+mkdir -p .github/workflows
+touch .github/workflows/ci.yml
+
+# Validate workflow
+gh workflow view ci.yml
+ + + +

Examples

+ +
# .github/workflows/ci.yml - Good example
+
+name: CI Pipeline
+
+on:
+  push:
+    branches: [main]
+  pull_request:
+    branches: [main]
+
+jobs:
+  lint:
+    name: Lint Code
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: '3.11'
+          cache: 'pip'  # Caching
+
+      - name: Install dependencies
+        run: pip install -r requirements.txt
+
+      - name: Run linters
+        run: |
+          black --check .
+          isort --check .
+          ruff check .
+
+  test:
+    name: Run Tests
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: '3.11'
+          cache: 'pip'
+
+      - name: Install dependencies
+        run: pip install -r requirements.txt
+
+      - name: Run tests with coverage
+        run: pytest --cov --cov-report=xml
+
+      - name: Upload coverage reports
+        uses: codecov/codecov-action@v3
+        with:
+          files: ./coverage.xml
+
+  build:
+    name: Build Package
+    runs-on: ubuntu-latest
+    needs: [lint, test]  # Runs after lint/test pass
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Build package
+        run: python -m build
+
+      - name: Upload build artifacts
+        uses: actions/upload-artifact@v3
+        with:
+          name: dist
+          path: dist/
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Semantic Naming

+
+ Code Quality • + Tier 3 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Structured Logging

+
+ Code Quality • + Tier 3 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ❌ + + +
+

OpenAPI/Swagger Specifications

+
+ API Documentation • + Tier 3 + • no OpenAPI spec +
+
+
+ +
+ 0 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • No OpenAPI specification found
  • + +
  • Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json
  • + +
+
+ + + +
+

Remediation

+

Create OpenAPI specification for API endpoints

+ + +
    + +
  1. Create openapi.yaml in repository root
  2. + +
  3. Define OpenAPI version 3.x
  4. + +
  5. Document all API endpoints with full schemas
  6. + +
  7. Add request/response examples
  8. + +
  9. Define security schemes (API keys, OAuth, etc.)
  10. + +
  11. Validate spec with Swagger Editor or Spectral
  12. + +
  13. Generate API documentation with Swagger UI or ReDoc
  14. + +
+ + + +

Commands

+
# Install OpenAPI validator
+npm install -g @stoplight/spectral-cli
+
+# Validate spec
+spectral lint openapi.yaml
+
+# Generate client SDK
+npx @openapitools/openapi-generator-cli generate \
+  -i openapi.yaml \
+  -g python \
+  -o client/
+ + + +

Examples

+ +
# openapi.yaml - Minimal example
+openapi: 3.1.0
+info:
+  title: My API
+  version: 1.0.0
+  description: API for managing users
+
+servers:
+  - url: https://api.example.com/v1
+
+paths:
+  /users/{userId}:
+    get:
+      summary: Get user by ID
+      parameters:
+        - name: userId
+          in: path
+          required: true
+          schema:
+            type: string
+      responses:
+        '200':
+          description: User found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/User'
+        '404':
+          description: User not found
+
+components:
+  schemas:
+    User:
+      type: object
+      required:
+        - id
+        - email
+      properties:
+        id:
+          type: string
+          example: "user_123"
+        email:
+          type: string
+          format: email
+          example: "user@example.com"
+        name:
+          type: string
+          example: "John Doe"
+
+ + +
+ + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Branch Protection Rules

+
+ Git & Version Control • + Tier 4 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements.
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ✅ + + +
+

Code Smell Elimination

+
+ Code Quality • + Tier 4 + • ESLint, actionlint, markdownlint +
+
+
+ +
+ 100 +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Linters configured: ESLint, actionlint, markdownlint
  • + +
  • Coverage: 40/40 points (100%)
  • + +
+
+ + + + + +
+
+ +
+ +
+
+ + ⊘ + + +
+

Container/Virtualization Setup

+
+ Build & Development • + Tier 4 + +
+
+
+ +
+ +
+ +
+ +
+

Evidence

+
    + +
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • + +
+
+ + + + + +
+
+ +
+ +
+ +

Generated by AgentReady v2.30.1 (Research v1.0.1)

+

Repository: ~/Projects/react-user-feedback • Branch: agent_ready_files • Commit: 1a8b6054

+

Assessed by nthoen@nthoen-mac on April 10, 2026 at 9:21 AM

+ +

+ 🤖 Generated with Claude Code +

+
+
+ + + + \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-20260410-092152.md b/docs/agentready-post-remediation/report-20260410-092152.md new file mode 100644 index 0000000..ba7fc18 --- /dev/null +++ b/docs/agentready-post-remediation/report-20260410-092152.md @@ -0,0 +1,417 @@ +# 🤖 AgentReady Assessment Report + +**Repository**: react-user-feedback +**Path**: `/Users/nthoen/Projects/react-user-feedback` +**Branch**: `agent_ready_files` | **Commit**: `1a8b6054` +**Assessed**: April 10, 2026 at 9:21 AM +**AgentReady Version**: 2.30.1 +**Run by**: nthoen@nthoen-mac + +--- + +## 📊 Summary + +| Metric | Value | +|--------|-------| +| **Overall Score** | **73.5/100** 🥈 **Silver** ([Tier Definitions](https://agentready.dev/attributes.html#tier-system)) | +| **Attributes Assessed** | 18/25 | +| **Attributes Not Assessed** | 7 | +| **Assessment Duration** | 9.5s | + +### Languages Detected + +- **JavaScript**: 20 files +- **TypeScript**: 16 files +- **JSON**: 8 files +- **YAML**: 6 files +- **Markdown**: 5 files + +### Repository Stats + +- **Total Files**: 77 +- **Total Lines**: 26,159 + +## 🎯 Priority Improvements + +Focus on these high-impact fixes first: + +1. **Standard Project Layouts** (Tier 1) - +10.0 points potential + - Organize code into standard directories +2. **Type Annotations** (Tier 1) - +10.0 points potential + - Add type annotations to function signatures +3. **OpenAPI/Swagger Specifications** (Tier 3) - +1.5 points potential + - Create OpenAPI specification for API endpoints +4. **CI/CD Pipeline Visibility** (Tier 3) - +1.5 points potential + - Add or improve CI/CD pipeline configuration + +## 📋 Detailed Findings + +Findings sorted by priority (Tier 1 failures first, then Tier 2, etc.) + +![T1](https://img.shields.io/badge/T1-Standard_Project_Layouts_0--100-red) **Standard Project Layouts** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: 0/2 directories (Threshold: 2/2 directories) + +**Evidence**: +- Found 0/2 standard directories +- source directory: ✗ (no src/ or project-named dir) +- tests/: ✗ + +Organize code into standard directories + +1. Create a source directory for your code +2. Option A: Use src/ layout (recommended for packages) +3. Option B: Use project-named directory (e.g., mypackage/) +4. Ensure your package has __init__.py +5. Create tests/ directory for test files +6. Add at least one test file + +**Commands**: +```bash +# Option A: src layout +mkdir -p src/mypackage +touch src/mypackage/__init__.py +# --- +# Option B: flat layout (project-named) +mkdir -p mypackage +touch mypackage/__init__.py +# Create tests directory +mkdir -p tests +touch tests/__init__.py +touch tests/test_example.py +``` + +**Examples**: +``` +# src layout (recommended for distributable packages) +project/ +├── src/ +│ └── mypackage/ +│ ├── __init__.py +│ └── module.py +├── tests/ +│ └── test_module.py +└── pyproject.toml + +# flat layout (common in major projects like pandas, numpy) +project/ +├── mypackage/ +│ ├── __init__.py +│ └── module.py +├── tests/ +│ └── test_module.py +└── pyproject.toml + +``` + +
+ +![T1](https://img.shields.io/badge/T1-Type_Annotations_50--100-red) **Type Annotations** ❌ 50/100 +
+📝 Remediation Steps + +**Measured**: strict mode disabled (Threshold: strict mode enabled) + +**Evidence**: +- tsconfig.json missing strict: true + +Add type annotations to function signatures + +1. For Python: Add type hints to function parameters and return types +2. For TypeScript: Enable strict mode in tsconfig.json +3. Use mypy or pyright for Python type checking +4. Use tsc --strict for TypeScript +5. Add type annotations gradually to existing code + +**Commands**: +```bash +# Python +pip install mypy +mypy --strict src/ + +# TypeScript +npm install --save-dev typescript +echo '{"compilerOptions": {"strict": true}}' > tsconfig.json +``` + +**Examples**: +``` +# Python - Before +def calculate(x, y): + return x + y + +# Python - After +def calculate(x: float, y: float) -> float: + return x + y + +``` +``` +// TypeScript - tsconfig.json +{ + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true + } +} + +``` + +
+ +![T1](https://img.shields.io/badge/T1-Dependency_Security_%26_Vulnerability_Scanning_35--100-green) **Dependency Security & Vulnerability Scanning** ✅ 35/100 + +![T1](https://img.shields.io/badge/T1-CLAUDE.md_Configuration_Files_100--100-green) **CLAUDE.md Configuration Files** ✅ 100/100 + +![T1](https://img.shields.io/badge/T1-README_Structure_100--100-green) **README Structure** ✅ 100/100 + +![T1](https://img.shields.io/badge/T1-Dependency_Pinning_for_Reproducibility_100--100-green) **Dependency Pinning for Reproducibility** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-Concise_Documentation_85--100-green) **Concise Documentation** ✅ 85/100 + +![T2](https://img.shields.io/badge/T2-Pre-commit_Hooks_%26_CI%2FCD_Linting_100--100-green) **Pre-commit Hooks & CI/CD Linting** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-Conventional_Commit_Messages_100--100-green) **Conventional Commit Messages** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-.gitignore_Completeness_100--100-green) **.gitignore Completeness** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-One-Command_Build%2FSetup_100--100-green) **One-Command Build/Setup** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-File_Size_Limits_100--100-green) **File Size Limits** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-Separation_of_Concerns_100--100-green) **Separation of Concerns** ✅ 100/100 + +![T2](https://img.shields.io/badge/T2-Test_Coverage_Requirements_N--A-lightgray) **Test Coverage Requirements** ⊘ + +![T2](https://img.shields.io/badge/T2-Inline_Documentation_N--A-lightgray) **Inline Documentation** ⊘ + +![T3](https://img.shields.io/badge/T3-OpenAPI%2FSwagger_Specifications_0--100-red) **OpenAPI/Swagger Specifications** ❌ 0/100 +
+📝 Remediation Steps + +**Measured**: no OpenAPI spec (Threshold: OpenAPI 3.x spec present) + +**Evidence**: +- No OpenAPI specification found +- Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json + +Create OpenAPI specification for API endpoints + +1. Create openapi.yaml in repository root +2. Define OpenAPI version 3.x +3. Document all API endpoints with full schemas +4. Add request/response examples +5. Define security schemes (API keys, OAuth, etc.) +6. Validate spec with Swagger Editor or Spectral +7. Generate API documentation with Swagger UI or ReDoc + +**Commands**: +```bash +# Install OpenAPI validator +npm install -g @stoplight/spectral-cli + +# Validate spec +spectral lint openapi.yaml + +# Generate client SDK +npx @openapitools/openapi-generator-cli generate \ + -i openapi.yaml \ + -g python \ + -o client/ +``` + +**Examples**: +``` +# openapi.yaml - Minimal example +openapi: 3.1.0 +info: + title: My API + version: 1.0.0 + description: API for managing users + +servers: + - url: https://api.example.com/v1 + +paths: + /users/{userId}: + get: + summary: Get user by ID + parameters: + - name: userId + in: path + required: true + schema: + type: string + responses: + '200': + description: User found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '404': + description: User not found + +components: + schemas: + User: + type: object + required: + - id + - email + properties: + id: + type: string + example: "user_123" + email: + type: string + format: email + example: "user@example.com" + name: + type: string + example: "John Doe" + +``` + +
+ +![T3](https://img.shields.io/badge/T3-CI%2FCD_Pipeline_Visibility_70--100-red) **CI/CD Pipeline Visibility** ❌ 70/100 +
+📝 Remediation Steps + +**Measured**: basic config (Threshold: CI with best practices) + +**Evidence**: +- CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml +- Descriptive job/step names found +- Caching configured +- No parallelization detected + +Add or improve CI/CD pipeline configuration + +1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.) +2. Define jobs: lint, test, build +3. Use descriptive job and step names +4. Configure dependency caching +5. Enable parallel job execution +6. Upload artifacts: test results, coverage reports +7. Add status badge to README + +**Commands**: +```bash +# Create GitHub Actions workflow +mkdir -p .github/workflows +touch .github/workflows/ci.yml + +# Validate workflow +gh workflow view ci.yml +``` + +**Examples**: +``` +# .github/workflows/ci.yml - Good example + +name: CI Pipeline + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + lint: + name: Lint Code + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' # Caching + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Run linters + run: | + black --check . + isort --check . + ruff check . + + test: + name: Run Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Run tests with coverage + run: pytest --cov --cov-report=xml + + - name: Upload coverage reports + uses: codecov/codecov-action@v3 + with: + files: ./coverage.xml + + build: + name: Build Package + runs-on: ubuntu-latest + needs: [lint, test] # Runs after lint/test pass + steps: + - uses: actions/checkout@v4 + + - name: Build package + run: python -m build + + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: dist + path: dist/ + +``` + +
+ +![T3](https://img.shields.io/badge/T3-Architecture_Decision_Records_%28ADRs%29_82--100-green) **Architecture Decision Records (ADRs)** ✅ 82/100 + +![T3](https://img.shields.io/badge/T3-Issue_%26_Pull_Request_Templates_100--100-green) **Issue & Pull Request Templates** ✅ 100/100 + +![T3](https://img.shields.io/badge/T3-Cyclomatic_Complexity_Thresholds_N--A-lightgray) **Cyclomatic Complexity Thresholds** ⊘ + +![T3](https://img.shields.io/badge/T3-Semantic_Naming_N--A-lightgray) **Semantic Naming** ⊘ + +![T3](https://img.shields.io/badge/T3-Structured_Logging_N--A-lightgray) **Structured Logging** ⊘ + +![T4](https://img.shields.io/badge/T4-Code_Smell_Elimination_100--100-green) **Code Smell Elimination** ✅ 100/100 + +![T4](https://img.shields.io/badge/T4-Branch_Protection_Rules_N--A-lightgray) **Branch Protection Rules** ⊘ + +![T4](https://img.shields.io/badge/T4-Container%2FVirtualization_Setup_N--A-lightgray) **Container/Virtualization Setup** ⊘ + + +--- + +## 📝 Assessment Metadata + +- **AgentReady Version**: v2.30.1 +- **Research Version**: v1.0.1 +- **Repository Snapshot**: 1a8b60548803a227212e9f8ffc2d728781fd5aee +- **Assessment Duration**: 9.5s +- **Assessed By**: nthoen@nthoen-mac +- **Assessment Date**: April 10, 2026 at 9:21 AM + +🤖 Generated with [Claude Code](https://claude.com/claude-code) \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-latest.html b/docs/agentready-post-remediation/report-latest.html new file mode 120000 index 0000000..3387291 --- /dev/null +++ b/docs/agentready-post-remediation/report-latest.html @@ -0,0 +1 @@ +report-20260410-092152.html \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-latest.md b/docs/agentready-post-remediation/report-latest.md new file mode 120000 index 0000000..1a7aff4 --- /dev/null +++ b/docs/agentready-post-remediation/report-latest.md @@ -0,0 +1 @@ +report-20260410-092152.md \ No newline at end of file diff --git a/jest.setup.js b/jest.setup.js index ef9a34b..1a6a132 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,2 +1,4 @@ +process.env.TZ = process.env.TZ || 'EST'; + const { TextEncoder } = require('util'); global.TextEncoder = TextEncoder; \ No newline at end of file diff --git a/package.json b/package.json index 8b63082..a47aec0 100644 --- a/package.json +++ b/package.json @@ -16,49 +16,65 @@ "clean": "yarn workspace @patternfly/react-user-feedback clean", "lint:js": "node --max-old-space-size=4096 node_modules/.bin/eslint packages --ext js,jsx,ts,tsx --cache", "lint:md": "yarn eslint packages --ext md --no-eslintrc --config .eslintrc-md.json --cache", - "lint": "yarn lint:js && yarn lint:md", - "test": "echo 'Disabled JEST testing'", - "_test": "TZ=EST jest packages", + "lint:markdownlint": "markdownlint --dot -p .markdownlintignore \"**/*.md\"", + "lint": "yarn lint:js && yarn lint:md && yarn lint:markdownlint", + "lint-staged": "lint-staged", + "test": "TZ=EST jest packages", "test:a11y": "yarn workspace @patternfly/react-user-feedback test:a11y", "serve:a11y": "yarn workspace @patternfly/react-user-feedback serve:a11y", "prepare": "husky install" }, + "lint-staged": { + "packages/**/*.{js,jsx,ts,tsx}": [ + "prettier --write", + "eslint --cache --fix", + "jest --bail --findRelatedTests --passWithNoTests" + ], + "packages/**/*.md": [ + "prettier --write", + "eslint --no-eslintrc --config .eslintrc-md.json --cache --fix" + ], + "{README.md,CLAUDE.md,BOOKMARKS.md}": "prettier --write", + ".github/**/*.{yml,yaml}": "prettier --write" + }, "devDependencies": { - "babel-jest": "^29.2.2", "@babel/core": "^7.19.6", "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", "@babel/preset-flow": "^7.18.6", + "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", - "react": "^18", - "react-dom": "^18", - "typescript": "^4.7.4", - "@typescript-eslint/eslint-plugin": "^5.42.0", - "@typescript-eslint/parser": "^5.42.0", + "@testing-library/dom": "9.0.0", + "@testing-library/jest-dom": "5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "14.4.3", "@types/react": "^18", "@types/react-dom": "^18", + "@typescript-eslint/eslint-plugin": "^5.42.0", + "@typescript-eslint/parser": "^5.42.0", + "babel-jest": "^29.2.2", "concurrently": "^5.3.0", "eslint": "^8.0.1", + "eslint-config-prettier": "8.5.0", + "eslint-config-standard-with-typescript": "^23.0.0", "eslint-plugin-import": "^2.25.2", "eslint-plugin-markdown": "^1.0.2", - "eslint-plugin-prettier": "^3.1.4", - "eslint-plugin-react": "^7.21.4", - "eslint-config-standard-with-typescript": "^23.0.0", "eslint-plugin-n": "^15.0.0", + "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.21.4", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-config-prettier": "8.5.0", - "prettier": "2.7.1", - "jest": "^29.2.2", "husky": "^8.0.3", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "14.4.3", - "@testing-library/jest-dom": "5.16.5", - "@testing-library/dom": "9.0.0", - "jest-environment-jsdom": "^29.2.2", + "jest": "^29.2.2", "jest-canvas-mock": "^2.4.0", + "jest-environment-jsdom": "^29.2.2", + "lint-staged": "^15.4.3", + "markdownlint-cli": "0.44.0", + "prettier": "2.7.1", + "react": "^18", + "react-dom": "^18", + "rimraf": "^2.6.2", "serve": "^14.1.2", - "rimraf": "^2.6.2" + "typescript": "^4.7.4" }, "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/packages/module/patternfly-docs/generated/extensions/react-user-feedback/design-guidelines.js b/packages/module/patternfly-docs/generated/extensions/react-user-feedback/design-guidelines.js deleted file mode 100644 index 65b42b0..0000000 --- a/packages/module/patternfly-docs/generated/extensions/react-user-feedback/design-guidelines.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components'; - -const pageData = { - "id": "react-user-feedback", - "section": "extensions", - "subsection": "", - "source": "design-guidelines", - "tabName": null, - "slug": "/extensions/react-user-feedback/design-guidelines", - "sourceLink": "https://github.com/patternfly/patternfly-org/blob/main/packages/module/patternfly-docs/content/design-guidelines/design-guidelines.md", - "relPath": "packages/module/patternfly-docs/content/design-guidelines/design-guidelines.md" -}; -pageData.relativeImports = { - -}; -pageData.examples = { - -}; - -const Component = () => ( - -

- {`Design guidelines`} -

-

- {`COMING SOON!`} -

-
-); -Component.displayName = 'ExtensionsReactUserFeedbackDesignGuidelinesDocs'; -Component.pageData = pageData; - -export default Component; diff --git a/packages/module/patternfly-docs/generated/extensions/react-user-feedback/react.js b/packages/module/patternfly-docs/generated/extensions/react-user-feedback/react.js deleted file mode 100644 index 3b547fa..0000000 --- a/packages/module/patternfly-docs/generated/extensions/react-user-feedback/react.js +++ /dev/null @@ -1,111 +0,0 @@ -import React from 'react'; -import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components'; -import { FeedbackModal } from "@patternfly/react-user-feedback"; -import feedbackImage from '@patternfly/react-user-feedback/dist/esm/images/rh_feedback.svg'; -const pageData = { - "id": "react-user-feedback", - "section": "extensions", - "subsection": "", - "source": "react", - "tabName": null, - "slug": "/extensions/react-user-feedback/react", - "sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/module/patternfly-docs/content/examples/basic.md", - "relPath": "packages/module/patternfly-docs/content/examples/basic.md", - "propComponents": [ - { - "name": "FeedbackModalProps", - "description": "", - "props": [ - { - "name": "email", - "type": "string", - "description": "Email address for the user, if none is provided will default to asking for their email address." - }, - { - "name": "feedbackImg", - "type": "string", - "description": "Feedback image that shows up in the modal" - }, - { - "name": "feedbackLocale", - "type": "FeedbackLocale", - "description": "Optional prop to change the default english strings to a string of the user choice." - }, - { - "name": "isOpen", - "type": "boolean", - "description": "Indicates if the modal is visible or not.", - "required": true - }, - { - "name": "onClose", - "type": "() => void", - "description": "Optional call back that will be called when the user closes user feedback modal.", - "required": true - }, - { - "name": "onJoinMailingList", - "type": "string | ((email: string) => boolean)", - "description": "If a URL is given the join mailing list link will redirect to another site to join the mailing list. \nIf a function is provided we will display a join mailing list screen with a submit button. The callback function should return a boolean if the callback is successful or unsuccessful.\nIf it's undefined then report a bug will be removed from share feedback modal" - }, - { - "name": "onOpenSupportCase", - "type": "string", - "description": "URL to open a support case" - }, - { - "name": "onReportABug", - "type": "string | ((email:string, bug: string) => boolean)", - "description": "If a URL is given the report a bug link will redirect to another site to report the bug. \nIf a function is provided we will display a feedback screen with a submit button. The callback function should return a boolean if the callback is successful or unsuccessful.\nIf it's undefined then join mailing list will be removed from the share feedback modal" - }, - { - "name": "onShareFeedback", - "type": "string | ((email:string, feedback: string) => boolean)", - "description": "If a URL is given the share feedback link will redirect to another site share feedback. \nIf a function is provided we will display a share feedback screen with a submit button. The callback function should return a boolean if the callback is successful or unsuccessful.", - "required": true - } - ] - } - ], - "examples": [ - "Basic", - "Advanced", - "i18n" - ] -}; -pageData.liveContext = { - FeedbackModal, - feedbackImage -}; -pageData.relativeImports = { - -}; -pageData.examples = { - 'Basic': props => - {\n const [isOpen, setIsOpen] = React.useState(false);\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n setIsOpen(false)}/>\n \n}","title":"Basic","lang":"js"}}> - - , - 'Advanced': props => - {\n const [isOpen, setIsOpen] = React.useState(false);\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n \n // Example of a successful callback\n true\n }\n onJoinMailingList={()=>\n // Example of am unsuccessful callback\n false\n }\n onOpenSupportCase='http://www.redhat.com'\n feedbackImg={feedbackImage}\n isOpen={isOpen}\n onClose={()=>setIsOpen(false)}/>\n \n}","title":"Advanced","lang":"js"}}> - - , - 'i18n': props => - {\n const [isOpen, setIsOpen] = React.useState(false);\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n \n // Example of a successful callback\n true\n }\n onJoinMailingList={()=>\n true\n }\n onOpenSupportCase='http://www.redhat.com'\n onReportABug={()=>true}\n isOpen={isOpen}\n onClose={()=>setIsOpen(false)}/>\n \n}","title":"i18n","lang":"js"}}> - - -}; - -const Component = () => ( - - - {`Examples`} - - {React.createElement(pageData.examples["Basic"])} - {React.createElement(pageData.examples["Advanced"])} - {React.createElement(pageData.examples["i18n"])} - -); -Component.displayName = 'ExtensionsReactUserFeedbackReactDocs'; -Component.pageData = pageData; - -export default Component; diff --git a/packages/module/patternfly-docs/generated/extensions/user-feedback/design-guidelines.js b/packages/module/patternfly-docs/generated/extensions/user-feedback/design-guidelines.js deleted file mode 100644 index b075986..0000000 --- a/packages/module/patternfly-docs/generated/extensions/user-feedback/design-guidelines.js +++ /dev/null @@ -1,157 +0,0 @@ -import React from 'react'; -import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components'; -import srcImport0 from '../../../content/design-guidelines/./img/advanced-user-feedback.png'; -import srcImport1 from '../../../content/design-guidelines/./img/dropdown-selection.png'; -import srcImport2 from '../../../content/design-guidelines/./img/share-feedback.png'; -import srcImport3 from '../../../content/design-guidelines/./img/report-bug.png'; -import srcImport4 from '../../../content/design-guidelines/./img/research-opportunities.png'; -import srcImport5 from '../../../content/design-guidelines/./img/user-feedback-external-links.png'; -const pageData = { - "id": "User feedback", - "section": "extensions", - "subsection": "", - "deprecated": false, - "template": false, - "beta": false, - "demo": false, - "newImplementationLink": false, - "source": "design-guidelines", - "tabName": null, - "slug": "/extensions/user-feedback/design-guidelines", - "sourceLink": "https://github.com/patternfly/patternfly-org/blob/main/packages/module/patternfly-docs/content/design-guidelines/design-guidelines.md", - "relPath": "packages/module/patternfly-docs/content/design-guidelines/design-guidelines.md" -}; -pageData.examples = { - -}; - -const Component = () => ( - -

- {`Note: User feedback lives in its own package at `} - - {`@patternfly/react-user-feedback`} - - {`.`} -

-

- - {`User feedback`} - - {` is a modal component that products can use to collect asynchronous feedback from users.`} -

- - {`Elements`} - -

- - -

-
    -
  1. - - {`Title:`} - - {` Communicates the title of the modal.`} -
  2. -
  3. - - {`Description text:`} - - {` Provides a short description of the form's purpose.`} -
  4. -
  5. - - {`Image:`} - - {` Contributes to the modal's visual design.`} -
  6. -
  7. - - {`Selectable item:`} - - {` Provides one or more ways that users can leave feedback.`} -
  8. -
-

- {`Each of these elements can be customized to fit a product's needs.`} -

- - {`Behavior`} - -

- {`The user feedback modal may be accessed in your product's help menu.`} -

-

- {`For example, you can allow users to access the modal by selecting a masthead’s help icon and choosing “Share feedback” in the dropdown menu:`} -

-

- - -

- - {`Variations`} - - - {`Modal items open forms within the modal`} - -

- {`Selecting an item opens a form within the modal, which can submit data over the network.`} -

-

- {`Integrated forms can collect different kinds of feedback:`} -

-
    -
  • -

    - {`General feedback form`} -

    -

    - {`The general feedback form allows users to enter feedback into a text box and submit.`} -

    -

    - - -

    -
  • -
  • -

    - {`Bug report form`} -

    -

    - {`The bug report form allows users to enter feedback into a text box and submit. Its description directs users to a URL where they can submit a support ticket for critical issues.`} -

    -

    - - -

    -
  • -
  • -

    - {`User research opt-in form`} -

    -

    - {`The user research opt-in form allows users to enter their email address to participate in future research efforts.`} -

    -

    - - -

    -
  • -
- - {`Modal items link to external URLs`} - -

- {`Selecting an item redirects users to an external URL (like a qualtrics form) that opens in a separate tab.`} -

-

- - -

-
-); -Component.displayName = 'ExtensionsUserFeedbackDesignGuidelinesDocs'; -Component.pageData = pageData; - -export default Component; diff --git a/packages/module/patternfly-docs/generated/extensions/user-feedback/react.js b/packages/module/patternfly-docs/generated/extensions/user-feedback/react.js deleted file mode 100644 index 2945249..0000000 --- a/packages/module/patternfly-docs/generated/extensions/user-feedback/react.js +++ /dev/null @@ -1,184 +0,0 @@ -import React from 'react'; -import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components'; -import { FunctionComponent, useState } from 'react'; -import { FeedbackModal } from "@patternfly/react-user-feedback"; -import feedbackImage from '@patternfly/react-user-feedback/dist/esm/images/rh_feedback.svg'; -const pageData = { - "id": "User feedback", - "section": "extensions", - "subsection": "", - "deprecated": false, - "template": false, - "beta": false, - "demo": false, - "newImplementationLink": false, - "source": "react", - "tabName": null, - "slug": "/extensions/user-feedback/react", - "sourceLink": "https://github.com/patternfly/react-user-feedback/blob/c0c51c751abf0b798f511806409f25d2a2e87a60/packages/module/patternfly-docs/content/examples/basic.md", - "relPath": "packages/module/patternfly-docs/content/examples/basic.md", - "propComponents": [ - { - "name": "FeedbackModalProps", - "description": "", - "props": [ - { - "name": "email", - "type": "string", - "description": "Email address for the user, if none is passed in a user can still enter one in the modal." - }, - { - "name": "feedbackImg", - "type": "string", - "description": "Feedback image that shows up in the modal" - }, - { - "name": "feedbackLocale", - "type": "FeedbackLocale", - "description": "Optional prop to change the default english strings to a string of the user choice." - }, - { - "name": "isOpen", - "type": "boolean", - "description": "Indicates if the modal is visible or not.", - "required": true - }, - { - "name": "onClose", - "type": "() => void", - "description": "Optional call back that will be called when the user closes user feedback modal.", - "required": true - }, - { - "name": "onJoinMailingList", - "type": "string | ((email: string) => boolean | Promise)", - "description": "If a URL is given the join mailing list link will redirect to another site to join the mailing list.\nIf a function is provided we will display a join mailing list screen with a submit button. The callback function should return a boolean or a Promise if the callback is successful or unsuccessful.\nIf it's undefined then report a bug will be removed from share feedback modal" - }, - { - "name": "onOpenSupportCase", - "type": "string", - "description": "URL to open a support case" - }, - { - "name": "onReportABug", - "type": "string | ((email: string, bug: string) => boolean | Promise)", - "description": "If a URL is given the report a bug link will redirect to another site to report the bug.\nIf a function is provided we will display a feedback screen with a submit button. The callback function should return a boolean or a Promise\nif the callback is successful or unsuccessful.\nIf it's undefined then join mailing list will be removed from the share feedback modal" - }, - { - "name": "onShareFeedback", - "type": "string | ((email: string, feedback: string) => boolean | Promise)", - "description": "If a URL is given the share feedback link will redirect to another site share feedback.\nIf a function is provided we will display a share feedback screen with a submit button. The callback function should return a boolean or a Promise if the callback is successful or unsuccessful.", - "required": true - } - ] - } - ], - "examples": [ - "Basic modal", - "Advanced modal", - "Advanced that autofills an email address", - "Modal with asynchronous call support", - "Modal with internationalization support" - ] -}; -pageData.liveContext = { - FunctionComponent, - useState, - FeedbackModal, - feedbackImage -}; -pageData.examples = { - 'Basic modal': props => - {\n const [isOpen, setIsOpen] = React.useState(false);\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n setIsOpen(false)}/>\n \n}","title":"Basic modal","lang":"js","className":""}}> - -

- {`To collect data, you can link modal items to external sources instead of a built in form. For example, you can link to a custom form, which will be opened in a new tab.`} -

-
, - 'Advanced modal': props => - {\n const [isOpen, setIsOpen] = useState(false);\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n {\n // Example of a successful callback\n console.log (`Email Address: ${email} Feedback: ${feedback}`);\n return true\n }}\n onJoinMailingList={(email:string)=>{\n // Example of am unsuccessful callback\n console.log (`Email Address: ${email}`);\n return false;\n }}\n onOpenSupportCase='https://pf-user-feedback-extension-form-demos.surge.sh/requestSupport.html'\n onReportABug={(email:string, bug:string)=>{\n console.log (`Email Address: ${email} Bug: ${bug}`)\n return true;}}\n feedbackImg={feedbackImage}\n isOpen={isOpen}\n onClose={()=>setIsOpen(false)}/>\n \n}","title":"Advanced modal","lang":"js","className":""}}> - -

- {`User feedback offers additional modal items that support different types of feedback. To allow users to report a bug, use the `} - - - {`onReportABug`} - - {` property. To allow users to join a mailing list, such as one dedicated to future research participation, use the `} - - - {`onJoinMailingList`} - - {` property. To allow users to open a support case, use the `} - - - {`onOpenSupportCase`} - - {` property and link users to your support team.`} -

- -

- {`The following example demonstrates each of these modal items. The "Share feedback", "Report a bug", and "Inform the direction of products" items all point to built-in forms.`} -

-
, - 'Advanced that autofills an email address': props => - {\n const [isOpen, setIsOpen] = useState(false);\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n {\n // Example of a successful callback\n console.log (`Email Address: ${email} Feedback: ${feedback}`);\n return true\n }}\n onJoinMailingList={(email:string)=>{\n // Example of am unsuccessful callback\n console.log (`Email Address: ${email}`);\n return false;\n }}\n onOpenSupportCase='https://pf-user-feedback-extension-form-demos.surge.sh/requestSupport.html'\n onReportABug={(email:string, bug:string)=>{\n console.log (`Email Address: ${email} Bug: ${bug}`)\n return true;}}\n feedbackImg={feedbackImage}\n isOpen={isOpen}\n onClose={()=>setIsOpen(false)}/>\n \n}","title":"Advanced that autofills an email address","lang":"js","className":""}}> - -

- {`To automatically pass a user's email address into a feedback modal, use the email property. This allows you to pre-populate the modal's email field.`} -

-
, - 'Modal with asynchronous call support': props => - {\n const [isOpen, setIsOpen] = useState(false);\n\n const fakeNetworkCall = (email:string, feedback:string, bug:string) => new Promise(resolve => {\n setTimeout(() => {\n console.log(`Email Address: ${email} Feedback: ${feedback} Bug: ${bug}`);\n console.log('Network call complete successfully so return true');\n resolve(true);\n }, 2000);\n })\n \n const simulatedAsyncCall = async (email='', feedback='', bug='') => {\n console.log('simulatedAsyncCall');\n const result = await fakeNetworkCall(email, feedback, bug);\n return result;\n }\n \n\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n simulatedAsyncCall(email, feedback)}\n onJoinMailingList={(email:string)=>simulatedAsyncCall(email)}\n onOpenSupportCase='https://pf-user-feedback-extension-form-demos.surge.sh/requestSupport.html'\n onReportABug={(email:string, bug:string)=>simulatedAsyncCall(email, '', bug)}\n isOpen={isOpen}\n onClose={()=>setIsOpen(false)}/>\n \n}","title":"Modal with asynchronous call support","lang":"js","className":""}}> - -

- {`User feedback supports the ability to make asynchronous calls to send data collected from the modal to a backend service. -The following example demonstrates how to use the `} - - - {`async`} - - {` function to send data to a backend service.`} -

-
, - 'Modal with internationalization support': props => - {\n const [isOpen, setIsOpen] = React.useState(false);\n const handleButtonClicked = () => {setIsOpen(true)}; \n return <>\n \n \n // Example of a successful callback\n true\n }\n onJoinMailingList={()=>\n true\n }\n onOpenSupportCase='https://pf-user-feedback-extension-form-demos.surge.sh/requestSupport.html'\n onReportABug={()=>true}\n isOpen={isOpen}\n onClose={()=>setIsOpen(false)}/>\n \n}","title":"Modal with internationalization support","lang":"js","className":""}}> - -

- {`To customize the content displayed in the feedback modal, pass in a custom `} - - - {`i18n`} - - {` object with values for each property of `} - - - {``} - - {`. This allows you to prepare a modal for different languages and requirements.`} -

-
-}; - -const Component = () => ( - - - {`About`} - -

- {`The user feedback extension is a PatternFly React based component used to collect user feedback. Examples of how to use this extension are documented below. This extensions allows users to submit feedback, report a bug, request support, as well as join a mailing list to stay updated on the latest news and research opportunities.`} -

- - {`Examples`} - - {React.createElement(pageData.examples["Basic modal"])} - {React.createElement(pageData.examples["Advanced modal"])} - {React.createElement(pageData.examples["Advanced that autofills an email address"])} - {React.createElement(pageData.examples["Modal with asynchronous call support"])} - {React.createElement(pageData.examples["Modal with internationalization support"])} -
-); -Component.displayName = 'ExtensionsUserFeedbackReactDocs'; -Component.pageData = pageData; - -export default Component; diff --git a/packages/module/patternfly-docs/generated/index.js b/packages/module/patternfly-docs/generated/index.js deleted file mode 100644 index dfc5ecd..0000000 --- a/packages/module/patternfly-docs/generated/index.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - '/extensions/user-feedback/react': { - id: "User feedback", - title: "User feedback", - toc: [{"text":"About"},{"text":"Examples"},[{"text":"Basic modal"},{"text":"Advanced modal"},{"text":"Advanced that autofills an email address"},{"text":"Modal with asynchronous call support"},{"text":"Modal with internationalization support"}]], - examples: ["Basic modal","Advanced modal","Advanced that autofills an email address","Modal with asynchronous call support","Modal with internationalization support"], - section: "extensions", - subsection: "", - source: "react", - tabName: null, - Component: () => import(/* webpackChunkName: "extensions/user-feedback/react/index" */ './extensions/user-feedback/react') - }, - '/extensions/user-feedback/design-guidelines': { - id: "User feedback", - title: "User feedback", - toc: [{"text":"Elements"},{"text":"Behavior"},{"text":"Variations"},[{"text":"Modal items open forms within the modal"},{"text":"Modal items link to external URLs"}]], - section: "extensions", - subsection: "", - source: "design-guidelines", - tabName: null, - Component: () => import(/* webpackChunkName: "extensions/user-feedback/design-guidelines/index" */ './extensions/user-feedback/design-guidelines') - } -}; \ No newline at end of file diff --git a/packages/module/src/__tests__/smoke.test.ts b/packages/module/src/__tests__/smoke.test.ts new file mode 100644 index 0000000..66ac512 --- /dev/null +++ b/packages/module/src/__tests__/smoke.test.ts @@ -0,0 +1,5 @@ +describe('react-user-feedback', () => { + it('runs Jest for this package', () => { + expect(true).toBe(true); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..bf0d937 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "./packages/module/tsconfig.json", + "compilerOptions": { + "noEmit": true + } +} diff --git a/yarn.lock b/yarn.lock index 86b390c..7cd8b78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2005,6 +2005,18 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -2480,6 +2492,11 @@ resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-6.2.2.tgz#4ab12cf77fab60a730f52aed2433dbf892d47509" integrity sha512-2GRWDPBTrcTlGNFc5NPJjrjEVU90RpgcGX/CIe2MplLgM32tpVIkeUtqIoJPLRk5GrbhyFuHJYRU+O93gU4o3Q== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@polka/url@^1.0.0-next.20": version "1.0.0-next.28" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" @@ -2667,6 +2684,13 @@ dependencies: "@types/node" "*" +"@types/debug@^4.0.0": + version "4.1.13" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.13.tgz#22d1cc9d542d3593caea764f974306ab36286ee7" + integrity sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw== + dependencies: + "@types/ms" "*" + "@types/eslint-scope@^3.7.3": version "3.7.7" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" @@ -2816,6 +2840,11 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/katex@^0.16.0": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.8.tgz#80bf3e0814d09a846412a0b0f140946b79c36c3e" + integrity sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg== + "@types/mdast@^3.0.0": version "3.0.15" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" @@ -2833,6 +2862,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + "@types/node-forge@^1.3.0": version "1.3.11" resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" @@ -3411,6 +3445,13 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" +ansi-escapes@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz#5395bb74b2150a4a1d6e3c2565f4aeca78d28627" + integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== + dependencies: + environment "^1.0.0" + ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" @@ -3436,6 +3477,11 @@ ansi-regex@^6.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== +ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -3455,6 +3501,11 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" @@ -3988,6 +4039,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +brace-expansion@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.3.tgz#0493338bdd58e319b1039c67cf7ee439892c01d9" + integrity sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" @@ -4290,6 +4348,11 @@ chalk@^5.0.1: resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== +chalk@^5.4.1: + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + change-case@^3.0.1: version "3.1.0" resolved "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz" @@ -4329,16 +4392,31 @@ character-entities-legacy@^1.0.0: resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + character-entities@^1.0.0: version "1.2.4" resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + character-reference-invalid@^1.0.0: version "1.1.4" resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4473,11 +4551,26 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + cli-spinners@^1.0.1: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + cli-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" @@ -4637,7 +4730,7 @@ colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -colorette@^2.0.10, colorette@^2.0.14: +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -4659,6 +4752,11 @@ commander@4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^13.1.0, commander@~13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + commander@^2.19.0, commander@^2.20.0, commander@^2.9.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -4924,6 +5022,15 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -5086,6 +5193,13 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.0.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + debug@^4.4.0: version "4.4.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" @@ -5103,6 +5217,13 @@ decimal.js@^10.4.2: resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decode-named-character-reference@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz#3e40603760874c2e5867691b599d73a7da25b53f" + integrity sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q== + dependencies: + character-entities "^2.0.0" + decode-uri-component@^0.2.0: version "0.2.2" resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" @@ -5266,6 +5387,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -5298,6 +5424,13 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +devlop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + devtools-protocol@0.0.1001819: version "0.0.1001819" resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1001819.tgz" @@ -5465,6 +5598,11 @@ emittery@^0.13.1: resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" @@ -5537,6 +5675,11 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" @@ -5983,6 +6126,11 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" + integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== + events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -6016,6 +6164,21 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -6470,6 +6633,14 @@ for-in@^1.0.2: resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" @@ -6617,6 +6788,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz#ce7008fe345edcf5497a6f557cfa54bc318a9ce7" + integrity sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" @@ -6659,6 +6835,11 @@ get-stream@^6.0.0: resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" @@ -6758,6 +6939,18 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@~10.4.5: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -7233,6 +7426,11 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -7294,6 +7492,11 @@ ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@~7.0.3: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + image-size@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" @@ -7358,6 +7561,11 @@ ini@^1.3.3, ini@^1.3.4, ini@~1.3.0: resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@~4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" @@ -7450,6 +7658,11 @@ is-alphabetical@^1.0.0: resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + is-alphanumeric@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" @@ -7463,6 +7676,14 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -7574,6 +7795,11 @@ is-decimal@^1.0.0: resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" @@ -7629,6 +7855,18 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" + integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== + dependencies: + get-east-asian-width "^1.3.1" + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" @@ -7646,6 +7884,11 @@ is-hexadecimal@^1.0.0: resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + is-inside-container@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" @@ -7815,6 +8058,11 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" @@ -8003,6 +8251,15 @@ istextorbinary@^2.2.1: editions "^2.2.0" textextensions "^2.5.0" +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-canvas-mock@^2.4.0: version "2.5.0" resolved "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.0.tgz" @@ -8428,6 +8685,13 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +js-yaml@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" @@ -8517,7 +8781,7 @@ json5@^2.1.2, json5@^2.2.1, json5@^2.2.3: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.0.0: +jsonc-parser@^3.0.0, jsonc-parser@~3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== @@ -8538,6 +8802,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonpointer@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.3" resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" @@ -8553,6 +8822,13 @@ junit-xml@^1.2.0: dependencies: xml "^1.0.1" +katex@^0.16.0: + version "0.16.45" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.45.tgz#ba60d39c54746b6b8d39ce0e7f6eace07143149c" + integrity sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA== + dependencies: + commander "^8.3.0" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" @@ -8628,11 +8904,51 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + +lint-staged@^15.4.3: + version "15.5.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.5.2.tgz#beff028fd0681f7db26ffbb67050a21ed4d059a3" + integrity sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w== + dependencies: + chalk "^5.4.1" + commander "^13.1.0" + debug "^4.4.0" + execa "^8.0.1" + lilconfig "^3.1.3" + listr2 "^8.2.5" + micromatch "^4.0.8" + pidtree "^0.6.0" + string-argv "^0.3.2" + yaml "^2.7.0" + +listr2@^8.2.5: + version "8.3.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.3.3.tgz#815fc8f738260ff220981bf9e866b3e11e8121bf" + integrity sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -8703,6 +9019,17 @@ log-symbols@^2.1.0: dependencies: chalk "^2.0.1" +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + longest-streak@^2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" @@ -8836,6 +9163,18 @@ markdown-escapes@^1.0.0: resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== +markdown-it@14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + markdown-table@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" @@ -8843,6 +9182,37 @@ markdown-table@^2.0.0: dependencies: repeat-string "^1.0.0" +markdownlint-cli@0.44.0: + version "0.44.0" + resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.44.0.tgz#02b24c8a20972c50d124a6cafdeca3beb085a1ce" + integrity sha512-ZJTAONlvF9NkrIBltCdW15DxN9UTbPiKMEqAh2EU2gwIFlrCMavyCEPPO121cqfYOrLUJWW8/XKWongstmmTeQ== + dependencies: + commander "~13.1.0" + glob "~10.4.5" + ignore "~7.0.3" + js-yaml "~4.1.0" + jsonc-parser "~3.3.1" + jsonpointer "~5.0.1" + markdownlint "~0.37.4" + minimatch "~9.0.5" + run-con "~1.3.2" + smol-toml "~1.3.1" + +markdownlint@~0.37.4: + version "0.37.4" + resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.37.4.tgz#dd58c4a13b798d4702438e5f7fd587a219f753f6" + integrity sha512-u00joA/syf3VhWh6/ybVFkib5Zpj2e5KB/cfCei8fkSRuums6nyisTWGqjTWIOFoFwuXoTBQQiqlB4qFKp8ncQ== + dependencies: + markdown-it "14.1.0" + micromark "4.0.1" + micromark-core-commonmark "2.0.2" + micromark-extension-directive "3.0.2" + micromark-extension-gfm-autolink-literal "2.1.0" + micromark-extension-gfm-footnote "2.1.0" + micromark-extension-gfm-table "2.1.0" + micromark-extension-math "3.1.0" + micromark-util-types "2.0.1" + marked@^4.0.16: version "4.3.0" resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" @@ -8888,6 +9258,11 @@ mdurl@1.0.1, mdurl@^1.0.0: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -8923,6 +9298,278 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromark-core-commonmark@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-core-commonmark@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4" + integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz#2eb61985d1995a7c1ff7621676a4f32af29409e8" + integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-gfm-autolink-literal@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz#5cadedfbb29fca7abf752447967003dc3b6583c9" + integrity sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-math@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz#c42ee3b1dd5a9a03584e83dd8f08e3de510212c1" + integrity sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg== + dependencies: + "@types/katex" "^0.16.0" + devlop "^1.0.0" + katex "^0.16.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee" + integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== + +micromark-util-types@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== + +micromark@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromatch@^3.0.4: version "3.1.10" resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" @@ -8942,7 +9589,7 @@ micromatch@^3.0.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: +micromatch@^4.0.2, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -9002,6 +9649,16 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -9045,7 +9702,14 @@ minimatch@^7.3.0: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: +minimatch@^9.0.4, minimatch@~9.0.5: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== + dependencies: + brace-expansion "^2.0.2" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -9060,6 +9724,11 @@ minipass@^4.2.4: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +minipass@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + mississippi@^1.2.0, mississippi@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.1.tgz#2a8bb465e86550ac8b36a7b6f45599171d78671e" @@ -9381,6 +10050,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -9545,6 +10221,20 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + open@^10.0.3: version "10.1.2" resolved "https://registry.yarnpkg.com/open/-/open-10.1.2.tgz#d5df40984755c9a9c3c93df8156a12467e882925" @@ -9721,6 +10411,11 @@ pac-resolver@^7.0.1: degenerator "^5.0.0" netmask "^2.0.2" +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -9813,6 +10508,19 @@ parse-entities@^1.1.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + parse-git-config@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-0.2.0.tgz#272833fdd15fea146fb75d336d236b963b6ff706" @@ -9933,12 +10641,17 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.5.0: +path-scurry@^1.11.1, path-scurry@^1.5.0: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -9991,6 +10704,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -10334,6 +11052,11 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + punycode@^1.3.2: version "1.4.1" resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" @@ -10991,6 +11714,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + ret@~0.1.10: version "0.1.15" resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" @@ -11011,6 +11742,11 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rimraf@3.0.2, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" @@ -11035,6 +11771,16 @@ run-async@^2.2.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-con@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/run-con/-/run-con-1.3.2.tgz#755860a10ce326a96b509485fcea50b4d03754e8" + integrity sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg== + dependencies: + deep-extend "^0.6.0" + ini "~4.1.0" + minimist "^1.2.8" + strip-json-comments "~3.1.1" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -11425,6 +12171,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -11470,6 +12221,22 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" + integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + smart-buffer@^1.0.13: version "1.1.15" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" @@ -11480,6 +12247,11 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +smol-toml@~1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.3.4.tgz#4ec76e0e709f586bc50ba30eb79024173c2b2221" + integrity sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA== + snake-case@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz" @@ -11777,6 +12549,11 @@ streamx@^2.21.0: optionalDependencies: bare-events "^2.2.0" +string-argv@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" @@ -11785,6 +12562,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -11820,6 +12606,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" @@ -11880,6 +12675,13 @@ stringify-entities@^3.0.0, stringify-entities@^3.0.1: character-entities-legacy "^1.0.0" xtend "^4.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -11908,6 +12710,13 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-ansi@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" @@ -11928,6 +12737,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" @@ -11935,7 +12749,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -12415,6 +13229,11 @@ typescript@4.7.4, typescript@^4.7.4: resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + uglify-js@^3.1.4: version "3.19.3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" @@ -13198,6 +14017,15 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" @@ -13216,7 +14044,7 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1: +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== @@ -13225,6 +14053,15 @@ wrap-ansi@^8.0.1: string-width "^5.0.1" strip-ansi "^7.0.1" +wrap-ansi@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" @@ -13334,6 +14171,11 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^2.7.0: + version "2.8.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.3.tgz#a0d6bd2efb3dd03c59370223701834e60409bd7d" + integrity sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" From 71796a86eea549ca406b73c0cbc9af914d5efde8 Mon Sep 17 00:00:00 2001 From: nicolethoen Date: Fri, 10 Apr 2026 10:51:35 -0400 Subject: [PATCH 3/5] fix lint issues in gh actions --- .github/workflows/build-lint-test.yml | 16 ++++++++-------- .github/workflows/build.yml | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-lint-test.yml b/.github/workflows/build-lint-test.yml index 0e630e5..b342fcb 100644 --- a/.github/workflows/build-lint-test.yml +++ b/.github/workflows/build-lint-test.yml @@ -18,9 +18,9 @@ jobs: steps: - uses: actions/checkout@v4 - run: | - if [[ ! -z "${GH_PR_NUM}" ]]; then + if [[ -n "${GH_PR_NUM}" ]]; then echo "Checking out PR" - git fetch origin pull/$GH_PR_NUM/head:tmp + git fetch origin "pull/${GH_PR_NUM}/head:tmp" git checkout tmp fi - uses: actions/setup-node@v4 @@ -54,9 +54,9 @@ jobs: steps: - uses: actions/checkout@v4 - run: | - if [[ ! -z "${GH_PR_NUM}" ]]; then + if [[ -n "${GH_PR_NUM}" ]]; then echo "Checking out PR" - git fetch origin pull/$GH_PR_NUM/head:tmp + git fetch origin "pull/${GH_PR_NUM}/head:tmp" git checkout tmp fi - uses: actions/setup-node@v4 @@ -91,9 +91,9 @@ jobs: - uses: actions/checkout@v4 # Yes, we really want to checkout the PR - run: | - if [[ ! -z "${GH_PR_NUM}" ]]; then + if [[ -n "${GH_PR_NUM}" ]]; then echo "Checking out PR" - git fetch origin pull/$GH_PR_NUM/head:tmp + git fetch origin "pull/${GH_PR_NUM}/head:tmp" git checkout tmp fi - uses: actions/setup-node@v4 @@ -132,9 +132,9 @@ jobs: - uses: actions/checkout@v4 # Yes, we really want to checkout the PR - run: | - if [[ ! -z "${GH_PR_NUM}" ]]; then + if [[ -n "${GH_PR_NUM}" ]]; then echo "Checking out PR" - git fetch origin pull/$GH_PR_NUM/head:tmp + git fetch origin "pull/${GH_PR_NUM}/head:tmp" git checkout tmp fi - uses: actions/setup-node@v4 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 561b976..d2fb6e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,9 +9,9 @@ jobs: steps: - uses: actions/checkout@v4 - run: | - if [[ ! -z "${GH_PR_NUM}" ]]; then + if [[ -n "${GH_PR_NUM}" ]]; then echo "Checking out PR" - git fetch origin pull/$GH_PR_NUM/head:tmp + git fetch origin "pull/${GH_PR_NUM}/head:tmp" git checkout tmp fi - uses: actions/cache@v4 From 03cc6a72385d1979c7579d540a8b945465b189b0 Mon Sep 17 00:00:00 2001 From: nicolethoen Date: Fri, 10 Apr 2026 10:53:15 -0400 Subject: [PATCH 4/5] remove agent ready reports --- .../assessment-20260409-161920.json | 1041 ------ .../assessment-latest.json | 1 - .../report-20260409-161920.html | 2889 ----------------- .../report-20260409-161920.md | 844 ----- docs/agentready-baseline/report-latest.html | 1 - docs/agentready-baseline/report-latest.md | 1 - .../assessment-20260410-092152.json | 778 ----- .../assessment-latest.json | 1 - .../report-20260410-092152.html | 2431 -------------- .../report-20260410-092152.md | 417 --- .../report-latest.html | 1 - .../report-latest.md | 1 - 12 files changed, 8406 deletions(-) delete mode 100644 docs/agentready-baseline/assessment-20260409-161920.json delete mode 120000 docs/agentready-baseline/assessment-latest.json delete mode 100644 docs/agentready-baseline/report-20260409-161920.html delete mode 100644 docs/agentready-baseline/report-20260409-161920.md delete mode 120000 docs/agentready-baseline/report-latest.html delete mode 120000 docs/agentready-baseline/report-latest.md delete mode 100644 docs/agentready-post-remediation/assessment-20260410-092152.json delete mode 120000 docs/agentready-post-remediation/assessment-latest.json delete mode 100644 docs/agentready-post-remediation/report-20260410-092152.html delete mode 100644 docs/agentready-post-remediation/report-20260410-092152.md delete mode 120000 docs/agentready-post-remediation/report-latest.html delete mode 120000 docs/agentready-post-remediation/report-latest.md diff --git a/docs/agentready-baseline/assessment-20260409-161920.json b/docs/agentready-baseline/assessment-20260409-161920.json deleted file mode 100644 index 0a5c09e..0000000 --- a/docs/agentready-baseline/assessment-20260409-161920.json +++ /dev/null @@ -1,1041 +0,0 @@ -{ - "schema_version": "1.0.0", - "metadata": { - "agentready_version": "2.30.1", - "research_version": "1.0.1", - "assessment_timestamp": "2026-04-09T16:19:20.792448", - "assessment_timestamp_human": "April 09, 2026 at 4:19 PM", - "executed_by": "nthoen@nthoen-mac", - "command": "/Library/Frameworks/Python.framework/Versions/3.12/bin/agentready assess . -o docs/agentready-baseline -v", - "working_directory": "/Users/nthoen/Projects/react-user-feedback" - }, - "repository": { - "path": "/Users/nthoen/Projects/react-user-feedback", - "name": "react-user-feedback", - "url": "git@github.com:patternfly/react-user-feedback.git", - "branch": "main", - "commit_hash": "402ab4199df0bb24c1bb6d32d414eb331e3e743c", - "languages": { - "JSON": 8, - "YAML": 6, - "Markdown": 3, - "JavaScript": 20, - "TypeScript": 15 - }, - "total_files": 74, - "total_lines": 25342 - }, - "timestamp": "2026-04-09T16:19:20.792448", - "overall_score": 45.9, - "certification_level": "Bronze", - "attributes_assessed": 18, - "attributes_skipped": 7, - "attributes_total": 25, - "findings": [ - { - "attribute": { - "id": "claude_md_file", - "name": "CLAUDE.md Configuration Files", - "category": "Context Window Optimization", - "tier": 1, - "description": "Project-specific configuration for Claude Code", - "criteria": "CLAUDE.md file exists in repository root", - "default_weight": 0.1 - }, - "status": "fail", - "score": 0.0, - "measured_value": "missing", - "threshold": "present", - "evidence": [ - "CLAUDE.md not found in repository root", - "AGENTS.md not found (alternative)" - ], - "remediation": { - "summary": "Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants", - "steps": [ - "Choose one of three approaches:", - " Option 1: Create standalone CLAUDE.md (>50 bytes) with project context", - " Option 2: Create AGENTS.md and symlink CLAUDE.md to it (cross-tool compatibility)", - " Option 3: Create AGENTS.md and reference it with @AGENTS.md in minimal CLAUDE.md", - "Add project overview and purpose", - "Document key architectural patterns", - "Specify coding standards and conventions", - "Include build/test/deployment commands", - "Add any project-specific context that helps AI assistants" - ], - "tools": [], - "commands": [ - "# Option 1: Standalone CLAUDE.md", - "touch CLAUDE.md", - "# Add content describing your project", - "", - "# Option 2: Symlink CLAUDE.md to AGENTS.md", - "touch AGENTS.md", - "# Add content to AGENTS.md", - "ln -s AGENTS.md CLAUDE.md", - "", - "# Option 3: @ reference in CLAUDE.md", - "echo '@AGENTS.md' > CLAUDE.md", - "touch AGENTS.md", - "# Add content to AGENTS.md" - ], - "examples": [ - "# Standalone CLAUDE.md (Option 1)\n\n## Overview\nBrief description of what this project does.\n\n## Architecture\nKey patterns and structure.\n\n## Development\n```bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build\nnpm run build\n```\n\n## Coding Standards\n- Use TypeScript strict mode\n- Follow ESLint configuration\n- Write tests for new features\n", - "# CLAUDE.md with @ reference (Option 3)\n@AGENTS.md\n", - "# AGENTS.md (shared by multiple tools)\n\n## Project Overview\nThis project implements a REST API for user management.\n\n## Architecture\n- Layered architecture: controllers, services, repositories\n- PostgreSQL database with SQLAlchemy ORM\n- FastAPI web framework\n\n## Development Workflow\n```bash\n# Setup\npython -m venv .venv\nsource .venv/bin/activate\npip install -e .\n\n# Run tests\npytest\n\n# Start server\nuvicorn app.main:app --reload\n```\n\n## Code Conventions\n- Use type hints for all functions\n- Follow PEP 8 style guide\n- Write docstrings for public APIs\n- Maintain >80% test coverage\n" - ], - "citations": [ - { - "source": "Anthropic", - "title": "Claude Code Documentation", - "url": "https://docs.anthropic.com/claude-code", - "relevance": "Official guidance on CLAUDE.md configuration" - }, - { - "source": "agents.md", - "title": "AGENTS.md Specification", - "url": "https://agents.md/", - "relevance": "Emerging standard for cross-tool AI assistant configuration" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "readme_structure", - "name": "README Structure", - "category": "Documentation Standards", - "tier": 1, - "description": "Well-structured README with key sections", - "criteria": "README.md with installation, usage, and development sections", - "default_weight": 0.1 - }, - "status": "pass", - "score": 100.0, - "measured_value": "3/3 sections", - "threshold": "3/3 sections", - "evidence": [ - "Found 3/3 essential sections", - "Installation: \u2713", - "Usage: \u2713", - "Development: \u2713" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "type_annotations", - "name": "Type Annotations", - "category": "Code Quality", - "tier": 1, - "description": "Type hints in function signatures", - "criteria": ">80% of functions have type annotations", - "default_weight": 0.1 - }, - "status": "fail", - "score": 0.0, - "measured_value": "missing tsconfig.json", - "threshold": "strict mode enabled", - "evidence": [ - "tsconfig.json not found" - ], - "remediation": { - "summary": "Add type annotations to function signatures", - "steps": [ - "For Python: Add type hints to function parameters and return types", - "For TypeScript: Enable strict mode in tsconfig.json", - "Use mypy or pyright for Python type checking", - "Use tsc --strict for TypeScript", - "Add type annotations gradually to existing code" - ], - "tools": [ - "mypy", - "pyright", - "typescript" - ], - "commands": [ - "# Python", - "pip install mypy", - "mypy --strict src/", - "", - "# TypeScript", - "npm install --save-dev typescript", - "echo '{\"compilerOptions\": {\"strict\": true}}' > tsconfig.json" - ], - "examples": [ - "# Python - Before\ndef calculate(x, y):\n return x + y\n\n# Python - After\ndef calculate(x: float, y: float) -> float:\n return x + y\n", - "// TypeScript - tsconfig.json\n{\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true,\n \"strictNullChecks\": true\n }\n}\n" - ], - "citations": [ - { - "source": "Python.org", - "title": "Type Hints", - "url": "https://docs.python.org/3/library/typing.html", - "relevance": "Official Python type hints documentation" - }, - { - "source": "TypeScript", - "title": "TypeScript Handbook", - "url": "https://www.typescriptlang.org/docs/handbook/2/everyday-types.html", - "relevance": "TypeScript type system guide" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "standard_layout", - "name": "Standard Project Layouts", - "category": "Repository Structure", - "tier": 1, - "description": "Follows standard project structure for language", - "criteria": "Standard directories (src/ or project-named, tests/) present", - "default_weight": 0.1 - }, - "status": "fail", - "score": 0.0, - "measured_value": "0/2 directories", - "threshold": "2/2 directories", - "evidence": [ - "Found 0/2 standard directories", - "source directory: \u2717 (no src/ or project-named dir)", - "tests/: \u2717" - ], - "remediation": { - "summary": "Organize code into standard directories", - "steps": [ - "Create a source directory for your code", - "Option A: Use src/ layout (recommended for packages)", - "Option B: Use project-named directory (e.g., mypackage/)", - "Ensure your package has __init__.py", - "Create tests/ directory for test files", - "Add at least one test file" - ], - "tools": [], - "commands": [ - "# Option A: src layout", - "mkdir -p src/mypackage", - "touch src/mypackage/__init__.py", - "# ---", - "# Option B: flat layout (project-named)", - "mkdir -p mypackage", - "touch mypackage/__init__.py", - "# Create tests directory", - "mkdir -p tests", - "touch tests/__init__.py", - "touch tests/test_example.py" - ], - "examples": [ - "# src layout (recommended for distributable packages)\nproject/\n\u251c\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n\n# flat layout (common in major projects like pandas, numpy)\nproject/\n\u251c\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n" - ], - "citations": [ - { - "source": "Python Packaging Authority", - "title": "src layout vs flat layout", - "url": "https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/", - "relevance": "Official guidance on Python project layouts" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "lock_files", - "name": "Dependency Pinning for Reproducibility", - "category": "Dependency Management", - "tier": 1, - "description": "Dependencies pinned to exact versions in lock files", - "criteria": "Lock file with pinned versions, updated within 6 months", - "default_weight": 0.1 - }, - "status": "pass", - "score": 100.0, - "measured_value": "yarn.lock", - "threshold": "lock file with pinned versions, < 6 months old", - "evidence": [ - "Found lock file(s): yarn.lock" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "dependency_security", - "name": "Dependency Security & Vulnerability Scanning", - "category": "Security", - "tier": 1, - "description": "Security scanning tools configured for dependencies and code", - "criteria": "Dependabot, Renovate, CodeQL, or SAST tools configured; secret detection enabled", - "default_weight": 0.04 - }, - "status": "pass", - "score": 35, - "measured_value": "Security tools configured: Renovate", - "threshold": "\u226560 points (Dependabot/Renovate + SAST or multiple scanners)", - "evidence": [ - "\u2713 Renovate configured for dependency updates", - " Meaningful Renovate configuration detected" - ], - "remediation": { - "summary": "Add more security scanning tools for comprehensive coverage", - "steps": [ - "Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)", - "Add CodeQL scanning workflow for SAST", - "Configure secret detection (detect-secrets, gitleaks)", - "Set up language-specific scanners (pip-audit, npm audit, Snyk)" - ], - "tools": [ - "Dependabot", - "Renovate", - "CodeQL", - "detect-secrets", - "pip-audit", - "npm audit" - ], - "commands": [ - "gh repo edit --enable-security", - "pip install detect-secrets # Python secret detection", - "npm audit # JavaScript dependency audit" - ], - "examples": [ - "# .github/dependabot.yml\nversion: 2\nupdates:\n - package-ecosystem: pip\n directory: /\n schedule:\n interval: weekly" - ], - "citations": [ - { - "source": "OWASP", - "title": "Dependency-Check Project", - "url": "https://owasp.org/www-project-dependency-check/", - "relevance": "Open-source tool for detecting known vulnerabilities in dependencies" - }, - { - "source": "GitHub", - "title": "Dependabot Documentation", - "url": "https://docs.github.com/en/code-security/dependabot", - "relevance": "Official guide for configuring automated dependency updates and security alerts" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "test_coverage", - "name": "Test Coverage Requirements", - "category": "Testing & CI/CD", - "tier": 2, - "description": "Test coverage thresholds configured and enforced", - "criteria": ">80% code coverage", - "default_weight": 0.03 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "precommit_hooks", - "name": "Pre-commit Hooks & CI/CD Linting", - "category": "Testing & CI/CD", - "tier": 2, - "description": "Pre-commit hooks configured for linting and formatting", - "criteria": ".pre-commit-config.yaml exists", - "default_weight": 0.03 - }, - "status": "fail", - "score": 0.0, - "measured_value": "not configured", - "threshold": "configured", - "evidence": [ - ".pre-commit-config.yaml not found" - ], - "remediation": { - "summary": "Configure pre-commit hooks for automated code quality checks", - "steps": [ - "Install pre-commit framework", - "Create .pre-commit-config.yaml", - "Add hooks for linting and formatting", - "Install hooks: pre-commit install", - "Run on all files: pre-commit run --all-files" - ], - "tools": [ - "pre-commit" - ], - "commands": [ - "pip install pre-commit", - "pre-commit install", - "pre-commit run --all-files" - ], - "examples": [ - "# .pre-commit-config.yaml\nrepos:\n - repo: https://github.com/pre-commit/pre-commit-hooks\n rev: v4.4.0\n hooks:\n - id: trailing-whitespace\n - id: end-of-file-fixer\n - id: check-yaml\n - id: check-added-large-files\n\n - repo: https://github.com/psf/black\n rev: 23.3.0\n hooks:\n - id: black\n\n - repo: https://github.com/pycqa/isort\n rev: 5.12.0\n hooks:\n - id: isort\n" - ], - "citations": [ - { - "source": "pre-commit.com", - "title": "Pre-commit Framework", - "url": "https://pre-commit.com/", - "relevance": "Official pre-commit documentation" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "conventional_commits", - "name": "Conventional Commit Messages", - "category": "Git & Version Control", - "tier": 2, - "description": "Follows conventional commit format", - "criteria": "\u226580% of recent commits follow convention", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "configured", - "threshold": "configured", - "evidence": [ - "Commit linting configured" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "gitignore_completeness", - "name": ".gitignore Completeness", - "category": "Git & Version Control", - "tier": 2, - "description": "Comprehensive .gitignore file with language-specific patterns", - "criteria": ".gitignore exists and includes language-specific patterns from GitHub templates", - "default_weight": 0.03 - }, - "status": "fail", - "score": 63.63636363636363, - "measured_value": "7/11 patterns", - "threshold": "\u226570% of language-specific patterns", - "evidence": [ - ".gitignore found (322 bytes)", - "Pattern coverage: 7/11 (64%)", - "Missing 4 recommended patterns" - ], - "remediation": { - "summary": "Add missing language-specific ignore patterns", - "steps": [ - "Review GitHub's gitignore templates for your language", - "Add the 4 missing patterns", - "Ensure editor/IDE patterns are included" - ], - "tools": [], - "commands": [], - "examples": [ - "# Missing patterns:\n.npm/\n*.log\n*.tsbuildinfo\n*.swo" - ], - "citations": [ - { - "source": "GitHub", - "title": "gitignore Templates Collection", - "url": "https://github.com/github/gitignore", - "relevance": "Comprehensive collection of language-specific gitignore patterns" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "one_command_setup", - "name": "One-Command Build/Setup", - "category": "Build & Development", - "tier": 2, - "description": "Single command to set up development environment from fresh clone", - "criteria": "Single command (make setup, npm install, etc.) documented prominently", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100, - "measured_value": "yarn install", - "threshold": "single command", - "evidence": [ - "Setup command found in README: 'yarn install'", - "Setup automation found: package.json", - "Setup instructions in prominent location" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "file_size_limits", - "name": "File Size Limits", - "category": "Context Window Optimization", - "tier": 2, - "description": "Files are reasonably sized for AI context windows", - "criteria": "<5% of files >500 lines, no files >1000 lines", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "0 huge, 0 large out of 35", - "threshold": "<5% files >500 lines, 0 files >1000 lines", - "evidence": [ - "All 35 source files are <500 lines" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "separation_of_concerns", - "name": "Separation of Concerns", - "category": "Code Organization", - "tier": 2, - "description": "Code organized with single responsibility per module", - "criteria": "Feature-based organization, cohesive modules, low coupling", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "organization:100, cohesion:100, naming:100", - "threshold": "\u226575 overall", - "evidence": [ - "Good directory organization (feature-based or flat)", - "File cohesion: 0/0 files >500 lines", - "No catch-all modules (utils.py, helpers.py) detected" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "concise_documentation", - "name": "Concise Documentation", - "category": "Documentation", - "tier": 2, - "description": "Documentation maximizes information density while minimizing token consumption", - "criteria": "README <500 lines with clear structure, bullet points over prose", - "default_weight": 0.03 - }, - "status": "fail", - "score": 67.0, - "measured_value": "77 lines, 10 headings, 0 bullets", - "threshold": "<500 lines, structured format", - "evidence": [ - "README length: 77 lines (excellent)", - "Heading density: 13.0 per 100 lines (target: 3-5)", - "Only 0 bullet points (prefer bullets over prose)" - ], - "remediation": { - "summary": "Make documentation more concise and structured", - "steps": [ - "Break long README into multiple documents (docs/ directory)", - "Add clear Markdown headings (##, ###) for structure", - "Convert prose paragraphs to bullet points where possible", - "Add table of contents for documents >100 lines", - "Use code blocks instead of describing commands in prose", - "Move detailed content to wiki or docs/, keep README focused" - ], - "tools": [], - "commands": [ - "# Check README length", - "wc -l README.md", - "", - "# Count headings", - "grep -c '^#' README.md" - ], - "examples": [ - "# Good: Concise with structure\n\n## Quick Start\n```bash\npip install -e .\nagentready assess .\n```\n\n## Features\n- Fast repository scanning\n- HTML and Markdown reports\n- 25 agent-ready attributes\n\n## Documentation\nSee [docs/](docs/) for detailed guides.\n", - "# Bad: Verbose prose\n\nThis project is a tool that helps you assess your repository\nagainst best practices for AI-assisted development. It works by\nscanning your codebase and checking for various attributes that\nmake repositories more effective when working with AI coding\nassistants like Claude Code...\n\n[Many more paragraphs of prose...]\n" - ], - "citations": [ - { - "source": "ArXiv", - "title": "LongCodeBench: Evaluating Coding LLMs at 1M Context Windows", - "url": "https://arxiv.org/abs/2501.00343", - "relevance": "Research showing performance degradation with long contexts" - }, - { - "source": "Markdown Guide", - "title": "Basic Syntax", - "url": "https://www.markdownguide.org/basic-syntax/", - "relevance": "Best practices for Markdown formatting" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "inline_documentation", - "name": "Inline Documentation", - "category": "Documentation", - "tier": 2, - "description": "Function, class, and module-level documentation using language-specific conventions", - "criteria": "\u226580% of public functions/classes have docstrings", - "default_weight": 0.03 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "cyclomatic_complexity", - "name": "Cyclomatic Complexity Thresholds", - "category": "Code Quality", - "tier": 3, - "description": "Cyclomatic complexity thresholds enforced", - "criteria": "Average complexity <10, no functions >15", - "default_weight": 0.03 - }, - "status": "skipped", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Missing tool: lizard" - ], - "remediation": { - "summary": "Install with: pip install lizard", - "steps": [ - "Install with: pip install lizard" - ], - "tools": [], - "commands": [], - "examples": [], - "citations": [] - }, - "error_message": null - }, - { - "attribute": { - "id": "architecture_decisions", - "name": "Architecture Decision Records (ADRs)", - "category": "Documentation Standards", - "tier": 3, - "description": "Lightweight documents capturing architectural decisions", - "criteria": "ADR directory with documented decisions", - "default_weight": 0.015 - }, - "status": "fail", - "score": 0.0, - "measured_value": "no ADR directory", - "threshold": "ADR directory with decisions", - "evidence": [ - "No ADR directory found (checked docs/adr/, .adr/, adr/, docs/decisions/)" - ], - "remediation": { - "summary": "Create Architecture Decision Records (ADRs) directory and document key decisions", - "steps": [ - "Create docs/adr/ directory in repository root", - "Use Michael Nygard ADR template or MADR format", - "Document each significant architectural decision", - "Number ADRs sequentially (0001-*.md, 0002-*.md)", - "Include Status, Context, Decision, and Consequences sections", - "Update ADR status when decisions are revised (Superseded, Deprecated)" - ], - "tools": [ - "adr-tools", - "log4brains" - ], - "commands": [ - "# Create ADR directory", - "mkdir -p docs/adr", - "", - "# Create first ADR using template", - "cat > docs/adr/0001-use-architecture-decision-records.md << 'EOF'", - "# 1. Use Architecture Decision Records", - "", - "Date: 2025-11-22", - "", - "## Status", - "Accepted", - "", - "## Context", - "We need to record architectural decisions made in this project.", - "", - "## Decision", - "We will use Architecture Decision Records (ADRs) as described by Michael Nygard.", - "", - "## Consequences", - "- Decisions are documented with context", - "- Future contributors understand rationale", - "- ADRs are lightweight and version-controlled", - "EOF" - ], - "examples": [ - "# Example ADR Structure\n\n```markdown\n# 2. Use PostgreSQL for Database\n\nDate: 2025-11-22\n\n## Status\nAccepted\n\n## Context\nWe need a relational database for complex queries and ACID transactions.\nTeam has PostgreSQL experience. Need full-text search capabilities.\n\n## Decision\nUse PostgreSQL 15+ as primary database.\n\n## Consequences\n- Positive: Robust ACID, full-text search, team familiarity\n- Negative: Higher resource usage than SQLite\n- Neutral: Need to manage migrations, backups\n```\n" - ], - "citations": [ - { - "source": "Michael Nygard", - "title": "Documenting Architecture Decisions", - "url": "https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions", - "relevance": "Original ADR format and rationale" - }, - { - "source": "GitHub adr/madr", - "title": "Markdown ADR (MADR) Template", - "url": "https://github.com/adr/madr", - "relevance": "Modern ADR template with examples" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "issue_pr_templates", - "name": "Issue & Pull Request Templates", - "category": "Repository Structure", - "tier": 3, - "description": "Standardized templates for issues and PRs", - "criteria": "PR template and issue templates in .github/", - "default_weight": 0.015 - }, - "status": "fail", - "score": 0, - "measured_value": "PR:False, Issues:0", - "threshold": "PR template + \u22652 issue templates", - "evidence": [ - "No PR template found", - "No issue template directory found" - ], - "remediation": { - "summary": "Create GitHub issue and PR templates in .github/ directory", - "steps": [ - "Create .github/ directory if it doesn't exist", - "Add PULL_REQUEST_TEMPLATE.md for PRs", - "Create .github/ISSUE_TEMPLATE/ directory", - "Add bug_report.md for bug reports", - "Add feature_request.md for feature requests", - "Optionally add config.yml to configure template chooser" - ], - "tools": [ - "gh" - ], - "commands": [ - "# Create directories", - "mkdir -p .github/ISSUE_TEMPLATE", - "", - "# Create PR template", - "cat > .github/PULL_REQUEST_TEMPLATE.md << 'EOF'", - "## Summary", - "", - "", - "## Related Issues", - "Fixes #", - "", - "## Testing", - "- [ ] Tests added/updated", - "- [ ] All tests pass", - "", - "## Checklist", - "- [ ] Documentation updated", - "- [ ] CHANGELOG.md updated", - "EOF" - ], - "examples": [ - "# Bug Report Template (.github/ISSUE_TEMPLATE/bug_report.md)\n\n```markdown\n---\nname: Bug Report\nabout: Create a report to help us improve\ntitle: '[BUG] '\nlabels: bug\nassignees: ''\n---\n\n**Describe the bug**\nA clear description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce:\n1. Go to '...'\n2. Click on '....'\n3. See error\n\n**Expected behavior**\nWhat you expected to happen.\n\n**Environment**\n- OS: [e.g. macOS 13.0]\n- Version: [e.g. 1.0.0]\n```\n" - ], - "citations": [ - { - "source": "GitHub Docs", - "title": "About issue and pull request templates", - "url": "https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/about-issue-and-pull-request-templates", - "relevance": "Official GitHub guide for templates" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "cicd_pipeline_visibility", - "name": "CI/CD Pipeline Visibility", - "category": "Testing & CI/CD", - "tier": 3, - "description": "Clear, well-documented CI/CD configuration files", - "criteria": "CI config with descriptive names, caching, parallelization", - "default_weight": 0.015 - }, - "status": "fail", - "score": 70, - "measured_value": "basic config", - "threshold": "CI with best practices", - "evidence": [ - "CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml", - "Descriptive job/step names found", - "Caching configured", - "No parallelization detected" - ], - "remediation": { - "summary": "Add or improve CI/CD pipeline configuration", - "steps": [ - "Create CI config for your platform (GitHub Actions, GitLab CI, etc.)", - "Define jobs: lint, test, build", - "Use descriptive job and step names", - "Configure dependency caching", - "Enable parallel job execution", - "Upload artifacts: test results, coverage reports", - "Add status badge to README" - ], - "tools": [ - "github-actions", - "gitlab-ci", - "circleci" - ], - "commands": [ - "# Create GitHub Actions workflow", - "mkdir -p .github/workflows", - "touch .github/workflows/ci.yml", - "", - "# Validate workflow", - "gh workflow view ci.yml" - ], - "examples": [ - "# .github/workflows/ci.yml - Good example\n\nname: CI Pipeline\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n lint:\n name: Lint Code\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip' # Caching\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run linters\n run: |\n black --check .\n isort --check .\n ruff check .\n\n test:\n name: Run Tests\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip'\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run tests with coverage\n run: pytest --cov --cov-report=xml\n\n - name: Upload coverage reports\n uses: codecov/codecov-action@v3\n with:\n files: ./coverage.xml\n\n build:\n name: Build Package\n runs-on: ubuntu-latest\n needs: [lint, test] # Runs after lint/test pass\n steps:\n - uses: actions/checkout@v4\n\n - name: Build package\n run: python -m build\n\n - name: Upload build artifacts\n uses: actions/upload-artifact@v3\n with:\n name: dist\n path: dist/\n" - ], - "citations": [ - { - "source": "GitHub", - "title": "GitHub Actions Documentation", - "url": "https://docs.github.com/en/actions", - "relevance": "Official GitHub Actions guide" - }, - { - "source": "CircleCI", - "title": "CI/CD Best Practices", - "url": "https://circleci.com/blog/ci-cd-best-practices/", - "relevance": "Industry best practices for CI/CD" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "semantic_naming", - "name": "Semantic Naming", - "category": "Code Quality", - "tier": 3, - "description": "Systematic naming patterns following language conventions", - "criteria": "Language conventions followed, avoid generic names", - "default_weight": 0.015 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "structured_logging", - "name": "Structured Logging", - "category": "Code Quality", - "tier": 3, - "description": "Logging in structured format (JSON) with consistent fields", - "criteria": "Structured logging library configured (structlog, winston, zap)", - "default_weight": 0.015 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "openapi_specs", - "name": "OpenAPI/Swagger Specifications", - "category": "API Documentation", - "tier": 3, - "description": "Machine-readable API documentation in OpenAPI format", - "criteria": "OpenAPI 3.x spec with complete endpoint documentation", - "default_weight": 0.015 - }, - "status": "fail", - "score": 0.0, - "measured_value": "no OpenAPI spec", - "threshold": "OpenAPI 3.x spec present", - "evidence": [ - "No OpenAPI specification found", - "Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json" - ], - "remediation": { - "summary": "Create OpenAPI specification for API endpoints", - "steps": [ - "Create openapi.yaml in repository root", - "Define OpenAPI version 3.x", - "Document all API endpoints with full schemas", - "Add request/response examples", - "Define security schemes (API keys, OAuth, etc.)", - "Validate spec with Swagger Editor or Spectral", - "Generate API documentation with Swagger UI or ReDoc" - ], - "tools": [ - "swagger-editor", - "spectral", - "openapi-generator" - ], - "commands": [ - "# Install OpenAPI validator", - "npm install -g @stoplight/spectral-cli", - "", - "# Validate spec", - "spectral lint openapi.yaml", - "", - "# Generate client SDK", - "npx @openapitools/openapi-generator-cli generate \\", - " -i openapi.yaml \\", - " -g python \\", - " -o client/" - ], - "examples": [ - "# openapi.yaml - Minimal example\nopenapi: 3.1.0\ninfo:\n title: My API\n version: 1.0.0\n description: API for managing users\n\nservers:\n - url: https://api.example.com/v1\n\npaths:\n /users/{userId}:\n get:\n summary: Get user by ID\n parameters:\n - name: userId\n in: path\n required: true\n schema:\n type: string\n responses:\n '200':\n description: User found\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/User'\n '404':\n description: User not found\n\ncomponents:\n schemas:\n User:\n type: object\n required:\n - id\n - email\n properties:\n id:\n type: string\n example: \"user_123\"\n email:\n type: string\n format: email\n example: \"user@example.com\"\n name:\n type: string\n example: \"John Doe\"\n" - ], - "citations": [ - { - "source": "OpenAPI Initiative", - "title": "OpenAPI Specification", - "url": "https://spec.openapis.org/oas/v3.1.0", - "relevance": "Official OpenAPI 3.1 specification" - }, - { - "source": "Swagger", - "title": "API Documentation Best Practices", - "url": "https://swagger.io/resources/articles/best-practices-in-api-documentation/", - "relevance": "Guide to writing effective API docs" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "branch_protection", - "name": "Branch Protection Rules", - "category": "Git & Version Control", - "tier": 4, - "description": "Required status checks and review approvals before merging", - "criteria": "Branch protection enabled with status checks and required reviews", - "default_weight": 0.005 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements." - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "code_smells", - "name": "Code Smell Elimination", - "category": "Code Quality", - "tier": 4, - "description": "Linter configuration for detecting code smells and anti-patterns", - "criteria": "Language-specific linters configured (pylint, ESLint, RuboCop, etc.)", - "default_weight": 0.01 - }, - "status": "fail", - "score": 50.0, - "measured_value": "ESLint", - "threshold": "\u226560% of applicable linters configured", - "evidence": [ - "Linters configured: ESLint", - "Coverage: 20/40 points (50%)" - ], - "remediation": { - "summary": "Configure 2 missing linter(s)", - "steps": [ - "Add actionlint for GitHub Actions workflow validation", - "Configure markdownlint for documentation quality" - ], - "tools": [ - "actionlint", - "markdownlint" - ], - "commands": [ - "npm install --save-dev markdownlint-cli && touch .markdownlint.json" - ], - "examples": [ - "# .pylintrc example\n[MASTER]\nmax-line-length=100\n\n[MESSAGES CONTROL]\ndisable=C0111", - "# .eslintrc.json example\n{\n \"extends\": \"eslint:recommended\",\n \"rules\": {\n \"no-console\": \"warn\"\n }\n}" - ], - "citations": [ - { - "source": "Pylint", - "title": "Pylint Documentation", - "url": "https://pylint.readthedocs.io/", - "relevance": "Official documentation for Pylint code analysis tool" - }, - { - "source": "ESLint", - "title": "ESLint Documentation", - "url": "https://eslint.org/docs/latest/", - "relevance": "Official documentation for ESLint JavaScript/TypeScript linter" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "container_setup", - "name": "Container/Virtualization Setup", - "category": "Build & Development", - "tier": 4, - "description": "Container configuration for consistent development environments", - "criteria": "Dockerfile/Containerfile, docker-compose.yml, .dockerignore, multi-stage builds", - "default_weight": 0.01 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - } - ], - "config": { - "weights": {}, - "excluded_attributes": [], - "language_overrides": {}, - "output_dir": null, - "report_theme": "default", - "custom_theme": null - }, - "duration_seconds": 7.3, - "discovered_skills": [] -} \ No newline at end of file diff --git a/docs/agentready-baseline/assessment-latest.json b/docs/agentready-baseline/assessment-latest.json deleted file mode 120000 index 1d00028..0000000 --- a/docs/agentready-baseline/assessment-latest.json +++ /dev/null @@ -1 +0,0 @@ -assessment-20260409-161920.json \ No newline at end of file diff --git a/docs/agentready-baseline/report-20260409-161920.html b/docs/agentready-baseline/report-20260409-161920.html deleted file mode 100644 index 7206035..0000000 --- a/docs/agentready-baseline/report-20260409-161920.html +++ /dev/null @@ -1,2889 +0,0 @@ - - - - - - - AgentReady Assessment - react-user-feedback - - - - -
- - -
- -
-
-

🤖 AgentReady Assessment Report

-
-
-

react-user-feedback

-
📁 ~/Projects/react-user-feedback
-
🌿 main @ 402ab419
-
- -
-
Assessed: April 09, 2026 at 4:19 PM
-
AgentReady: v2.30.1
-
Run by: nthoen@nthoen-mac
-
- -
-
- - -
-
-

Overall Score

-
45.9
-
-
-

Certification

-
Bronze
-
-
-

Assessed

-
18/25
-
-
-

Duration

-
7.3s
-
-
- - -
-
-

💎 Platinum

-

90-100

-
-
-

🥇 Gold

-

75-89

-
-
-

🥈 Silver

-

60-74

-
-
-

🥉 Bronze

-

40-59

-
-
-

⚠️ Needs Work

-

0-39

-
-
- - -
-
- - - - - -
- -
- - -
- -
- -
-
- - -
- -
- -
-
- - ❌ - - -
-

CLAUDE.md Configuration Files

-
- Context Window Optimization • - Tier 1 - • missing -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • CLAUDE.md not found in repository root
  • - -
  • AGENTS.md not found (alternative)
  • - -
-
- - - -
-

Remediation

-

Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants

- - -
    - -
  1. Choose one of three approaches:
  2. - -
  3. Option 1: Create standalone CLAUDE.md (>50 bytes) with project context
  4. - -
  5. Option 2: Create AGENTS.md and symlink CLAUDE.md to it (cross-tool compatibility)
  6. - -
  7. Option 3: Create AGENTS.md and reference it with @AGENTS.md in minimal CLAUDE.md
  8. - -
  9. Add project overview and purpose
  10. - -
  11. Document key architectural patterns
  12. - -
  13. Specify coding standards and conventions
  14. - -
  15. Include build/test/deployment commands
  16. - -
  17. Add any project-specific context that helps AI assistants
  18. - -
- - - -

Commands

-
# Option 1: Standalone CLAUDE.md
-touch CLAUDE.md
-# Add content describing your project
-
-# Option 2: Symlink CLAUDE.md to AGENTS.md
-touch AGENTS.md
-# Add content to AGENTS.md
-ln -s AGENTS.md CLAUDE.md
-
-# Option 3: @ reference in CLAUDE.md
-echo '@AGENTS.md' > CLAUDE.md
-touch AGENTS.md
-# Add content to AGENTS.md
- - - -

Examples

- -
# Standalone CLAUDE.md (Option 1)
-
-## Overview
-Brief description of what this project does.
-
-## Architecture
-Key patterns and structure.
-
-## Development
-```bash
-# Install dependencies
-npm install
-
-# Run tests
-npm test
-
-# Build
-npm run build
-```
-
-## Coding Standards
-- Use TypeScript strict mode
-- Follow ESLint configuration
-- Write tests for new features
-
- -
# CLAUDE.md with @ reference (Option 3)
-@AGENTS.md
-
- -
# AGENTS.md (shared by multiple tools)
-
-## Project Overview
-This project implements a REST API for user management.
-
-## Architecture
-- Layered architecture: controllers, services, repositories
-- PostgreSQL database with SQLAlchemy ORM
-- FastAPI web framework
-
-## Development Workflow
-```bash
-# Setup
-python -m venv .venv
-source .venv/bin/activate
-pip install -e .
-
-# Run tests
-pytest
-
-# Start server
-uvicorn app.main:app --reload
-```
-
-## Code Conventions
-- Use type hints for all functions
-- Follow PEP 8 style guide
-- Write docstrings for public APIs
-- Maintain >80% test coverage
-
- - -
- - - -
-
- -
- -
-
- - ✅ - - -
-

README Structure

-
- Documentation Standards • - Tier 1 - • 3/3 sections -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Found 3/3 essential sections
  • - -
  • Installation: ✓
  • - -
  • Usage: ✓
  • - -
  • Development: ✓
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

Type Annotations

-
- Code Quality • - Tier 1 - • missing tsconfig.json -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • tsconfig.json not found
  • - -
-
- - - -
-

Remediation

-

Add type annotations to function signatures

- - -
    - -
  1. For Python: Add type hints to function parameters and return types
  2. - -
  3. For TypeScript: Enable strict mode in tsconfig.json
  4. - -
  5. Use mypy or pyright for Python type checking
  6. - -
  7. Use tsc --strict for TypeScript
  8. - -
  9. Add type annotations gradually to existing code
  10. - -
- - - -

Commands

-
# Python
-pip install mypy
-mypy --strict src/
-
-# TypeScript
-npm install --save-dev typescript
-echo '{"compilerOptions": {"strict": true}}' > tsconfig.json
- - - -

Examples

- -
# Python - Before
-def calculate(x, y):
-    return x + y
-
-# Python - After
-def calculate(x: float, y: float) -> float:
-    return x + y
-
- -
// TypeScript - tsconfig.json
-{
-  "compilerOptions": {
-    "strict": true,
-    "noImplicitAny": true,
-    "strictNullChecks": true
-  }
-}
-
- - -
- - - -
-
- -
- -
-
- - ❌ - - -
-

Standard Project Layouts

-
- Repository Structure • - Tier 1 - • 0/2 directories -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • Found 0/2 standard directories
  • - -
  • source directory: ✗ (no src/ or project-named dir)
  • - -
  • tests/: ✗
  • - -
-
- - - -
-

Remediation

-

Organize code into standard directories

- - -
    - -
  1. Create a source directory for your code
  2. - -
  3. Option A: Use src/ layout (recommended for packages)
  4. - -
  5. Option B: Use project-named directory (e.g., mypackage/)
  6. - -
  7. Ensure your package has __init__.py
  8. - -
  9. Create tests/ directory for test files
  10. - -
  11. Add at least one test file
  12. - -
- - - -

Commands

-
# Option A: src layout
-mkdir -p src/mypackage
-touch src/mypackage/__init__.py
-# ---
-# Option B: flat layout (project-named)
-mkdir -p mypackage
-touch mypackage/__init__.py
-# Create tests directory
-mkdir -p tests
-touch tests/__init__.py
-touch tests/test_example.py
- - - -

Examples

- -
# src layout (recommended for distributable packages)
-project/
-├── src/
-│   └── mypackage/
-│       ├── __init__.py
-│       └── module.py
-├── tests/
-│   └── test_module.py
-└── pyproject.toml
-
-# flat layout (common in major projects like pandas, numpy)
-project/
-├── mypackage/
-│   ├── __init__.py
-│   └── module.py
-├── tests/
-│   └── test_module.py
-└── pyproject.toml
-
- - -
- - - -
-
- -
- -
-
- - ✅ - - -
-

Dependency Pinning for Reproducibility

-
- Dependency Management • - Tier 1 - • yarn.lock -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Found lock file(s): yarn.lock
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Dependency Security & Vulnerability Scanning

-
- Security • - Tier 1 - • Security tools configured: Renovate -
-
-
- -
- 35 -
- -
- -
- -
-

Evidence

-
    - -
  • ✓ Renovate configured for dependency updates
  • - -
  • Meaningful Renovate configuration detected
  • - -
-
- - - -
-

Remediation

-

Add more security scanning tools for comprehensive coverage

- - -
    - -
  1. Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)
  2. - -
  3. Add CodeQL scanning workflow for SAST
  4. - -
  5. Configure secret detection (detect-secrets, gitleaks)
  6. - -
  7. Set up language-specific scanners (pip-audit, npm audit, Snyk)
  8. - -
- - - -

Commands

-
gh repo edit --enable-security
-pip install detect-secrets  # Python secret detection
-npm audit  # JavaScript dependency audit
- - - -

Examples

- -
# .github/dependabot.yml
-version: 2
-updates:
-  - package-ecosystem: pip
-    directory: /
-    schedule:
-      interval: weekly
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Test Coverage Requirements

-
- Testing & CI/CD • - Tier 2 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

Pre-commit Hooks & CI/CD Linting

-
- Testing & CI/CD • - Tier 2 - • not configured -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • .pre-commit-config.yaml not found
  • - -
-
- - - -
-

Remediation

-

Configure pre-commit hooks for automated code quality checks

- - -
    - -
  1. Install pre-commit framework
  2. - -
  3. Create .pre-commit-config.yaml
  4. - -
  5. Add hooks for linting and formatting
  6. - -
  7. Install hooks: pre-commit install
  8. - -
  9. Run on all files: pre-commit run --all-files
  10. - -
- - - -

Commands

-
pip install pre-commit
-pre-commit install
-pre-commit run --all-files
- - - -

Examples

- -
# .pre-commit-config.yaml
-repos:
-  - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.4.0
-    hooks:
-      - id: trailing-whitespace
-      - id: end-of-file-fixer
-      - id: check-yaml
-      - id: check-added-large-files
-
-  - repo: https://github.com/psf/black
-    rev: 23.3.0
-    hooks:
-      - id: black
-
-  - repo: https://github.com/pycqa/isort
-    rev: 5.12.0
-    hooks:
-      - id: isort
-
- - -
- - - -
-
- -
- -
-
- - ✅ - - -
-

Conventional Commit Messages

-
- Git & Version Control • - Tier 2 - • configured -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Commit linting configured
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

.gitignore Completeness

-
- Git & Version Control • - Tier 2 - • 7/11 patterns -
-
-
- -
- 64 -
- -
- -
- -
-

Evidence

-
    - -
  • .gitignore found (322 bytes)
  • - -
  • Pattern coverage: 7/11 (64%)
  • - -
  • Missing 4 recommended patterns
  • - -
-
- - - -
-

Remediation

-

Add missing language-specific ignore patterns

- - -
    - -
  1. Review GitHub's gitignore templates for your language
  2. - -
  3. Add the 4 missing patterns
  4. - -
  5. Ensure editor/IDE patterns are included
  6. - -
- - - - - -

Examples

- -
# Missing patterns:
-.npm/
-*.log
-*.tsbuildinfo
-*.swo
- - -
- - - -
-
- -
- -
-
- - ✅ - - -
-

One-Command Build/Setup

-
- Build & Development • - Tier 2 - • yarn install -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Setup command found in README: 'yarn install'
  • - -
  • Setup automation found: package.json
  • - -
  • Setup instructions in prominent location
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

File Size Limits

-
- Context Window Optimization • - Tier 2 - • 0 huge, 0 large out of 35 -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • All 35 source files are <500 lines
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Separation of Concerns

-
- Code Organization • - Tier 2 - • organization:100, cohesion:100, naming:100 -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Good directory organization (feature-based or flat)
  • - -
  • File cohesion: 0/0 files >500 lines
  • - -
  • No catch-all modules (utils.py, helpers.py) detected
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

Concise Documentation

-
- Documentation • - Tier 2 - • 77 lines, 10 headings, 0 bullets -
-
-
- -
- 67 -
- -
- -
- -
-

Evidence

-
    - -
  • README length: 77 lines (excellent)
  • - -
  • Heading density: 13.0 per 100 lines (target: 3-5)
  • - -
  • Only 0 bullet points (prefer bullets over prose)
  • - -
-
- - - -
-

Remediation

-

Make documentation more concise and structured

- - -
    - -
  1. Break long README into multiple documents (docs/ directory)
  2. - -
  3. Add clear Markdown headings (##, ###) for structure
  4. - -
  5. Convert prose paragraphs to bullet points where possible
  6. - -
  7. Add table of contents for documents >100 lines
  8. - -
  9. Use code blocks instead of describing commands in prose
  10. - -
  11. Move detailed content to wiki or docs/, keep README focused
  12. - -
- - - -

Commands

-
# Check README length
-wc -l README.md
-
-# Count headings
-grep -c '^#' README.md
- - - -

Examples

- -
# Good: Concise with structure
-
-## Quick Start
-```bash
-pip install -e .
-agentready assess .
-```
-
-## Features
-- Fast repository scanning
-- HTML and Markdown reports
-- 25 agent-ready attributes
-
-## Documentation
-See [docs/](docs/) for detailed guides.
-
- -
# Bad: Verbose prose
-
-This project is a tool that helps you assess your repository
-against best practices for AI-assisted development. It works by
-scanning your codebase and checking for various attributes that
-make repositories more effective when working with AI coding
-assistants like Claude Code...
-
-[Many more paragraphs of prose...]
-
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Inline Documentation

-
- Documentation • - Tier 2 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ⊘ - - -
-

Cyclomatic Complexity Thresholds

-
- Code Quality • - Tier 3 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Missing tool: lizard
  • - -
-
- - - -
-

Remediation

-

Install with: pip install lizard

- - -
    - -
  1. Install with: pip install lizard
  2. - -
- - - - - -
- - - -
-
- -
- -
-
- - ❌ - - -
-

Architecture Decision Records (ADRs)

-
- Documentation Standards • - Tier 3 - • no ADR directory -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • No ADR directory found (checked docs/adr/, .adr/, adr/, docs/decisions/)
  • - -
-
- - - -
-

Remediation

-

Create Architecture Decision Records (ADRs) directory and document key decisions

- - -
    - -
  1. Create docs/adr/ directory in repository root
  2. - -
  3. Use Michael Nygard ADR template or MADR format
  4. - -
  5. Document each significant architectural decision
  6. - -
  7. Number ADRs sequentially (0001-*.md, 0002-*.md)
  8. - -
  9. Include Status, Context, Decision, and Consequences sections
  10. - -
  11. Update ADR status when decisions are revised (Superseded, Deprecated)
  12. - -
- - - -

Commands

-
# Create ADR directory
-mkdir -p docs/adr
-
-# Create first ADR using template
-cat > docs/adr/0001-use-architecture-decision-records.md << 'EOF'
-# 1. Use Architecture Decision Records
-
-Date: 2025-11-22
-
-## Status
-Accepted
-
-## Context
-We need to record architectural decisions made in this project.
-
-## Decision
-We will use Architecture Decision Records (ADRs) as described by Michael Nygard.
-
-## Consequences
-- Decisions are documented with context
-- Future contributors understand rationale
-- ADRs are lightweight and version-controlled
-EOF
- - - -

Examples

- -
# Example ADR Structure
-
-```markdown
-# 2. Use PostgreSQL for Database
-
-Date: 2025-11-22
-
-## Status
-Accepted
-
-## Context
-We need a relational database for complex queries and ACID transactions.
-Team has PostgreSQL experience. Need full-text search capabilities.
-
-## Decision
-Use PostgreSQL 15+ as primary database.
-
-## Consequences
-- Positive: Robust ACID, full-text search, team familiarity
-- Negative: Higher resource usage than SQLite
-- Neutral: Need to manage migrations, backups
-```
-
- - -
- - - -
-
- -
- -
-
- - ❌ - - -
-

Issue & Pull Request Templates

-
- Repository Structure • - Tier 3 - • PR:False, Issues:0 -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • No PR template found
  • - -
  • No issue template directory found
  • - -
-
- - - -
-

Remediation

-

Create GitHub issue and PR templates in .github/ directory

- - -
    - -
  1. Create .github/ directory if it doesn't exist
  2. - -
  3. Add PULL_REQUEST_TEMPLATE.md for PRs
  4. - -
  5. Create .github/ISSUE_TEMPLATE/ directory
  6. - -
  7. Add bug_report.md for bug reports
  8. - -
  9. Add feature_request.md for feature requests
  10. - -
  11. Optionally add config.yml to configure template chooser
  12. - -
- - - -

Commands

-
# Create directories
-mkdir -p .github/ISSUE_TEMPLATE
-
-# Create PR template
-cat > .github/PULL_REQUEST_TEMPLATE.md << 'EOF'
-## Summary
-<!-- Describe the changes in this PR -->
-
-## Related Issues
-Fixes #
-
-## Testing
-- [ ] Tests added/updated
-- [ ] All tests pass
-
-## Checklist
-- [ ] Documentation updated
-- [ ] CHANGELOG.md updated
-EOF
- - - -

Examples

- -
# Bug Report Template (.github/ISSUE_TEMPLATE/bug_report.md)
-
-```markdown
----
-name: Bug Report
-about: Create a report to help us improve
-title: '[BUG] '
-labels: bug
-assignees: ''
----
-
-**Describe the bug**
-A clear description of what the bug is.
-
-**To Reproduce**
-Steps to reproduce:
-1. Go to '...'
-2. Click on '....'
-3. See error
-
-**Expected behavior**
-What you expected to happen.
-
-**Environment**
-- OS: [e.g. macOS 13.0]
-- Version: [e.g. 1.0.0]
-```
-
- - -
- - - -
-
- -
- -
-
- - ❌ - - -
-

CI/CD Pipeline Visibility

-
- Testing & CI/CD • - Tier 3 - • basic config -
-
-
- -
- 70 -
- -
- -
- -
-

Evidence

-
    - -
  • CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml
  • - -
  • Descriptive job/step names found
  • - -
  • Caching configured
  • - -
  • No parallelization detected
  • - -
-
- - - -
-

Remediation

-

Add or improve CI/CD pipeline configuration

- - -
    - -
  1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.)
  2. - -
  3. Define jobs: lint, test, build
  4. - -
  5. Use descriptive job and step names
  6. - -
  7. Configure dependency caching
  8. - -
  9. Enable parallel job execution
  10. - -
  11. Upload artifacts: test results, coverage reports
  12. - -
  13. Add status badge to README
  14. - -
- - - -

Commands

-
# Create GitHub Actions workflow
-mkdir -p .github/workflows
-touch .github/workflows/ci.yml
-
-# Validate workflow
-gh workflow view ci.yml
- - - -

Examples

- -
# .github/workflows/ci.yml - Good example
-
-name: CI Pipeline
-
-on:
-  push:
-    branches: [main]
-  pull_request:
-    branches: [main]
-
-jobs:
-  lint:
-    name: Lint Code
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Set up Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: '3.11'
-          cache: 'pip'  # Caching
-
-      - name: Install dependencies
-        run: pip install -r requirements.txt
-
-      - name: Run linters
-        run: |
-          black --check .
-          isort --check .
-          ruff check .
-
-  test:
-    name: Run Tests
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Set up Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: '3.11'
-          cache: 'pip'
-
-      - name: Install dependencies
-        run: pip install -r requirements.txt
-
-      - name: Run tests with coverage
-        run: pytest --cov --cov-report=xml
-
-      - name: Upload coverage reports
-        uses: codecov/codecov-action@v3
-        with:
-          files: ./coverage.xml
-
-  build:
-    name: Build Package
-    runs-on: ubuntu-latest
-    needs: [lint, test]  # Runs after lint/test pass
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Build package
-        run: python -m build
-
-      - name: Upload build artifacts
-        uses: actions/upload-artifact@v3
-        with:
-          name: dist
-          path: dist/
-
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Semantic Naming

-
- Code Quality • - Tier 3 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ⊘ - - -
-

Structured Logging

-
- Code Quality • - Tier 3 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

OpenAPI/Swagger Specifications

-
- API Documentation • - Tier 3 - • no OpenAPI spec -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • No OpenAPI specification found
  • - -
  • Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json
  • - -
-
- - - -
-

Remediation

-

Create OpenAPI specification for API endpoints

- - -
    - -
  1. Create openapi.yaml in repository root
  2. - -
  3. Define OpenAPI version 3.x
  4. - -
  5. Document all API endpoints with full schemas
  6. - -
  7. Add request/response examples
  8. - -
  9. Define security schemes (API keys, OAuth, etc.)
  10. - -
  11. Validate spec with Swagger Editor or Spectral
  12. - -
  13. Generate API documentation with Swagger UI or ReDoc
  14. - -
- - - -

Commands

-
# Install OpenAPI validator
-npm install -g @stoplight/spectral-cli
-
-# Validate spec
-spectral lint openapi.yaml
-
-# Generate client SDK
-npx @openapitools/openapi-generator-cli generate \
-  -i openapi.yaml \
-  -g python \
-  -o client/
- - - -

Examples

- -
# openapi.yaml - Minimal example
-openapi: 3.1.0
-info:
-  title: My API
-  version: 1.0.0
-  description: API for managing users
-
-servers:
-  - url: https://api.example.com/v1
-
-paths:
-  /users/{userId}:
-    get:
-      summary: Get user by ID
-      parameters:
-        - name: userId
-          in: path
-          required: true
-          schema:
-            type: string
-      responses:
-        '200':
-          description: User found
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/User'
-        '404':
-          description: User not found
-
-components:
-  schemas:
-    User:
-      type: object
-      required:
-        - id
-        - email
-      properties:
-        id:
-          type: string
-          example: "user_123"
-        email:
-          type: string
-          format: email
-          example: "user@example.com"
-        name:
-          type: string
-          example: "John Doe"
-
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Branch Protection Rules

-
- Git & Version Control • - Tier 4 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements.
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

Code Smell Elimination

-
- Code Quality • - Tier 4 - • ESLint -
-
-
- -
- 50 -
- -
- -
- -
-

Evidence

-
    - -
  • Linters configured: ESLint
  • - -
  • Coverage: 20/40 points (50%)
  • - -
-
- - - -
-

Remediation

-

Configure 2 missing linter(s)

- - -
    - -
  1. Add actionlint for GitHub Actions workflow validation
  2. - -
  3. Configure markdownlint for documentation quality
  4. - -
- - - -

Commands

-
npm install --save-dev markdownlint-cli && touch .markdownlint.json
- - - -

Examples

- -
# .pylintrc example
-[MASTER]
-max-line-length=100
-
-[MESSAGES CONTROL]
-disable=C0111
- -
# .eslintrc.json example
-{
-  "extends": "eslint:recommended",
-  "rules": {
-    "no-console": "warn"
-  }
-}
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Container/Virtualization Setup

-
- Build & Development • - Tier 4 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
- -

Generated by AgentReady v2.30.1 (Research v1.0.1)

-

Repository: ~/Projects/react-user-feedback • Branch: main • Commit: 402ab419

-

Assessed by nthoen@nthoen-mac on April 09, 2026 at 4:19 PM

- -

- 🤖 Generated with Claude Code -

-
-
- - - - \ No newline at end of file diff --git a/docs/agentready-baseline/report-20260409-161920.md b/docs/agentready-baseline/report-20260409-161920.md deleted file mode 100644 index 42efbc9..0000000 --- a/docs/agentready-baseline/report-20260409-161920.md +++ /dev/null @@ -1,844 +0,0 @@ -# 🤖 AgentReady Assessment Report - -**Repository**: react-user-feedback -**Path**: `/Users/nthoen/Projects/react-user-feedback` -**Branch**: `main` | **Commit**: `402ab419` -**Assessed**: April 09, 2026 at 4:19 PM -**AgentReady Version**: 2.30.1 -**Run by**: nthoen@nthoen-mac - ---- - -## 📊 Summary - -| Metric | Value | -|--------|-------| -| **Overall Score** | **45.9/100** 🥉 **Bronze** ([Tier Definitions](https://agentready.dev/attributes.html#tier-system)) | -| **Attributes Assessed** | 18/25 | -| **Attributes Not Assessed** | 7 | -| **Assessment Duration** | 7.3s | - -### Languages Detected - -- **JavaScript**: 20 files -- **TypeScript**: 15 files -- **JSON**: 8 files -- **YAML**: 6 files -- **Markdown**: 3 files - -### Repository Stats - -- **Total Files**: 74 -- **Total Lines**: 25,342 - -## 🎯 Priority Improvements - -Focus on these high-impact fixes first: - -1. **CLAUDE.md Configuration Files** (Tier 1) - +10.0 points potential - - Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants -2. **Type Annotations** (Tier 1) - +10.0 points potential - - Add type annotations to function signatures -3. **Standard Project Layouts** (Tier 1) - +10.0 points potential - - Organize code into standard directories -4. **Pre-commit Hooks & CI/CD Linting** (Tier 2) - +3.0 points potential - - Configure pre-commit hooks for automated code quality checks -5. **.gitignore Completeness** (Tier 2) - +3.0 points potential - - Add missing language-specific ignore patterns - -## 📋 Detailed Findings - -Findings sorted by priority (Tier 1 failures first, then Tier 2, etc.) - -![T1](https://img.shields.io/badge/T1-CLAUDE.md_Configuration_Files_0--100-red) **CLAUDE.md Configuration Files** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: missing (Threshold: present) - -**Evidence**: -- CLAUDE.md not found in repository root -- AGENTS.md not found (alternative) - -Create CLAUDE.md or AGENTS.md with project-specific configuration for AI coding assistants - -1. Choose one of three approaches: -2. Option 1: Create standalone CLAUDE.md (>50 bytes) with project context -3. Option 2: Create AGENTS.md and symlink CLAUDE.md to it (cross-tool compatibility) -4. Option 3: Create AGENTS.md and reference it with @AGENTS.md in minimal CLAUDE.md -5. Add project overview and purpose -6. Document key architectural patterns -7. Specify coding standards and conventions -8. Include build/test/deployment commands -9. Add any project-specific context that helps AI assistants - -**Commands**: -```bash -# Option 1: Standalone CLAUDE.md -touch CLAUDE.md -# Add content describing your project - -# Option 2: Symlink CLAUDE.md to AGENTS.md -touch AGENTS.md -# Add content to AGENTS.md -ln -s AGENTS.md CLAUDE.md - -# Option 3: @ reference in CLAUDE.md -echo '@AGENTS.md' > CLAUDE.md -touch AGENTS.md -# Add content to AGENTS.md -``` - -**Examples**: -``` -# Standalone CLAUDE.md (Option 1) - -## Overview -Brief description of what this project does. - -## Architecture -Key patterns and structure. - -## Development -```bash -# Install dependencies -npm install - -# Run tests -npm test - -# Build -npm run build -``` - -## Coding Standards -- Use TypeScript strict mode -- Follow ESLint configuration -- Write tests for new features - -``` -``` -# CLAUDE.md with @ reference (Option 3) -@AGENTS.md - -``` -``` -# AGENTS.md (shared by multiple tools) - -## Project Overview -This project implements a REST API for user management. - -## Architecture -- Layered architecture: controllers, services, repositories -- PostgreSQL database with SQLAlchemy ORM -- FastAPI web framework - -## Development Workflow -```bash -# Setup -python -m venv .venv -source .venv/bin/activate -pip install -e . - -# Run tests -pytest - -# Start server -uvicorn app.main:app --reload -``` - -## Code Conventions -- Use type hints for all functions -- Follow PEP 8 style guide -- Write docstrings for public APIs -- Maintain >80% test coverage - -``` - -
- -![T1](https://img.shields.io/badge/T1-Type_Annotations_0--100-red) **Type Annotations** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: missing tsconfig.json (Threshold: strict mode enabled) - -**Evidence**: -- tsconfig.json not found - -Add type annotations to function signatures - -1. For Python: Add type hints to function parameters and return types -2. For TypeScript: Enable strict mode in tsconfig.json -3. Use mypy or pyright for Python type checking -4. Use tsc --strict for TypeScript -5. Add type annotations gradually to existing code - -**Commands**: -```bash -# Python -pip install mypy -mypy --strict src/ - -# TypeScript -npm install --save-dev typescript -echo '{"compilerOptions": {"strict": true}}' > tsconfig.json -``` - -**Examples**: -``` -# Python - Before -def calculate(x, y): - return x + y - -# Python - After -def calculate(x: float, y: float) -> float: - return x + y - -``` -``` -// TypeScript - tsconfig.json -{ - "compilerOptions": { - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true - } -} - -``` - -
- -![T1](https://img.shields.io/badge/T1-Standard_Project_Layouts_0--100-red) **Standard Project Layouts** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: 0/2 directories (Threshold: 2/2 directories) - -**Evidence**: -- Found 0/2 standard directories -- source directory: ✗ (no src/ or project-named dir) -- tests/: ✗ - -Organize code into standard directories - -1. Create a source directory for your code -2. Option A: Use src/ layout (recommended for packages) -3. Option B: Use project-named directory (e.g., mypackage/) -4. Ensure your package has __init__.py -5. Create tests/ directory for test files -6. Add at least one test file - -**Commands**: -```bash -# Option A: src layout -mkdir -p src/mypackage -touch src/mypackage/__init__.py -# --- -# Option B: flat layout (project-named) -mkdir -p mypackage -touch mypackage/__init__.py -# Create tests directory -mkdir -p tests -touch tests/__init__.py -touch tests/test_example.py -``` - -**Examples**: -``` -# src layout (recommended for distributable packages) -project/ -├── src/ -│ └── mypackage/ -│ ├── __init__.py -│ └── module.py -├── tests/ -│ └── test_module.py -└── pyproject.toml - -# flat layout (common in major projects like pandas, numpy) -project/ -├── mypackage/ -│ ├── __init__.py -│ └── module.py -├── tests/ -│ └── test_module.py -└── pyproject.toml - -``` - -
- -![T1](https://img.shields.io/badge/T1-Dependency_Security_%26_Vulnerability_Scanning_35--100-green) **Dependency Security & Vulnerability Scanning** ✅ 35/100 - -![T1](https://img.shields.io/badge/T1-README_Structure_100--100-green) **README Structure** ✅ 100/100 - -![T1](https://img.shields.io/badge/T1-Dependency_Pinning_for_Reproducibility_100--100-green) **Dependency Pinning for Reproducibility** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-Pre-commit_Hooks_%26_CI%2FCD_Linting_0--100-red) **Pre-commit Hooks & CI/CD Linting** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: not configured (Threshold: configured) - -**Evidence**: -- .pre-commit-config.yaml not found - -Configure pre-commit hooks for automated code quality checks - -1. Install pre-commit framework -2. Create .pre-commit-config.yaml -3. Add hooks for linting and formatting -4. Install hooks: pre-commit install -5. Run on all files: pre-commit run --all-files - -**Commands**: -```bash -pip install pre-commit -pre-commit install -pre-commit run --all-files -``` - -**Examples**: -``` -# .pre-commit-config.yaml -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files - - - repo: https://github.com/psf/black - rev: 23.3.0 - hooks: - - id: black - - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - -``` - -
- -![T2](https://img.shields.io/badge/T2-.gitignore_Completeness_64--100-red) **.gitignore Completeness** ❌ 64/100 -
-📝 Remediation Steps - -**Measured**: 7/11 patterns (Threshold: ≥70% of language-specific patterns) - -**Evidence**: -- .gitignore found (322 bytes) -- Pattern coverage: 7/11 (64%) -- Missing 4 recommended patterns - -Add missing language-specific ignore patterns - -1. Review GitHub's gitignore templates for your language -2. Add the 4 missing patterns -3. Ensure editor/IDE patterns are included - -**Examples**: -``` -# Missing patterns: -.npm/ -*.log -*.tsbuildinfo -*.swo -``` - -
- -![T2](https://img.shields.io/badge/T2-Concise_Documentation_67--100-red) **Concise Documentation** ❌ 67/100 -
-📝 Remediation Steps - -**Measured**: 77 lines, 10 headings, 0 bullets (Threshold: <500 lines, structured format) - -**Evidence**: -- README length: 77 lines (excellent) -- Heading density: 13.0 per 100 lines (target: 3-5) -- Only 0 bullet points (prefer bullets over prose) - -Make documentation more concise and structured - -1. Break long README into multiple documents (docs/ directory) -2. Add clear Markdown headings (##, ###) for structure -3. Convert prose paragraphs to bullet points where possible -4. Add table of contents for documents >100 lines -5. Use code blocks instead of describing commands in prose -6. Move detailed content to wiki or docs/, keep README focused - -**Commands**: -```bash -# Check README length -wc -l README.md - -# Count headings -grep -c '^#' README.md -``` - -**Examples**: -``` -# Good: Concise with structure - -## Quick Start -```bash -pip install -e . -agentready assess . -``` - -## Features -- Fast repository scanning -- HTML and Markdown reports -- 25 agent-ready attributes - -## Documentation -See [docs/](docs/) for detailed guides. - -``` -``` -# Bad: Verbose prose - -This project is a tool that helps you assess your repository -against best practices for AI-assisted development. It works by -scanning your codebase and checking for various attributes that -make repositories more effective when working with AI coding -assistants like Claude Code... - -[Many more paragraphs of prose...] - -``` - -
- -![T2](https://img.shields.io/badge/T2-Conventional_Commit_Messages_100--100-green) **Conventional Commit Messages** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-One-Command_Build%2FSetup_100--100-green) **One-Command Build/Setup** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-File_Size_Limits_100--100-green) **File Size Limits** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-Separation_of_Concerns_100--100-green) **Separation of Concerns** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-Test_Coverage_Requirements_N--A-lightgray) **Test Coverage Requirements** ⊘ - -![T2](https://img.shields.io/badge/T2-Inline_Documentation_N--A-lightgray) **Inline Documentation** ⊘ - -![T3](https://img.shields.io/badge/T3-Architecture_Decision_Records_%28ADRs%29_0--100-red) **Architecture Decision Records (ADRs)** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: no ADR directory (Threshold: ADR directory with decisions) - -**Evidence**: -- No ADR directory found (checked docs/adr/, .adr/, adr/, docs/decisions/) - -Create Architecture Decision Records (ADRs) directory and document key decisions - -1. Create docs/adr/ directory in repository root -2. Use Michael Nygard ADR template or MADR format -3. Document each significant architectural decision -4. Number ADRs sequentially (0001-*.md, 0002-*.md) -5. Include Status, Context, Decision, and Consequences sections -6. Update ADR status when decisions are revised (Superseded, Deprecated) - -**Commands**: -```bash -# Create ADR directory -mkdir -p docs/adr - -# Create first ADR using template -cat > docs/adr/0001-use-architecture-decision-records.md << 'EOF' -# 1. Use Architecture Decision Records - -Date: 2025-11-22 - -## Status -Accepted - -## Context -We need to record architectural decisions made in this project. - -## Decision -We will use Architecture Decision Records (ADRs) as described by Michael Nygard. - -## Consequences -- Decisions are documented with context -- Future contributors understand rationale -- ADRs are lightweight and version-controlled -EOF -``` - -**Examples**: -``` -# Example ADR Structure - -```markdown -# 2. Use PostgreSQL for Database - -Date: 2025-11-22 - -## Status -Accepted - -## Context -We need a relational database for complex queries and ACID transactions. -Team has PostgreSQL experience. Need full-text search capabilities. - -## Decision -Use PostgreSQL 15+ as primary database. - -## Consequences -- Positive: Robust ACID, full-text search, team familiarity -- Negative: Higher resource usage than SQLite -- Neutral: Need to manage migrations, backups -``` - -``` - -
- -![T3](https://img.shields.io/badge/T3-Issue_%26_Pull_Request_Templates_0--100-red) **Issue & Pull Request Templates** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: PR:False, Issues:0 (Threshold: PR template + ≥2 issue templates) - -**Evidence**: -- No PR template found -- No issue template directory found - -Create GitHub issue and PR templates in .github/ directory - -1. Create .github/ directory if it doesn't exist -2. Add PULL_REQUEST_TEMPLATE.md for PRs -3. Create .github/ISSUE_TEMPLATE/ directory -4. Add bug_report.md for bug reports -5. Add feature_request.md for feature requests -6. Optionally add config.yml to configure template chooser - -**Commands**: -```bash -# Create directories -mkdir -p .github/ISSUE_TEMPLATE - -# Create PR template -cat > .github/PULL_REQUEST_TEMPLATE.md << 'EOF' -## Summary - - -## Related Issues -Fixes # - -## Testing -- [ ] Tests added/updated -- [ ] All tests pass - -## Checklist -- [ ] Documentation updated -- [ ] CHANGELOG.md updated -EOF -``` - -**Examples**: -``` -# Bug Report Template (.github/ISSUE_TEMPLATE/bug_report.md) - -```markdown ---- -name: Bug Report -about: Create a report to help us improve -title: '[BUG] ' -labels: bug -assignees: '' ---- - -**Describe the bug** -A clear description of what the bug is. - -**To Reproduce** -Steps to reproduce: -1. Go to '...' -2. Click on '....' -3. See error - -**Expected behavior** -What you expected to happen. - -**Environment** -- OS: [e.g. macOS 13.0] -- Version: [e.g. 1.0.0] -``` - -``` - -
- -![T3](https://img.shields.io/badge/T3-OpenAPI%2FSwagger_Specifications_0--100-red) **OpenAPI/Swagger Specifications** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: no OpenAPI spec (Threshold: OpenAPI 3.x spec present) - -**Evidence**: -- No OpenAPI specification found -- Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json - -Create OpenAPI specification for API endpoints - -1. Create openapi.yaml in repository root -2. Define OpenAPI version 3.x -3. Document all API endpoints with full schemas -4. Add request/response examples -5. Define security schemes (API keys, OAuth, etc.) -6. Validate spec with Swagger Editor or Spectral -7. Generate API documentation with Swagger UI or ReDoc - -**Commands**: -```bash -# Install OpenAPI validator -npm install -g @stoplight/spectral-cli - -# Validate spec -spectral lint openapi.yaml - -# Generate client SDK -npx @openapitools/openapi-generator-cli generate \ - -i openapi.yaml \ - -g python \ - -o client/ -``` - -**Examples**: -``` -# openapi.yaml - Minimal example -openapi: 3.1.0 -info: - title: My API - version: 1.0.0 - description: API for managing users - -servers: - - url: https://api.example.com/v1 - -paths: - /users/{userId}: - get: - summary: Get user by ID - parameters: - - name: userId - in: path - required: true - schema: - type: string - responses: - '200': - description: User found - content: - application/json: - schema: - $ref: '#/components/schemas/User' - '404': - description: User not found - -components: - schemas: - User: - type: object - required: - - id - - email - properties: - id: - type: string - example: "user_123" - email: - type: string - format: email - example: "user@example.com" - name: - type: string - example: "John Doe" - -``` - -
- -![T3](https://img.shields.io/badge/T3-CI%2FCD_Pipeline_Visibility_70--100-red) **CI/CD Pipeline Visibility** ❌ 70/100 -
-📝 Remediation Steps - -**Measured**: basic config (Threshold: CI with best practices) - -**Evidence**: -- CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml -- Descriptive job/step names found -- Caching configured -- No parallelization detected - -Add or improve CI/CD pipeline configuration - -1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.) -2. Define jobs: lint, test, build -3. Use descriptive job and step names -4. Configure dependency caching -5. Enable parallel job execution -6. Upload artifacts: test results, coverage reports -7. Add status badge to README - -**Commands**: -```bash -# Create GitHub Actions workflow -mkdir -p .github/workflows -touch .github/workflows/ci.yml - -# Validate workflow -gh workflow view ci.yml -``` - -**Examples**: -``` -# .github/workflows/ci.yml - Good example - -name: CI Pipeline - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - lint: - name: Lint Code - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' # Caching - - - name: Install dependencies - run: pip install -r requirements.txt - - - name: Run linters - run: | - black --check . - isort --check . - ruff check . - - test: - name: Run Tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' - - - name: Install dependencies - run: pip install -r requirements.txt - - - name: Run tests with coverage - run: pytest --cov --cov-report=xml - - - name: Upload coverage reports - uses: codecov/codecov-action@v3 - with: - files: ./coverage.xml - - build: - name: Build Package - runs-on: ubuntu-latest - needs: [lint, test] # Runs after lint/test pass - steps: - - uses: actions/checkout@v4 - - - name: Build package - run: python -m build - - - name: Upload build artifacts - uses: actions/upload-artifact@v3 - with: - name: dist - path: dist/ - -``` - -
- -![T3](https://img.shields.io/badge/T3-Cyclomatic_Complexity_Thresholds_N--A-lightgray) **Cyclomatic Complexity Thresholds** ⊘ - -![T3](https://img.shields.io/badge/T3-Semantic_Naming_N--A-lightgray) **Semantic Naming** ⊘ - -![T3](https://img.shields.io/badge/T3-Structured_Logging_N--A-lightgray) **Structured Logging** ⊘ - -![T4](https://img.shields.io/badge/T4-Code_Smell_Elimination_50--100-red) **Code Smell Elimination** ❌ 50/100 -
-📝 Remediation Steps - -**Measured**: ESLint (Threshold: ≥60% of applicable linters configured) - -**Evidence**: -- Linters configured: ESLint -- Coverage: 20/40 points (50%) - -Configure 2 missing linter(s) - -1. Add actionlint for GitHub Actions workflow validation -2. Configure markdownlint for documentation quality - -**Commands**: -```bash -npm install --save-dev markdownlint-cli && touch .markdownlint.json -``` - -**Examples**: -``` -# .pylintrc example -[MASTER] -max-line-length=100 - -[MESSAGES CONTROL] -disable=C0111 -``` -``` -# .eslintrc.json example -{ - "extends": "eslint:recommended", - "rules": { - "no-console": "warn" - } -} -``` - -
- -![T4](https://img.shields.io/badge/T4-Branch_Protection_Rules_N--A-lightgray) **Branch Protection Rules** ⊘ - -![T4](https://img.shields.io/badge/T4-Container%2FVirtualization_Setup_N--A-lightgray) **Container/Virtualization Setup** ⊘ - - ---- - -## 📝 Assessment Metadata - -- **AgentReady Version**: v2.30.1 -- **Research Version**: v1.0.1 -- **Repository Snapshot**: 402ab4199df0bb24c1bb6d32d414eb331e3e743c -- **Assessment Duration**: 7.3s -- **Assessed By**: nthoen@nthoen-mac -- **Assessment Date**: April 09, 2026 at 4:19 PM - -🤖 Generated with [Claude Code](https://claude.com/claude-code) \ No newline at end of file diff --git a/docs/agentready-baseline/report-latest.html b/docs/agentready-baseline/report-latest.html deleted file mode 120000 index 0165b74..0000000 --- a/docs/agentready-baseline/report-latest.html +++ /dev/null @@ -1 +0,0 @@ -report-20260409-161920.html \ No newline at end of file diff --git a/docs/agentready-baseline/report-latest.md b/docs/agentready-baseline/report-latest.md deleted file mode 120000 index 12d699d..0000000 --- a/docs/agentready-baseline/report-latest.md +++ /dev/null @@ -1 +0,0 @@ -report-20260409-161920.md \ No newline at end of file diff --git a/docs/agentready-post-remediation/assessment-20260410-092152.json b/docs/agentready-post-remediation/assessment-20260410-092152.json deleted file mode 100644 index c2a9a5d..0000000 --- a/docs/agentready-post-remediation/assessment-20260410-092152.json +++ /dev/null @@ -1,778 +0,0 @@ -{ - "schema_version": "1.0.0", - "metadata": { - "agentready_version": "2.30.1", - "research_version": "1.0.1", - "assessment_timestamp": "2026-04-10T09:21:52.466541", - "assessment_timestamp_human": "April 10, 2026 at 9:21 AM", - "executed_by": "nthoen@nthoen-mac", - "command": "/Library/Frameworks/Python.framework/Versions/3.12/bin/agentready assess . -o docs/agentready-post-remediation", - "working_directory": "/Users/nthoen/Projects/react-user-feedback" - }, - "repository": { - "path": "/Users/nthoen/Projects/react-user-feedback", - "name": "react-user-feedback", - "url": "git@github.com:patternfly/react-user-feedback.git", - "branch": "agent_ready_files", - "commit_hash": "1a8b60548803a227212e9f8ffc2d728781fd5aee", - "languages": { - "JSON": 8, - "YAML": 6, - "Markdown": 5, - "JavaScript": 20, - "TypeScript": 16 - }, - "total_files": 77, - "total_lines": 26159 - }, - "timestamp": "2026-04-10T09:21:52.466541", - "overall_score": 73.5, - "certification_level": "Silver", - "attributes_assessed": 18, - "attributes_skipped": 7, - "attributes_total": 25, - "findings": [ - { - "attribute": { - "id": "claude_md_file", - "name": "CLAUDE.md Configuration Files", - "category": "Context Window Optimization", - "tier": 1, - "description": "Project-specific configuration for Claude Code", - "criteria": "CLAUDE.md file exists in repository root", - "default_weight": 0.1 - }, - "status": "pass", - "score": 100.0, - "measured_value": "present", - "threshold": "present", - "evidence": [ - "CLAUDE.md found at /Users/nthoen/Projects/react-user-feedback/CLAUDE.md" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "readme_structure", - "name": "README Structure", - "category": "Documentation Standards", - "tier": 1, - "description": "Well-structured README with key sections", - "criteria": "README.md with installation, usage, and development sections", - "default_weight": 0.1 - }, - "status": "pass", - "score": 100.0, - "measured_value": "3/3 sections", - "threshold": "3/3 sections", - "evidence": [ - "Found 3/3 essential sections", - "Installation: \u2713", - "Usage: \u2713", - "Development: \u2713" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "type_annotations", - "name": "Type Annotations", - "category": "Code Quality", - "tier": 1, - "description": "Type hints in function signatures", - "criteria": ">80% of functions have type annotations", - "default_weight": 0.1 - }, - "status": "fail", - "score": 50.0, - "measured_value": "strict mode disabled", - "threshold": "strict mode enabled", - "evidence": [ - "tsconfig.json missing strict: true" - ], - "remediation": { - "summary": "Add type annotations to function signatures", - "steps": [ - "For Python: Add type hints to function parameters and return types", - "For TypeScript: Enable strict mode in tsconfig.json", - "Use mypy or pyright for Python type checking", - "Use tsc --strict for TypeScript", - "Add type annotations gradually to existing code" - ], - "tools": [ - "mypy", - "pyright", - "typescript" - ], - "commands": [ - "# Python", - "pip install mypy", - "mypy --strict src/", - "", - "# TypeScript", - "npm install --save-dev typescript", - "echo '{\"compilerOptions\": {\"strict\": true}}' > tsconfig.json" - ], - "examples": [ - "# Python - Before\ndef calculate(x, y):\n return x + y\n\n# Python - After\ndef calculate(x: float, y: float) -> float:\n return x + y\n", - "// TypeScript - tsconfig.json\n{\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true,\n \"strictNullChecks\": true\n }\n}\n" - ], - "citations": [ - { - "source": "Python.org", - "title": "Type Hints", - "url": "https://docs.python.org/3/library/typing.html", - "relevance": "Official Python type hints documentation" - }, - { - "source": "TypeScript", - "title": "TypeScript Handbook", - "url": "https://www.typescriptlang.org/docs/handbook/2/everyday-types.html", - "relevance": "TypeScript type system guide" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "standard_layout", - "name": "Standard Project Layouts", - "category": "Repository Structure", - "tier": 1, - "description": "Follows standard project structure for language", - "criteria": "Standard directories (src/ or project-named, tests/) present", - "default_weight": 0.1 - }, - "status": "fail", - "score": 0.0, - "measured_value": "0/2 directories", - "threshold": "2/2 directories", - "evidence": [ - "Found 0/2 standard directories", - "source directory: \u2717 (no src/ or project-named dir)", - "tests/: \u2717" - ], - "remediation": { - "summary": "Organize code into standard directories", - "steps": [ - "Create a source directory for your code", - "Option A: Use src/ layout (recommended for packages)", - "Option B: Use project-named directory (e.g., mypackage/)", - "Ensure your package has __init__.py", - "Create tests/ directory for test files", - "Add at least one test file" - ], - "tools": [], - "commands": [ - "# Option A: src layout", - "mkdir -p src/mypackage", - "touch src/mypackage/__init__.py", - "# ---", - "# Option B: flat layout (project-named)", - "mkdir -p mypackage", - "touch mypackage/__init__.py", - "# Create tests directory", - "mkdir -p tests", - "touch tests/__init__.py", - "touch tests/test_example.py" - ], - "examples": [ - "# src layout (recommended for distributable packages)\nproject/\n\u251c\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n\n# flat layout (common in major projects like pandas, numpy)\nproject/\n\u251c\u2500\u2500 mypackage/\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 module.py\n\u251c\u2500\u2500 tests/\n\u2502 \u2514\u2500\u2500 test_module.py\n\u2514\u2500\u2500 pyproject.toml\n" - ], - "citations": [ - { - "source": "Python Packaging Authority", - "title": "src layout vs flat layout", - "url": "https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/", - "relevance": "Official guidance on Python project layouts" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "lock_files", - "name": "Dependency Pinning for Reproducibility", - "category": "Dependency Management", - "tier": 1, - "description": "Dependencies pinned to exact versions in lock files", - "criteria": "Lock file with pinned versions, updated within 6 months", - "default_weight": 0.1 - }, - "status": "pass", - "score": 100.0, - "measured_value": "yarn.lock", - "threshold": "lock file with pinned versions, < 6 months old", - "evidence": [ - "Found lock file(s): yarn.lock" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "dependency_security", - "name": "Dependency Security & Vulnerability Scanning", - "category": "Security", - "tier": 1, - "description": "Security scanning tools configured for dependencies and code", - "criteria": "Dependabot, Renovate, CodeQL, or SAST tools configured; secret detection enabled", - "default_weight": 0.04 - }, - "status": "pass", - "score": 35, - "measured_value": "Security tools configured: Renovate", - "threshold": "\u226560 points (Dependabot/Renovate + SAST or multiple scanners)", - "evidence": [ - "\u2713 Renovate configured for dependency updates", - " Meaningful Renovate configuration detected" - ], - "remediation": { - "summary": "Add more security scanning tools for comprehensive coverage", - "steps": [ - "Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)", - "Add CodeQL scanning workflow for SAST", - "Configure secret detection (detect-secrets, gitleaks)", - "Set up language-specific scanners (pip-audit, npm audit, Snyk)" - ], - "tools": [ - "Dependabot", - "Renovate", - "CodeQL", - "detect-secrets", - "pip-audit", - "npm audit" - ], - "commands": [ - "gh repo edit --enable-security", - "pip install detect-secrets # Python secret detection", - "npm audit # JavaScript dependency audit" - ], - "examples": [ - "# .github/dependabot.yml\nversion: 2\nupdates:\n - package-ecosystem: pip\n directory: /\n schedule:\n interval: weekly" - ], - "citations": [ - { - "source": "OWASP", - "title": "Dependency-Check Project", - "url": "https://owasp.org/www-project-dependency-check/", - "relevance": "Open-source tool for detecting known vulnerabilities in dependencies" - }, - { - "source": "GitHub", - "title": "Dependabot Documentation", - "url": "https://docs.github.com/en/code-security/dependabot", - "relevance": "Official guide for configuring automated dependency updates and security alerts" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "test_coverage", - "name": "Test Coverage Requirements", - "category": "Testing & CI/CD", - "tier": 2, - "description": "Test coverage thresholds configured and enforced", - "criteria": ">80% code coverage", - "default_weight": 0.03 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "precommit_hooks", - "name": "Pre-commit Hooks & CI/CD Linting", - "category": "Testing & CI/CD", - "tier": 2, - "description": "Pre-commit hooks configured for linting and formatting", - "criteria": ".pre-commit-config.yaml exists", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "configured", - "threshold": "configured", - "evidence": [ - ".pre-commit-config.yaml found" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "conventional_commits", - "name": "Conventional Commit Messages", - "category": "Git & Version Control", - "tier": 2, - "description": "Follows conventional commit format", - "criteria": "\u226580% of recent commits follow convention", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "configured", - "threshold": "configured", - "evidence": [ - "Commit linting configured" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "gitignore_completeness", - "name": ".gitignore Completeness", - "category": "Git & Version Control", - "tier": 2, - "description": "Comprehensive .gitignore file with language-specific patterns", - "criteria": ".gitignore exists and includes language-specific patterns from GitHub templates", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "11/11 patterns", - "threshold": "\u226570% of language-specific patterns", - "evidence": [ - ".gitignore found (559 bytes)", - "Pattern coverage: 11/11 (100%)" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "one_command_setup", - "name": "One-Command Build/Setup", - "category": "Build & Development", - "tier": 2, - "description": "Single command to set up development environment from fresh clone", - "criteria": "Single command (make setup, npm install, etc.) documented prominently", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100, - "measured_value": "yarn install", - "threshold": "single command", - "evidence": [ - "Setup command found in README: 'yarn install'", - "Setup automation found: package.json", - "Setup instructions in prominent location" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "file_size_limits", - "name": "File Size Limits", - "category": "Context Window Optimization", - "tier": 2, - "description": "Files are reasonably sized for AI context windows", - "criteria": "<5% of files >500 lines, no files >1000 lines", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "0 huge, 0 large out of 36", - "threshold": "<5% files >500 lines, 0 files >1000 lines", - "evidence": [ - "All 36 source files are <500 lines" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "separation_of_concerns", - "name": "Separation of Concerns", - "category": "Code Organization", - "tier": 2, - "description": "Code organized with single responsibility per module", - "criteria": "Feature-based organization, cohesive modules, low coupling", - "default_weight": 0.03 - }, - "status": "pass", - "score": 100.0, - "measured_value": "organization:100, cohesion:100, naming:100", - "threshold": "\u226575 overall", - "evidence": [ - "Good directory organization (feature-based or flat)", - "File cohesion: 0/0 files >500 lines", - "No catch-all modules (utils.py, helpers.py) detected" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "concise_documentation", - "name": "Concise Documentation", - "category": "Documentation", - "tier": 2, - "description": "Documentation maximizes information density while minimizing token consumption", - "criteria": "README <500 lines with clear structure, bullet points over prose", - "default_weight": 0.03 - }, - "status": "pass", - "score": 85.0, - "measured_value": "24 lines, 1 headings, 0 bullets", - "threshold": "<500 lines, structured format", - "evidence": [ - "README length: 24 lines (excellent)", - "Heading density: 4.2 per 100 lines (good structure)", - "Only 0 bullet points (prefer bullets over prose)" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "inline_documentation", - "name": "Inline Documentation", - "category": "Documentation", - "tier": 2, - "description": "Function, class, and module-level documentation using language-specific conventions", - "criteria": "\u226580% of public functions/classes have docstrings", - "default_weight": 0.03 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "cyclomatic_complexity", - "name": "Cyclomatic Complexity Thresholds", - "category": "Code Quality", - "tier": 3, - "description": "Cyclomatic complexity thresholds enforced", - "criteria": "Average complexity <10, no functions >15", - "default_weight": 0.03 - }, - "status": "skipped", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Missing tool: lizard" - ], - "remediation": { - "summary": "Install with: pip install lizard", - "steps": [ - "Install with: pip install lizard" - ], - "tools": [], - "commands": [], - "examples": [], - "citations": [] - }, - "error_message": null - }, - { - "attribute": { - "id": "architecture_decisions", - "name": "Architecture Decision Records (ADRs)", - "category": "Documentation Standards", - "tier": 3, - "description": "Lightweight documents capturing architectural decisions", - "criteria": "ADR directory with documented decisions", - "default_weight": 0.015 - }, - "status": "pass", - "score": 82, - "measured_value": "3 ADRs", - "threshold": "\u22653 ADRs with template", - "evidence": [ - "ADR directory found: docs/adr", - "3 architecture decision records", - "Consistent naming pattern detected", - "Sampled 3 ADRs: template compliance 18/20" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "issue_pr_templates", - "name": "Issue & Pull Request Templates", - "category": "Repository Structure", - "tier": 3, - "description": "Standardized templates for issues and PRs", - "criteria": "PR template and issue templates in .github/", - "default_weight": 0.015 - }, - "status": "pass", - "score": 100, - "measured_value": "PR:True, Issues:3", - "threshold": "PR template + \u22652 issue templates", - "evidence": [ - "PR template found", - "Issue templates found: 3 templates" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "cicd_pipeline_visibility", - "name": "CI/CD Pipeline Visibility", - "category": "Testing & CI/CD", - "tier": 3, - "description": "Clear, well-documented CI/CD configuration files", - "criteria": "CI config with descriptive names, caching, parallelization", - "default_weight": 0.015 - }, - "status": "fail", - "score": 70, - "measured_value": "basic config", - "threshold": "CI with best practices", - "evidence": [ - "CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml", - "Descriptive job/step names found", - "Caching configured", - "No parallelization detected" - ], - "remediation": { - "summary": "Add or improve CI/CD pipeline configuration", - "steps": [ - "Create CI config for your platform (GitHub Actions, GitLab CI, etc.)", - "Define jobs: lint, test, build", - "Use descriptive job and step names", - "Configure dependency caching", - "Enable parallel job execution", - "Upload artifacts: test results, coverage reports", - "Add status badge to README" - ], - "tools": [ - "github-actions", - "gitlab-ci", - "circleci" - ], - "commands": [ - "# Create GitHub Actions workflow", - "mkdir -p .github/workflows", - "touch .github/workflows/ci.yml", - "", - "# Validate workflow", - "gh workflow view ci.yml" - ], - "examples": [ - "# .github/workflows/ci.yml - Good example\n\nname: CI Pipeline\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n lint:\n name: Lint Code\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip' # Caching\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run linters\n run: |\n black --check .\n isort --check .\n ruff check .\n\n test:\n name: Run Tests\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up Python\n uses: actions/setup-python@v5\n with:\n python-version: '3.11'\n cache: 'pip'\n\n - name: Install dependencies\n run: pip install -r requirements.txt\n\n - name: Run tests with coverage\n run: pytest --cov --cov-report=xml\n\n - name: Upload coverage reports\n uses: codecov/codecov-action@v3\n with:\n files: ./coverage.xml\n\n build:\n name: Build Package\n runs-on: ubuntu-latest\n needs: [lint, test] # Runs after lint/test pass\n steps:\n - uses: actions/checkout@v4\n\n - name: Build package\n run: python -m build\n\n - name: Upload build artifacts\n uses: actions/upload-artifact@v3\n with:\n name: dist\n path: dist/\n" - ], - "citations": [ - { - "source": "GitHub", - "title": "GitHub Actions Documentation", - "url": "https://docs.github.com/en/actions", - "relevance": "Official GitHub Actions guide" - }, - { - "source": "CircleCI", - "title": "CI/CD Best Practices", - "url": "https://circleci.com/blog/ci-cd-best-practices/", - "relevance": "Industry best practices for CI/CD" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "semantic_naming", - "name": "Semantic Naming", - "category": "Code Quality", - "tier": 3, - "description": "Systematic naming patterns following language conventions", - "criteria": "Language conventions followed, avoid generic names", - "default_weight": 0.015 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "structured_logging", - "name": "Structured Logging", - "category": "Code Quality", - "tier": 3, - "description": "Logging in structured format (JSON) with consistent fields", - "criteria": "Structured logging library configured (structlog, winston, zap)", - "default_weight": 0.015 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "openapi_specs", - "name": "OpenAPI/Swagger Specifications", - "category": "API Documentation", - "tier": 3, - "description": "Machine-readable API documentation in OpenAPI format", - "criteria": "OpenAPI 3.x spec with complete endpoint documentation", - "default_weight": 0.015 - }, - "status": "fail", - "score": 0.0, - "measured_value": "no OpenAPI spec", - "threshold": "OpenAPI 3.x spec present", - "evidence": [ - "No OpenAPI specification found", - "Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json" - ], - "remediation": { - "summary": "Create OpenAPI specification for API endpoints", - "steps": [ - "Create openapi.yaml in repository root", - "Define OpenAPI version 3.x", - "Document all API endpoints with full schemas", - "Add request/response examples", - "Define security schemes (API keys, OAuth, etc.)", - "Validate spec with Swagger Editor or Spectral", - "Generate API documentation with Swagger UI or ReDoc" - ], - "tools": [ - "swagger-editor", - "spectral", - "openapi-generator" - ], - "commands": [ - "# Install OpenAPI validator", - "npm install -g @stoplight/spectral-cli", - "", - "# Validate spec", - "spectral lint openapi.yaml", - "", - "# Generate client SDK", - "npx @openapitools/openapi-generator-cli generate \\", - " -i openapi.yaml \\", - " -g python \\", - " -o client/" - ], - "examples": [ - "# openapi.yaml - Minimal example\nopenapi: 3.1.0\ninfo:\n title: My API\n version: 1.0.0\n description: API for managing users\n\nservers:\n - url: https://api.example.com/v1\n\npaths:\n /users/{userId}:\n get:\n summary: Get user by ID\n parameters:\n - name: userId\n in: path\n required: true\n schema:\n type: string\n responses:\n '200':\n description: User found\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/User'\n '404':\n description: User not found\n\ncomponents:\n schemas:\n User:\n type: object\n required:\n - id\n - email\n properties:\n id:\n type: string\n example: \"user_123\"\n email:\n type: string\n format: email\n example: \"user@example.com\"\n name:\n type: string\n example: \"John Doe\"\n" - ], - "citations": [ - { - "source": "OpenAPI Initiative", - "title": "OpenAPI Specification", - "url": "https://spec.openapis.org/oas/v3.1.0", - "relevance": "Official OpenAPI 3.1 specification" - }, - { - "source": "Swagger", - "title": "API Documentation Best Practices", - "url": "https://swagger.io/resources/articles/best-practices-in-api-documentation/", - "relevance": "Guide to writing effective API docs" - } - ] - }, - "error_message": null - }, - { - "attribute": { - "id": "branch_protection", - "name": "Branch Protection Rules", - "category": "Git & Version Control", - "tier": 4, - "description": "Required status checks and review approvals before merging", - "criteria": "Branch protection enabled with status checks and required reviews", - "default_weight": 0.005 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements." - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "code_smells", - "name": "Code Smell Elimination", - "category": "Code Quality", - "tier": 4, - "description": "Linter configuration for detecting code smells and anti-patterns", - "criteria": "Language-specific linters configured (pylint, ESLint, RuboCop, etc.)", - "default_weight": 0.01 - }, - "status": "pass", - "score": 100.0, - "measured_value": "ESLint, actionlint, markdownlint", - "threshold": "\u226560% of applicable linters configured", - "evidence": [ - "Linters configured: ESLint, actionlint, markdownlint", - "Coverage: 40/40 points (100%)" - ], - "remediation": null, - "error_message": null - }, - { - "attribute": { - "id": "container_setup", - "name": "Container/Virtualization Setup", - "category": "Build & Development", - "tier": 4, - "description": "Container configuration for consistent development environments", - "criteria": "Dockerfile/Containerfile, docker-compose.yml, .dockerignore, multi-stage builds", - "default_weight": 0.01 - }, - "status": "not_applicable", - "score": null, - "measured_value": null, - "threshold": null, - "evidence": [ - "Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']" - ], - "remediation": null, - "error_message": null - } - ], - "config": { - "weights": {}, - "excluded_attributes": [], - "language_overrides": {}, - "output_dir": null, - "report_theme": "default", - "custom_theme": null - }, - "duration_seconds": 9.5, - "discovered_skills": [] -} \ No newline at end of file diff --git a/docs/agentready-post-remediation/assessment-latest.json b/docs/agentready-post-remediation/assessment-latest.json deleted file mode 120000 index e887323..0000000 --- a/docs/agentready-post-remediation/assessment-latest.json +++ /dev/null @@ -1 +0,0 @@ -assessment-20260410-092152.json \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-20260410-092152.html b/docs/agentready-post-remediation/report-20260410-092152.html deleted file mode 100644 index 07a59fa..0000000 --- a/docs/agentready-post-remediation/report-20260410-092152.html +++ /dev/null @@ -1,2431 +0,0 @@ - - - - - - - AgentReady Assessment - react-user-feedback - - - - -
- - -
- -
-
-

🤖 AgentReady Assessment Report

-
-
-

react-user-feedback

-
📁 ~/Projects/react-user-feedback
-
🌿 agent_ready_files @ 1a8b6054
-
- -
-
Assessed: April 10, 2026 at 9:21 AM
-
AgentReady: v2.30.1
-
Run by: nthoen@nthoen-mac
-
- -
-
- - -
-
-

Overall Score

-
73.5
-
-
-

Certification

-
Silver
-
-
-

Assessed

-
18/25
-
-
-

Duration

-
9.5s
-
-
- - -
-
-

💎 Platinum

-

90-100

-
-
-

🥇 Gold

-

75-89

-
-
-

🥈 Silver

-

60-74

-
-
-

🥉 Bronze

-

40-59

-
-
-

⚠️ Needs Work

-

0-39

-
-
- - -
-
- - - - - -
- -
- - -
- -
- -
-
- - -
- -
- -
-
- - ✅ - - -
-

CLAUDE.md Configuration Files

-
- Context Window Optimization • - Tier 1 - • present -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • CLAUDE.md found at /Users/nthoen/Projects/react-user-feedback/CLAUDE.md
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

README Structure

-
- Documentation Standards • - Tier 1 - • 3/3 sections -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Found 3/3 essential sections
  • - -
  • Installation: ✓
  • - -
  • Usage: ✓
  • - -
  • Development: ✓
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

Type Annotations

-
- Code Quality • - Tier 1 - • strict mode disabled -
-
-
- -
- 50 -
- -
- -
- -
-

Evidence

-
    - -
  • tsconfig.json missing strict: true
  • - -
-
- - - -
-

Remediation

-

Add type annotations to function signatures

- - -
    - -
  1. For Python: Add type hints to function parameters and return types
  2. - -
  3. For TypeScript: Enable strict mode in tsconfig.json
  4. - -
  5. Use mypy or pyright for Python type checking
  6. - -
  7. Use tsc --strict for TypeScript
  8. - -
  9. Add type annotations gradually to existing code
  10. - -
- - - -

Commands

-
# Python
-pip install mypy
-mypy --strict src/
-
-# TypeScript
-npm install --save-dev typescript
-echo '{"compilerOptions": {"strict": true}}' > tsconfig.json
- - - -

Examples

- -
# Python - Before
-def calculate(x, y):
-    return x + y
-
-# Python - After
-def calculate(x: float, y: float) -> float:
-    return x + y
-
- -
// TypeScript - tsconfig.json
-{
-  "compilerOptions": {
-    "strict": true,
-    "noImplicitAny": true,
-    "strictNullChecks": true
-  }
-}
-
- - -
- - - -
-
- -
- -
-
- - ❌ - - -
-

Standard Project Layouts

-
- Repository Structure • - Tier 1 - • 0/2 directories -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • Found 0/2 standard directories
  • - -
  • source directory: ✗ (no src/ or project-named dir)
  • - -
  • tests/: ✗
  • - -
-
- - - -
-

Remediation

-

Organize code into standard directories

- - -
    - -
  1. Create a source directory for your code
  2. - -
  3. Option A: Use src/ layout (recommended for packages)
  4. - -
  5. Option B: Use project-named directory (e.g., mypackage/)
  6. - -
  7. Ensure your package has __init__.py
  8. - -
  9. Create tests/ directory for test files
  10. - -
  11. Add at least one test file
  12. - -
- - - -

Commands

-
# Option A: src layout
-mkdir -p src/mypackage
-touch src/mypackage/__init__.py
-# ---
-# Option B: flat layout (project-named)
-mkdir -p mypackage
-touch mypackage/__init__.py
-# Create tests directory
-mkdir -p tests
-touch tests/__init__.py
-touch tests/test_example.py
- - - -

Examples

- -
# src layout (recommended for distributable packages)
-project/
-├── src/
-│   └── mypackage/
-│       ├── __init__.py
-│       └── module.py
-├── tests/
-│   └── test_module.py
-└── pyproject.toml
-
-# flat layout (common in major projects like pandas, numpy)
-project/
-├── mypackage/
-│   ├── __init__.py
-│   └── module.py
-├── tests/
-│   └── test_module.py
-└── pyproject.toml
-
- - -
- - - -
-
- -
- -
-
- - ✅ - - -
-

Dependency Pinning for Reproducibility

-
- Dependency Management • - Tier 1 - • yarn.lock -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Found lock file(s): yarn.lock
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Dependency Security & Vulnerability Scanning

-
- Security • - Tier 1 - • Security tools configured: Renovate -
-
-
- -
- 35 -
- -
- -
- -
-

Evidence

-
    - -
  • ✓ Renovate configured for dependency updates
  • - -
  • Meaningful Renovate configuration detected
  • - -
-
- - - -
-

Remediation

-

Add more security scanning tools for comprehensive coverage

- - -
    - -
  1. Enable Dependabot alerts in GitHub repository settings (or configure Renovate: add renovate.json to repository root)
  2. - -
  3. Add CodeQL scanning workflow for SAST
  4. - -
  5. Configure secret detection (detect-secrets, gitleaks)
  6. - -
  7. Set up language-specific scanners (pip-audit, npm audit, Snyk)
  8. - -
- - - -

Commands

-
gh repo edit --enable-security
-pip install detect-secrets  # Python secret detection
-npm audit  # JavaScript dependency audit
- - - -

Examples

- -
# .github/dependabot.yml
-version: 2
-updates:
-  - package-ecosystem: pip
-    directory: /
-    schedule:
-      interval: weekly
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Test Coverage Requirements

-
- Testing & CI/CD • - Tier 2 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Pre-commit Hooks & CI/CD Linting

-
- Testing & CI/CD • - Tier 2 - • configured -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • .pre-commit-config.yaml found
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Conventional Commit Messages

-
- Git & Version Control • - Tier 2 - • configured -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Commit linting configured
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

.gitignore Completeness

-
- Git & Version Control • - Tier 2 - • 11/11 patterns -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • .gitignore found (559 bytes)
  • - -
  • Pattern coverage: 11/11 (100%)
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

One-Command Build/Setup

-
- Build & Development • - Tier 2 - • yarn install -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Setup command found in README: 'yarn install'
  • - -
  • Setup automation found: package.json
  • - -
  • Setup instructions in prominent location
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

File Size Limits

-
- Context Window Optimization • - Tier 2 - • 0 huge, 0 large out of 36 -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • All 36 source files are <500 lines
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Separation of Concerns

-
- Code Organization • - Tier 2 - • organization:100, cohesion:100, naming:100 -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Good directory organization (feature-based or flat)
  • - -
  • File cohesion: 0/0 files >500 lines
  • - -
  • No catch-all modules (utils.py, helpers.py) detected
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Concise Documentation

-
- Documentation • - Tier 2 - • 24 lines, 1 headings, 0 bullets -
-
-
- -
- 85 -
- -
- -
- -
-

Evidence

-
    - -
  • README length: 24 lines (excellent)
  • - -
  • Heading density: 4.2 per 100 lines (good structure)
  • - -
  • Only 0 bullet points (prefer bullets over prose)
  • - -
-
- - - - - -
-
- -
- -
-
- - ⊘ - - -
-

Inline Documentation

-
- Documentation • - Tier 2 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Docstring check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ⊘ - - -
-

Cyclomatic Complexity Thresholds

-
- Code Quality • - Tier 3 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Missing tool: lizard
  • - -
-
- - - -
-

Remediation

-

Install with: pip install lizard

- - -
    - -
  1. Install with: pip install lizard
  2. - -
- - - - - -
- - - -
-
- -
- -
-
- - ✅ - - -
-

Architecture Decision Records (ADRs)

-
- Documentation Standards • - Tier 3 - • 3 ADRs -
-
-
- -
- 82 -
- -
- -
- -
-

Evidence

-
    - -
  • ADR directory found: docs/adr
  • - -
  • 3 architecture decision records
  • - -
  • Consistent naming pattern detected
  • - -
  • Sampled 3 ADRs: template compliance 18/20
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Issue & Pull Request Templates

-
- Repository Structure • - Tier 3 - • PR:True, Issues:3 -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • PR template found
  • - -
  • Issue templates found: 3 templates
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

CI/CD Pipeline Visibility

-
- Testing & CI/CD • - Tier 3 - • basic config -
-
-
- -
- 70 -
- -
- -
- -
-

Evidence

-
    - -
  • CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml
  • - -
  • Descriptive job/step names found
  • - -
  • Caching configured
  • - -
  • No parallelization detected
  • - -
-
- - - -
-

Remediation

-

Add or improve CI/CD pipeline configuration

- - -
    - -
  1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.)
  2. - -
  3. Define jobs: lint, test, build
  4. - -
  5. Use descriptive job and step names
  6. - -
  7. Configure dependency caching
  8. - -
  9. Enable parallel job execution
  10. - -
  11. Upload artifacts: test results, coverage reports
  12. - -
  13. Add status badge to README
  14. - -
- - - -

Commands

-
# Create GitHub Actions workflow
-mkdir -p .github/workflows
-touch .github/workflows/ci.yml
-
-# Validate workflow
-gh workflow view ci.yml
- - - -

Examples

- -
# .github/workflows/ci.yml - Good example
-
-name: CI Pipeline
-
-on:
-  push:
-    branches: [main]
-  pull_request:
-    branches: [main]
-
-jobs:
-  lint:
-    name: Lint Code
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Set up Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: '3.11'
-          cache: 'pip'  # Caching
-
-      - name: Install dependencies
-        run: pip install -r requirements.txt
-
-      - name: Run linters
-        run: |
-          black --check .
-          isort --check .
-          ruff check .
-
-  test:
-    name: Run Tests
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Set up Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: '3.11'
-          cache: 'pip'
-
-      - name: Install dependencies
-        run: pip install -r requirements.txt
-
-      - name: Run tests with coverage
-        run: pytest --cov --cov-report=xml
-
-      - name: Upload coverage reports
-        uses: codecov/codecov-action@v3
-        with:
-          files: ./coverage.xml
-
-  build:
-    name: Build Package
-    runs-on: ubuntu-latest
-    needs: [lint, test]  # Runs after lint/test pass
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Build package
-        run: python -m build
-
-      - name: Upload build artifacts
-        uses: actions/upload-artifact@v3
-        with:
-          name: dist
-          path: dist/
-
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Semantic Naming

-
- Code Quality • - Tier 3 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Naming check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ⊘ - - -
-

Structured Logging

-
- Code Quality • - Tier 3 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Structured logging check not implemented for ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
-
- - ❌ - - -
-

OpenAPI/Swagger Specifications

-
- API Documentation • - Tier 3 - • no OpenAPI spec -
-
-
- -
- 0 -
- -
- -
- -
-

Evidence

-
    - -
  • No OpenAPI specification found
  • - -
  • Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json
  • - -
-
- - - -
-

Remediation

-

Create OpenAPI specification for API endpoints

- - -
    - -
  1. Create openapi.yaml in repository root
  2. - -
  3. Define OpenAPI version 3.x
  4. - -
  5. Document all API endpoints with full schemas
  6. - -
  7. Add request/response examples
  8. - -
  9. Define security schemes (API keys, OAuth, etc.)
  10. - -
  11. Validate spec with Swagger Editor or Spectral
  12. - -
  13. Generate API documentation with Swagger UI or ReDoc
  14. - -
- - - -

Commands

-
# Install OpenAPI validator
-npm install -g @stoplight/spectral-cli
-
-# Validate spec
-spectral lint openapi.yaml
-
-# Generate client SDK
-npx @openapitools/openapi-generator-cli generate \
-  -i openapi.yaml \
-  -g python \
-  -o client/
- - - -

Examples

- -
# openapi.yaml - Minimal example
-openapi: 3.1.0
-info:
-  title: My API
-  version: 1.0.0
-  description: API for managing users
-
-servers:
-  - url: https://api.example.com/v1
-
-paths:
-  /users/{userId}:
-    get:
-      summary: Get user by ID
-      parameters:
-        - name: userId
-          in: path
-          required: true
-          schema:
-            type: string
-      responses:
-        '200':
-          description: User found
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/User'
-        '404':
-          description: User not found
-
-components:
-  schemas:
-    User:
-      type: object
-      required:
-        - id
-        - email
-      properties:
-        id:
-          type: string
-          example: "user_123"
-        email:
-          type: string
-          format: email
-          example: "user@example.com"
-        name:
-          type: string
-          example: "John Doe"
-
- - -
- - - -
-
- -
- -
-
- - ⊘ - - -
-

Branch Protection Rules

-
- Git & Version Control • - Tier 4 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Requires GitHub API integration for branch protection checks. Future implementation will verify: required status checks, required reviews, force push prevention, and branch update requirements.
  • - -
-
- - - - - -
-
- -
- -
-
- - ✅ - - -
-

Code Smell Elimination

-
- Code Quality • - Tier 4 - • ESLint, actionlint, markdownlint -
-
-
- -
- 100 -
- -
- -
- -
-

Evidence

-
    - -
  • Linters configured: ESLint, actionlint, markdownlint
  • - -
  • Coverage: 40/40 points (100%)
  • - -
-
- - - - - -
-
- -
- -
-
- - ⊘ - - -
-

Container/Virtualization Setup

-
- Build & Development • - Tier 4 - -
-
-
- -
- -
- -
- -
-

Evidence

-
    - -
  • Not applicable to ['JSON', 'YAML', 'Markdown', 'JavaScript', 'TypeScript']
  • - -
-
- - - - - -
-
- -
- -
- -

Generated by AgentReady v2.30.1 (Research v1.0.1)

-

Repository: ~/Projects/react-user-feedback • Branch: agent_ready_files • Commit: 1a8b6054

-

Assessed by nthoen@nthoen-mac on April 10, 2026 at 9:21 AM

- -

- 🤖 Generated with Claude Code -

-
-
- - - - \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-20260410-092152.md b/docs/agentready-post-remediation/report-20260410-092152.md deleted file mode 100644 index ba7fc18..0000000 --- a/docs/agentready-post-remediation/report-20260410-092152.md +++ /dev/null @@ -1,417 +0,0 @@ -# 🤖 AgentReady Assessment Report - -**Repository**: react-user-feedback -**Path**: `/Users/nthoen/Projects/react-user-feedback` -**Branch**: `agent_ready_files` | **Commit**: `1a8b6054` -**Assessed**: April 10, 2026 at 9:21 AM -**AgentReady Version**: 2.30.1 -**Run by**: nthoen@nthoen-mac - ---- - -## 📊 Summary - -| Metric | Value | -|--------|-------| -| **Overall Score** | **73.5/100** 🥈 **Silver** ([Tier Definitions](https://agentready.dev/attributes.html#tier-system)) | -| **Attributes Assessed** | 18/25 | -| **Attributes Not Assessed** | 7 | -| **Assessment Duration** | 9.5s | - -### Languages Detected - -- **JavaScript**: 20 files -- **TypeScript**: 16 files -- **JSON**: 8 files -- **YAML**: 6 files -- **Markdown**: 5 files - -### Repository Stats - -- **Total Files**: 77 -- **Total Lines**: 26,159 - -## 🎯 Priority Improvements - -Focus on these high-impact fixes first: - -1. **Standard Project Layouts** (Tier 1) - +10.0 points potential - - Organize code into standard directories -2. **Type Annotations** (Tier 1) - +10.0 points potential - - Add type annotations to function signatures -3. **OpenAPI/Swagger Specifications** (Tier 3) - +1.5 points potential - - Create OpenAPI specification for API endpoints -4. **CI/CD Pipeline Visibility** (Tier 3) - +1.5 points potential - - Add or improve CI/CD pipeline configuration - -## 📋 Detailed Findings - -Findings sorted by priority (Tier 1 failures first, then Tier 2, etc.) - -![T1](https://img.shields.io/badge/T1-Standard_Project_Layouts_0--100-red) **Standard Project Layouts** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: 0/2 directories (Threshold: 2/2 directories) - -**Evidence**: -- Found 0/2 standard directories -- source directory: ✗ (no src/ or project-named dir) -- tests/: ✗ - -Organize code into standard directories - -1. Create a source directory for your code -2. Option A: Use src/ layout (recommended for packages) -3. Option B: Use project-named directory (e.g., mypackage/) -4. Ensure your package has __init__.py -5. Create tests/ directory for test files -6. Add at least one test file - -**Commands**: -```bash -# Option A: src layout -mkdir -p src/mypackage -touch src/mypackage/__init__.py -# --- -# Option B: flat layout (project-named) -mkdir -p mypackage -touch mypackage/__init__.py -# Create tests directory -mkdir -p tests -touch tests/__init__.py -touch tests/test_example.py -``` - -**Examples**: -``` -# src layout (recommended for distributable packages) -project/ -├── src/ -│ └── mypackage/ -│ ├── __init__.py -│ └── module.py -├── tests/ -│ └── test_module.py -└── pyproject.toml - -# flat layout (common in major projects like pandas, numpy) -project/ -├── mypackage/ -│ ├── __init__.py -│ └── module.py -├── tests/ -│ └── test_module.py -└── pyproject.toml - -``` - -
- -![T1](https://img.shields.io/badge/T1-Type_Annotations_50--100-red) **Type Annotations** ❌ 50/100 -
-📝 Remediation Steps - -**Measured**: strict mode disabled (Threshold: strict mode enabled) - -**Evidence**: -- tsconfig.json missing strict: true - -Add type annotations to function signatures - -1. For Python: Add type hints to function parameters and return types -2. For TypeScript: Enable strict mode in tsconfig.json -3. Use mypy or pyright for Python type checking -4. Use tsc --strict for TypeScript -5. Add type annotations gradually to existing code - -**Commands**: -```bash -# Python -pip install mypy -mypy --strict src/ - -# TypeScript -npm install --save-dev typescript -echo '{"compilerOptions": {"strict": true}}' > tsconfig.json -``` - -**Examples**: -``` -# Python - Before -def calculate(x, y): - return x + y - -# Python - After -def calculate(x: float, y: float) -> float: - return x + y - -``` -``` -// TypeScript - tsconfig.json -{ - "compilerOptions": { - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true - } -} - -``` - -
- -![T1](https://img.shields.io/badge/T1-Dependency_Security_%26_Vulnerability_Scanning_35--100-green) **Dependency Security & Vulnerability Scanning** ✅ 35/100 - -![T1](https://img.shields.io/badge/T1-CLAUDE.md_Configuration_Files_100--100-green) **CLAUDE.md Configuration Files** ✅ 100/100 - -![T1](https://img.shields.io/badge/T1-README_Structure_100--100-green) **README Structure** ✅ 100/100 - -![T1](https://img.shields.io/badge/T1-Dependency_Pinning_for_Reproducibility_100--100-green) **Dependency Pinning for Reproducibility** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-Concise_Documentation_85--100-green) **Concise Documentation** ✅ 85/100 - -![T2](https://img.shields.io/badge/T2-Pre-commit_Hooks_%26_CI%2FCD_Linting_100--100-green) **Pre-commit Hooks & CI/CD Linting** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-Conventional_Commit_Messages_100--100-green) **Conventional Commit Messages** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-.gitignore_Completeness_100--100-green) **.gitignore Completeness** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-One-Command_Build%2FSetup_100--100-green) **One-Command Build/Setup** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-File_Size_Limits_100--100-green) **File Size Limits** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-Separation_of_Concerns_100--100-green) **Separation of Concerns** ✅ 100/100 - -![T2](https://img.shields.io/badge/T2-Test_Coverage_Requirements_N--A-lightgray) **Test Coverage Requirements** ⊘ - -![T2](https://img.shields.io/badge/T2-Inline_Documentation_N--A-lightgray) **Inline Documentation** ⊘ - -![T3](https://img.shields.io/badge/T3-OpenAPI%2FSwagger_Specifications_0--100-red) **OpenAPI/Swagger Specifications** ❌ 0/100 -
-📝 Remediation Steps - -**Measured**: no OpenAPI spec (Threshold: OpenAPI 3.x spec present) - -**Evidence**: -- No OpenAPI specification found -- Searched recursively for: openapi.yaml, openapi.yml, openapi.json, swagger.yaml, swagger.yml, swagger.json - -Create OpenAPI specification for API endpoints - -1. Create openapi.yaml in repository root -2. Define OpenAPI version 3.x -3. Document all API endpoints with full schemas -4. Add request/response examples -5. Define security schemes (API keys, OAuth, etc.) -6. Validate spec with Swagger Editor or Spectral -7. Generate API documentation with Swagger UI or ReDoc - -**Commands**: -```bash -# Install OpenAPI validator -npm install -g @stoplight/spectral-cli - -# Validate spec -spectral lint openapi.yaml - -# Generate client SDK -npx @openapitools/openapi-generator-cli generate \ - -i openapi.yaml \ - -g python \ - -o client/ -``` - -**Examples**: -``` -# openapi.yaml - Minimal example -openapi: 3.1.0 -info: - title: My API - version: 1.0.0 - description: API for managing users - -servers: - - url: https://api.example.com/v1 - -paths: - /users/{userId}: - get: - summary: Get user by ID - parameters: - - name: userId - in: path - required: true - schema: - type: string - responses: - '200': - description: User found - content: - application/json: - schema: - $ref: '#/components/schemas/User' - '404': - description: User not found - -components: - schemas: - User: - type: object - required: - - id - - email - properties: - id: - type: string - example: "user_123" - email: - type: string - format: email - example: "user@example.com" - name: - type: string - example: "John Doe" - -``` - -
- -![T3](https://img.shields.io/badge/T3-CI%2FCD_Pipeline_Visibility_70--100-red) **CI/CD Pipeline Visibility** ❌ 70/100 -
-📝 Remediation Steps - -**Measured**: basic config (Threshold: CI with best practices) - -**Evidence**: -- CI config found: .github/workflows/release.yml, .github/workflows/check-pr.yml, .github/workflows/extensions.yml, .github/workflows/build-lint-test.yml, .github/workflows/promote.yml, .github/workflows/build.yml -- Descriptive job/step names found -- Caching configured -- No parallelization detected - -Add or improve CI/CD pipeline configuration - -1. Create CI config for your platform (GitHub Actions, GitLab CI, etc.) -2. Define jobs: lint, test, build -3. Use descriptive job and step names -4. Configure dependency caching -5. Enable parallel job execution -6. Upload artifacts: test results, coverage reports -7. Add status badge to README - -**Commands**: -```bash -# Create GitHub Actions workflow -mkdir -p .github/workflows -touch .github/workflows/ci.yml - -# Validate workflow -gh workflow view ci.yml -``` - -**Examples**: -``` -# .github/workflows/ci.yml - Good example - -name: CI Pipeline - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - lint: - name: Lint Code - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' # Caching - - - name: Install dependencies - run: pip install -r requirements.txt - - - name: Run linters - run: | - black --check . - isort --check . - ruff check . - - test: - name: Run Tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' - - - name: Install dependencies - run: pip install -r requirements.txt - - - name: Run tests with coverage - run: pytest --cov --cov-report=xml - - - name: Upload coverage reports - uses: codecov/codecov-action@v3 - with: - files: ./coverage.xml - - build: - name: Build Package - runs-on: ubuntu-latest - needs: [lint, test] # Runs after lint/test pass - steps: - - uses: actions/checkout@v4 - - - name: Build package - run: python -m build - - - name: Upload build artifacts - uses: actions/upload-artifact@v3 - with: - name: dist - path: dist/ - -``` - -
- -![T3](https://img.shields.io/badge/T3-Architecture_Decision_Records_%28ADRs%29_82--100-green) **Architecture Decision Records (ADRs)** ✅ 82/100 - -![T3](https://img.shields.io/badge/T3-Issue_%26_Pull_Request_Templates_100--100-green) **Issue & Pull Request Templates** ✅ 100/100 - -![T3](https://img.shields.io/badge/T3-Cyclomatic_Complexity_Thresholds_N--A-lightgray) **Cyclomatic Complexity Thresholds** ⊘ - -![T3](https://img.shields.io/badge/T3-Semantic_Naming_N--A-lightgray) **Semantic Naming** ⊘ - -![T3](https://img.shields.io/badge/T3-Structured_Logging_N--A-lightgray) **Structured Logging** ⊘ - -![T4](https://img.shields.io/badge/T4-Code_Smell_Elimination_100--100-green) **Code Smell Elimination** ✅ 100/100 - -![T4](https://img.shields.io/badge/T4-Branch_Protection_Rules_N--A-lightgray) **Branch Protection Rules** ⊘ - -![T4](https://img.shields.io/badge/T4-Container%2FVirtualization_Setup_N--A-lightgray) **Container/Virtualization Setup** ⊘ - - ---- - -## 📝 Assessment Metadata - -- **AgentReady Version**: v2.30.1 -- **Research Version**: v1.0.1 -- **Repository Snapshot**: 1a8b60548803a227212e9f8ffc2d728781fd5aee -- **Assessment Duration**: 9.5s -- **Assessed By**: nthoen@nthoen-mac -- **Assessment Date**: April 10, 2026 at 9:21 AM - -🤖 Generated with [Claude Code](https://claude.com/claude-code) \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-latest.html b/docs/agentready-post-remediation/report-latest.html deleted file mode 120000 index 3387291..0000000 --- a/docs/agentready-post-remediation/report-latest.html +++ /dev/null @@ -1 +0,0 @@ -report-20260410-092152.html \ No newline at end of file diff --git a/docs/agentready-post-remediation/report-latest.md b/docs/agentready-post-remediation/report-latest.md deleted file mode 120000 index 1a7aff4..0000000 --- a/docs/agentready-post-remediation/report-latest.md +++ /dev/null @@ -1 +0,0 @@ -report-20260410-092152.md \ No newline at end of file From 7150b5f57a6051e8eabba6ec36aef4a6775adea6 Mon Sep 17 00:00:00 2001 From: nicolethoen Date: Fri, 10 Apr 2026 10:58:50 -0400 Subject: [PATCH 5/5] remove smoke tests --- BOOKMARKS.md | 12 ++++++++++++ CLAUDE.md | 6 +++--- README.md | 2 +- docs/adr/0002-unit-testing-with-jest.md | 4 ++-- package.json | 2 +- packages/module/src/__tests__/smoke.test.ts | 5 ----- 6 files changed, 19 insertions(+), 12 deletions(-) delete mode 100644 packages/module/src/__tests__/smoke.test.ts diff --git a/BOOKMARKS.md b/BOOKMARKS.md index e27187f..6cbea4d 100644 --- a/BOOKMARKS.md +++ b/BOOKMARKS.md @@ -45,6 +45,18 @@ Why the library lives under `packages/module/` instead of a root `src/` / `tests **Added by**: AgentReady remediation | **Date**: 2026-04-09 +### [ADR 0002 — Jest at the workspace root](./docs/adr/0002-unit-testing-with-jest.md) + +Jest config at the repo root, `yarn test` / `--passWithNoTests`, and lint-staged related tests. + +**Added by**: AgentReady remediation | **Date**: 2026-04-10 + +### [ADR 0003 — CI PR checks (reusable workflow)](./docs/adr/0003-ci-pr-checks-via-reusable-workflow.md) + +PR checks via `check-pr` calling the reusable `build-lint-test` workflow. + +**Added by**: AgentReady remediation | **Date**: 2026-04-10 + --- ## Development Resources diff --git a/CLAUDE.md b/CLAUDE.md index 7c8a24a..76971e3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # react-user-feedback -A React component library for collecting user feedback via a form in a modal. Built with React, TypeScript, PatternFly, and Webpack. +A React component library for collecting user feedback via a form in a modal. Built with React, TypeScript, and PatternFly; the library builds with **TypeScript (`tsc`)**, and local extension docs use the **PatternFly documentation framework** (`pf-docs-framework`). ## Structure @@ -25,9 +25,9 @@ This repo is a **Yarn workspaces** monorepo. The **shipped library** is **`@patt ```bash yarn build # Build the library -yarn test # Run Jest for packages/ +yarn test # Run Jest for packages/ (passes with no tests until you add *.test.* / __tests__; uses --passWithNoTests) yarn lint # Lint all of packages/ (like CI) -yarn lint-staged # What Husky runs on commit: Prettier + ESLint + jest --findRelatedTests on staged files only +yarn lint-staged # What Husky runs on commit: Prettier + ESLint + jest --findRelatedTests --passWithNoTests on staged files only ``` For accessibility testing: diff --git a/README.md b/README.md index 1e85c67..3856bd2 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ yarn build **Lint:** **`yarn lint`** — ESLint for JS/TS and Markdown under `packages/` (see `package.json` for `lint:js` / `lint:md` / `lint:markdownlint`). -**Unit tests:** Jest uses `jest.setup.js`; tests live under `packages/`. Run **`yarn test`**. **Husky** runs **`lint-staged`** on commit; on staged `packages/**/*.{js,jsx,ts,tsx}` it runs Prettier, ESLint, and **`jest --findRelatedTests`**. +**Unit tests:** Jest uses `jest.setup.js` at the repo root; add tests under `packages/` (e.g. `*.test.*` or `__tests__/`). Run **`yarn test`** — it uses **`--passWithNoTests`** so CI stays green until tests exist. **Husky** runs **`lint-staged`** on commit; on staged `packages/**/*.{js,jsx,ts,tsx}` it runs Prettier, ESLint, and **`jest --findRelatedTests`** (with **`--passWithNoTests`**). **Accessibility:** use two terminals — (1) `yarn build:docs && yarn serve:docs` (2) `yarn test:a11y`. **`yarn serve:a11y`** opens the generated a11y report after tests. diff --git a/docs/adr/0002-unit-testing-with-jest.md b/docs/adr/0002-unit-testing-with-jest.md index ac4a61d..0741e6f 100644 --- a/docs/adr/0002-unit-testing-with-jest.md +++ b/docs/adr/0002-unit-testing-with-jest.md @@ -8,13 +8,13 @@ Accepted ## Context -The library ships from **`packages/module`**, but contributors expect a single **`yarn test`** entry point from the repository root. We need consistent time zones for snapshots, a minimal guard against an empty Jest configuration, and fast feedback on pre-commit for staged changes. +The library ships from **`packages/module`**, but contributors expect a single **`yarn test`** entry point from the repository root. We need consistent time zones for snapshots, and fast feedback on pre-commit for staged changes. The root **`yarn test`** uses **`--passWithNoTests`** so CI and local runs stay green until real component tests are added. ## Decision - **Jest is configured at the repo root** (`jest.config.js`, `jest.setup.js`) with **`roots`** aimed at **`packages/`** so tests in the workspace are discovered without a root-level `tests/` directory. - **Default timezone** for tests is set in **`jest.setup.js`** (and mirrored in the **`yarn test`** script where needed) so date-sensitive output is stable in CI and locally. -- A small **smoke test** under `packages/module` ensures the suite is non-empty and the wiring stays valid. +- **`yarn test`** passes with **no test files** (`--passWithNoTests`) so we do not maintain placeholder tests solely to satisfy Jest. - **lint-staged** may run **`jest --findRelatedTests`** on staged source files to keep pre-commit fast. ## Consequences diff --git a/package.json b/package.json index a47aec0..54a4fa0 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "lint:markdownlint": "markdownlint --dot -p .markdownlintignore \"**/*.md\"", "lint": "yarn lint:js && yarn lint:md && yarn lint:markdownlint", "lint-staged": "lint-staged", - "test": "TZ=EST jest packages", + "test": "TZ=EST jest packages --passWithNoTests", "test:a11y": "yarn workspace @patternfly/react-user-feedback test:a11y", "serve:a11y": "yarn workspace @patternfly/react-user-feedback serve:a11y", "prepare": "husky install" diff --git a/packages/module/src/__tests__/smoke.test.ts b/packages/module/src/__tests__/smoke.test.ts deleted file mode 100644 index 66ac512..0000000 --- a/packages/module/src/__tests__/smoke.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('react-user-feedback', () => { - it('runs Jest for this package', () => { - expect(true).toBe(true); - }); -});