From 0c61e9ada5f5428e16b648f5f062c84d15cb7b4d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 25 Aug 2025 22:29:38 +0000 Subject: [PATCH 1/3] Initial plan From 1688e6d2aacb7582ced2b1e061ac7c866e310e38 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 25 Aug 2025 22:40:55 +0000 Subject: [PATCH 2/3] Fix JSON syntax error and test core projects Co-authored-by: preetpatel <22407548+preetpatel@users.noreply.github.com> --- manual-revocation-check/package-lock.json | 171 ++++++++++++++++++++++ manual-revocation-check/package.json | 2 +- manual-revocation-check/yarn.lock | 41 +----- 3 files changed, 180 insertions(+), 34 deletions(-) create mode 100644 manual-revocation-check/package-lock.json diff --git a/manual-revocation-check/package-lock.json b/manual-revocation-check/package-lock.json new file mode 100644 index 00000000..156bf44d --- /dev/null +++ b/manual-revocation-check/package-lock.json @@ -0,0 +1,171 @@ +{ + "name": "manual-revocation-check", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "manual-revocation-check", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@stablelib/base64": "^2.0.0", + "base32-decode": "^1.0.0", + "cbor-x": "^1.6.0", + "pako": "^2.1.0" + } + }, + "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@stablelib/base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-2.0.0.tgz", + "integrity": "sha512-ffSfySa1ZpZYzM5FQ2xILQ2jifQ+GlgbDJzRTCtaB0sqta88KYghB/tlSV2VS2iHRCvMdUvJlLOW1rmSkziWnw==", + "license": "MIT" + }, + "node_modules/base32-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base32-decode/-/base32-decode-1.0.0.tgz", + "integrity": "sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g==", + "license": "MIT" + }, + "node_modules/cbor-extract": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.1.1" + }, + "bin": { + "download-cbor-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" + } + }, + "node_modules/cbor-x": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz", + "integrity": "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==", + "license": "MIT", + "optionalDependencies": { + "cbor-extract": "^2.2.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + } + } +} diff --git a/manual-revocation-check/package.json b/manual-revocation-check/package.json index d46489c9..720176a1 100644 --- a/manual-revocation-check/package.json +++ b/manual-revocation-check/package.json @@ -10,7 +10,7 @@ "pako": "^2.1.0" }, "scripts": { - "start": "node manual-revocation-check.js", + "start": "node manual-revocation-check.js" }, "repository": { "type": "git", diff --git a/manual-revocation-check/yarn.lock b/manual-revocation-check/yarn.lock index 068315b5..e807ed0c 100644 --- a/manual-revocation-check/yarn.lock +++ b/manual-revocation-check/yarn.lock @@ -2,49 +2,24 @@ # yarn lockfile v1 -"@cbor-extract/cbor-extract-darwin-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz#8d65cb861a99622e1b4a268e2d522d2ec6137338" - integrity sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w== - -"@cbor-extract/cbor-extract-darwin-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz#9fbec199c888c5ec485a1839f4fad0485ab6c40a" - integrity sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w== - -"@cbor-extract/cbor-extract-linux-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz#bf77e0db4a1d2200a5aa072e02210d5043e953ae" - integrity sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ== - -"@cbor-extract/cbor-extract-linux-arm@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz#491335037eb8533ed8e21b139c59f6df04e39709" - integrity sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q== - "@cbor-extract/cbor-extract-linux-x64@2.2.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz#672574485ccd24759bf8fb8eab9dbca517d35b97" + resolved "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz" integrity sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw== -"@cbor-extract/cbor-extract-win32-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz#4b3f07af047f984c082de34b116e765cb9af975f" - integrity sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w== - "@stablelib/base64@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@stablelib/base64/-/base64-2.0.0.tgz#f13a98549cd5ca0750cd177bbd08b599d24e5f8e" + resolved "https://registry.npmjs.org/@stablelib/base64/-/base64-2.0.0.tgz" integrity sha512-ffSfySa1ZpZYzM5FQ2xILQ2jifQ+GlgbDJzRTCtaB0sqta88KYghB/tlSV2VS2iHRCvMdUvJlLOW1rmSkziWnw== base32-decode@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/base32-decode/-/base32-decode-1.0.0.tgz#2a821d6a664890c872f20aa9aca95a4b4b80e2a7" + resolved "https://registry.npmjs.org/base32-decode/-/base32-decode-1.0.0.tgz" integrity sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g== cbor-extract@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.2.0.tgz#cee78e630cbeae3918d1e2e58e0cebaf3a3be840" + resolved "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz" integrity sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA== dependencies: node-gyp-build-optional-packages "5.1.1" @@ -58,24 +33,24 @@ cbor-extract@^2.2.0: cbor-x@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.6.0.tgz#89c35d2d805efc30e09a28349425cc05d57aacd7" + resolved "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz" integrity sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg== optionalDependencies: cbor-extract "^2.2.0" detect-libc@^2.0.1: version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== node-gyp-build-optional-packages@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c" + resolved "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz" integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw== dependencies: detect-libc "^2.0.1" pako@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== From e6a2a8a0c52b5ff9bcf6a09d2ae16d22cc470b5a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 25 Aug 2025 22:48:12 +0000 Subject: [PATCH 3/3] Create comprehensive copilot instructions with thorough validation Co-authored-by: preetpatel <22407548+preetpatel@users.noreply.github.com> --- .github/copilot-instructions.md | 143 ++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..5496c8bc --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,143 @@ +# MATTR Sample Apps + +This repository contains a collection of developer apps and API tooling for interfacing with the MATTR Platform. It includes claims source applications, verifier web tutorials, React Native apps, credential templates, and utilities. + +**Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.** + +## Working Effectively + +### Prerequisites and Environment Setup +- Node.js is required for most projects. Use the system's Node.js installation. +- Docker is available for containerized deployments. +- Some projects require MATTR private SDK registry access (React Native projects). +- Network restrictions may prevent access to external APIs and Google Fonts during builds. + +### Project Structure Overview +The repository contains the following main projects: +- **claims-source-app**: Express.js app with ngrok tunneling for OID4VCI Claims Source tutorial +- **verifier-web-tutorial**: Next.js React app using MATTR Verifier Web SDK +- **manual-revocation-check**: Node.js script for checking credential revocation status +- **react-native-mdocs-holder-tutorial**: React Native Expo apps (starter and complete versions) +- **credential-templates**: Static template files for different credential types +- **postman**: Postman collections for MATTR Platform APIs + +## Build and Test Instructions + +### manual-revocation-check +- **Install dependencies**: `npm install` (< 1 second) +- **Run script**: `node manual-revocation-check.js [URL_OR_CREDENTIAL] [INDEX]` + - Example: `node manual-revocation-check.js https://example.com/revocation-list 1` + - Without arguments: shows "No URL or compact credential provided" +- **Known issue**: Fixed JSON syntax error (trailing comma in package.json scripts section) + +### claims-source-app +- **Install dependencies**: `npm install` (1-2 seconds) +- **Configuration**: Copy `env-example` to `.env` and configure: + - `CLAIMS_SOURCE_API_KEY=supersecretapikey` + - `NGROK_AUTHTOKEN=` (required for full functionality) +- **Run full app**: `npm start` (requires ngrok token, will fail without it) +- **Run Express app only**: `node src/index.js` (works without ngrok token) +- **Test endpoint**: `curl -H "x-api-key: supersecretapikey" "http://localhost:3000/claims?email=erika.mustermann@example.com"` +- **Docker build**: `docker build -t claims-source .` (5 seconds) +- **Docker Compose issue**: The docker-compose.yml specifies `platform: linux/arm64` which fails on x64 systems. Remove the platform line or change to appropriate platform. +- **Database**: Uses `database.json` with test users. Email "erika.mustermann@example.com" is available for testing. + +### verifier-web-tutorial +- **Install dependencies**: `npm install` (8 seconds) +- **Configuration required**: This app requires MATTR platform credentials to work properly: + - Create `.env.local` file with: `NEXT_PUBLIC_TENANT_URL=https://your-tenant.mattr.global` + - Update `src/app/page.tsx` lines 46 and 79 to replace placeholder values: + - `` → your actual wallet provider ID + - `` → your actual application ID +- **Known configuration issue**: Without proper environment variables, the app shows "Error: Invalid initialize options" +- **Development server**: `npm run dev` (1 second startup, uses Turbopack) + - Runs on http://localhost:3000 + - **NEVER CANCEL**: Dev server starts quickly but may take time for full compilation +- **Production build**: `npm run build` + - **KNOWN ISSUE**: Build fails due to Google Fonts network restrictions (getaddrinfo ENOTFOUND fonts.googleapis.com) + - **WORKAROUND**: Use development mode instead of production build in restricted network environments +- **Linting**: `npm run lint` (< 5 seconds, currently passes with no errors) +- **Start production**: `npm start` (only works after successful build) + +### React Native Projects (both starter and complete) +- **Critical limitation**: Both projects require `@mattrglobal/mobile-credential-holder-react-native` SDK which is only available in MATTR's private npm registry +- **Install dependencies**: `npm install` - **WILL FAIL** with "404 Not Found" for MATTR SDK +- **Available scripts**: `npm start`, `npm run android`, `npm run ios` +- **Requirements**: Expo CLI, Android Studio or Xcode for device testing +- **Note**: These projects cannot be built or run without proper SDK registry access + +### credential-templates +- **Type**: Static files only - no build process required +- **Contents**: Template files for Compact and Compact Semantic credential profiles +- **Usage**: Reference files for creating credential templates + +### postman +- **Type**: Static Postman collection files - no build process required +- **Files**: Platform API collection, Management API collection, environment variables +- **Usage**: Import into Postman for API testing + +## Validation Scenarios + +### claims-source-app +After making changes to the claims source: +1. **ALWAYS** run `npm install` if dependencies changed +2. **Test Express app**: Start with `node src/index.js` and verify endpoint responds +3. **Test API**: Use curl to verify claims endpoint returns expected user data +4. **Test authentication**: Verify endpoint returns 401 without proper API key +5. **Test database lookup**: Verify 404 response for non-existent email addresses + +### verifier-web-tutorial +After making changes to the verifier web app: +1. **ALWAYS** run `npm install` if dependencies changed +2. **Check configuration**: Ensure environment variables and placeholder values are properly configured +3. **Test development build**: `npm run dev` and verify app loads at http://localhost:3000 +4. **Expected behavior without configuration**: App loads but shows "Error: Invalid initialize options" in browser console +5. **Test linting**: `npm run lint` - must pass for CI +6. **Production build**: Only attempt in environments with external network access +7. **UI testing**: If making UI changes, manually verify functionality in browser + +### manual-revocation-check +After making changes to the revocation check script: +1. **Test argument validation**: Run without arguments to verify error message +2. **Test with mock data**: Verify script processes arguments correctly +3. **JSON syntax**: Ensure package.json remains valid (watch for trailing commas) + +## Common Build Issues and Solutions + +### Network Restrictions +- **Google Fonts failures**: Next.js builds may fail accessing fonts.googleapis.com + - Solution: Use development mode instead of production build +- **External API calls**: Manual revocation check may fail accessing external revocation lists + - Expected behavior: Script should show "Fetching revocation list from URL failed" + +### Docker Issues +- **Platform mismatch**: claims-source-app docker-compose.yml has incorrect platform setting + - Solution: Remove `platform: linux/arm64` line or set to correct architecture +- **Docker build works**: Individual Docker builds succeed, compose may fail + +### Missing Dependencies and Configuration +- **MATTR SDK**: React Native projects require private registry access + - No workaround available without proper credentials +- **ngrok token**: Claims source requires token for tunneling + - Workaround: Run Express app directly with `node src/index.js` +- **MATTR Platform credentials**: Verifier web tutorial requires: + - Environment variable: `NEXT_PUBLIC_TENANT_URL` + - Application ID and wallet provider ID configuration in source code + - Without these: app runs but shows "Error: Invalid initialize options" + +### JSON Syntax Issues +- **Watch for trailing commas**: The manual-revocation-check had a trailing comma in package.json scripts +- **Validation**: Always check package.json syntax if npm install fails with JSON parse errors + +## CI/CD Integration +- **CodeQL Analysis**: Runs on JavaScript files in CI +- **Template Checklist**: Automated PR checklist for credential template changes +- **Linting requirement**: `npm run lint` must pass for verifier-web-tutorial +- **No automated testing**: Repository has no test suites configured + +## Timing Expectations +- **npm install**: < 1 to 8 seconds depending on project +- **Docker builds**: 5 seconds +- **Development servers**: < 1 second to start (Next.js ready in ~1 second) +- **Linting**: < 5 seconds +- **NEVER CANCEL**: All operations complete quickly, but allow 60+ seconds for any build process \ No newline at end of file