From 8eb3e6600fb2cb9af30f7cb52a61293b44bfa8d0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 14:51:24 +0000 Subject: [PATCH 1/2] chore: start public repo cleanup Agent-Logs-Url: https://github.com/edgarbnt/ReactSentinel/sessions/60fdf94a-29b0-46c9-85db-31d319069457 Co-authored-by: edgarbnt <146716791+edgarbnt@users.noreply.github.com> --- examples/test-app/package-lock.json | 1768 +++++++++++++++++++++++++++ 1 file changed, 1768 insertions(+) create mode 100644 examples/test-app/package-lock.json diff --git a/examples/test-app/package-lock.json b/examples/test-app/package-lock.json new file mode 100644 index 0000000..4749b68 --- /dev/null +++ b/examples/test-app/package-lock.json @@ -0,0 +1,1768 @@ +{ + "name": "react-sentinel-test-app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-sentinel-test-app", + "version": "0.1.0", + "dependencies": { + "react": "^18.3.0", + "react-dom": "^18.3.0" + }, + "devDependencies": { + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.0", + "typescript": "^5.5.0", + "vite": "^5.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz", + "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz", + "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz", + "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz", + "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz", + "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz", + "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz", + "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz", + "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz", + "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz", + "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz", + "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz", + "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz", + "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz", + "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz", + "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz", + "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz", + "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", + "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", + "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz", + "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz", + "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz", + "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz", + "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz", + "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz", + "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.353", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz", + "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", + "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.3", + "@rollup/rollup-android-arm64": "4.60.3", + "@rollup/rollup-darwin-arm64": "4.60.3", + "@rollup/rollup-darwin-x64": "4.60.3", + "@rollup/rollup-freebsd-arm64": "4.60.3", + "@rollup/rollup-freebsd-x64": "4.60.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", + "@rollup/rollup-linux-arm-musleabihf": "4.60.3", + "@rollup/rollup-linux-arm64-gnu": "4.60.3", + "@rollup/rollup-linux-arm64-musl": "4.60.3", + "@rollup/rollup-linux-loong64-gnu": "4.60.3", + "@rollup/rollup-linux-loong64-musl": "4.60.3", + "@rollup/rollup-linux-ppc64-gnu": "4.60.3", + "@rollup/rollup-linux-ppc64-musl": "4.60.3", + "@rollup/rollup-linux-riscv64-gnu": "4.60.3", + "@rollup/rollup-linux-riscv64-musl": "4.60.3", + "@rollup/rollup-linux-s390x-gnu": "4.60.3", + "@rollup/rollup-linux-x64-gnu": "4.60.3", + "@rollup/rollup-linux-x64-musl": "4.60.3", + "@rollup/rollup-openbsd-x64": "4.60.3", + "@rollup/rollup-openharmony-arm64": "4.60.3", + "@rollup/rollup-win32-arm64-msvc": "4.60.3", + "@rollup/rollup-win32-ia32-msvc": "4.60.3", + "@rollup/rollup-win32-x64-gnu": "4.60.3", + "@rollup/rollup-win32-x64-msvc": "4.60.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} From 2d71e559d3c529fd165b7314dce853350ef07b23 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 14:56:21 +0000 Subject: [PATCH 2/2] chore: clean public docs and refresh agent pack Agent-Logs-Url: https://github.com/edgarbnt/ReactSentinel/sessions/60fdf94a-29b0-46c9-85db-31d319069457 Co-authored-by: edgarbnt <146716791+edgarbnt@users.noreply.github.com> --- .github/copilot-instructions.md | 6 +- README.md | 2 +- assets/agent-pack/README.md | 32 +- .../agents/react-sentinel-runtime-debugger.md | 30 + assets/agent-pack/commands/debug-react.md | 4 + assets/agent-pack/commands/reproduce-bug.md | 27 +- assets/agent-pack/commands/validate-fix.md | 26 +- assets/agent-pack/docs/compatibility.md | 14 +- assets/agent-pack/profiles/claude-code.md | 17 - assets/agent-pack/profiles/copilot-cli.md | 17 - assets/agent-pack/profiles/cursor.md | 14 - assets/agent-pack/profiles/gemini-cli.md | 15 - assets/agent-pack/profiles/generic-mcp.md | 19 - .../SKILL.md} | 11 +- docs/adoption-checklist.md | 2 +- docs/agent-pack.md | 70 +- docs/github-visibility-plan.md | 168 -- docs/local-ports.md | 2 +- docs/project-history/BLUEPRINT.fr.md | 49 - docs/project-history/README.md | 6 - .../agent-rules/coding-style.fr.md | 30 - docs/public-readiness-audit.md | 57 - docs/release-gate.md | 147 -- docs/release-mvp.md | 53 - docs/scenarios/validation-loop.md | 6 +- docs/sprints/SPRINT1.md | 90 - docs/sprints/SPRINT10.md | 105 - docs/sprints/SPRINT11.md | 105 - docs/sprints/SPRINT12.md | 118 -- docs/sprints/SPRINT13.md | 115 -- docs/sprints/SPRINT14.md | 46 - docs/sprints/SPRINT15.md | 67 - docs/sprints/SPRINT2.md | 33 - docs/sprints/SPRINT3.md | 44 - docs/sprints/SPRINT4.md | 134 -- docs/sprints/SPRINT5.md | 97 - docs/sprints/SPRINT6.md | 153 -- docs/sprints/SPRINT7.md | 85 - docs/sprints/SPRINT8.md | 101 - docs/sprints/SPRINT9.md | 114 -- examples/test-app/package-lock.json | 1768 ----------------- src/agent-pack.ts | 38 +- 42 files changed, 131 insertions(+), 3906 deletions(-) create mode 100644 assets/agent-pack/agents/react-sentinel-runtime-debugger.md delete mode 100644 assets/agent-pack/profiles/claude-code.md delete mode 100644 assets/agent-pack/profiles/copilot-cli.md delete mode 100644 assets/agent-pack/profiles/cursor.md delete mode 100644 assets/agent-pack/profiles/gemini-cli.md delete mode 100644 assets/agent-pack/profiles/generic-mcp.md rename assets/agent-pack/skills/{react-sentinel-debug.md => react-sentinel-debug/SKILL.md} (83%) delete mode 100644 docs/github-visibility-plan.md delete mode 100644 docs/project-history/BLUEPRINT.fr.md delete mode 100644 docs/project-history/README.md delete mode 100644 docs/project-history/agent-rules/coding-style.fr.md delete mode 100644 docs/public-readiness-audit.md delete mode 100644 docs/release-gate.md delete mode 100644 docs/release-mvp.md delete mode 100644 docs/sprints/SPRINT1.md delete mode 100644 docs/sprints/SPRINT10.md delete mode 100644 docs/sprints/SPRINT11.md delete mode 100644 docs/sprints/SPRINT12.md delete mode 100644 docs/sprints/SPRINT13.md delete mode 100644 docs/sprints/SPRINT14.md delete mode 100644 docs/sprints/SPRINT15.md delete mode 100644 docs/sprints/SPRINT2.md delete mode 100644 docs/sprints/SPRINT3.md delete mode 100644 docs/sprints/SPRINT4.md delete mode 100644 docs/sprints/SPRINT5.md delete mode 100644 docs/sprints/SPRINT6.md delete mode 100644 docs/sprints/SPRINT7.md delete mode 100644 docs/sprints/SPRINT8.md delete mode 100644 docs/sprints/SPRINT9.md delete mode 100644 examples/test-app/package-lock.json diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 42ab9eb..6915183 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -43,13 +43,13 @@ Once all sub-tasks of a parent are validated: ## End of Sprint — MANDATORY DELIVERABLE The mission ends **ONLY** when these two conditions are met: 1. The last parent ticket is marked as **"Done"** on Jira. -2. **Report Writing**: You must create a new summary file in `docs/sprints/SPRINTX.md` (replace X with the sprint number). +2. **Report Writing**: You must leave a final sprint summary in the pull request description or final chat update. -The report must follow the project's standardized structure: +The summary must cover: - **Objective**: Reminder of the sprint's goals. - **Key Accomplishments**: Detailed list of features or fixes delivered. - **Technical Choices**: Justification for structural choices. - **Validation**: Evidence of correct operation (tests, builds, checks). - **Jira Tickets Completed**: Exhaustive list of closed tickets. -Once the file is created and committed, provide a global summary in the chat with the link to the branch and the new report. +Once the work is committed, provide a global summary in the chat with the branch link and the delivery summary. diff --git a/README.md b/README.md index e39f215..7a429ae 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ React-Sentinel keeps the CLI binary name `react-sentinel`, but the public npm pa - [docs/agent-runtime-ux.md](docs/agent-runtime-ux.md) — trigger heuristics, mode choice, and example agent prompts - [docs/adoption-checklist.md](docs/adoption-checklist.md) — onboarding checklist and validation scenarios - [docs/local-ports.md](docs/local-ports.md) — legitimate local URLs, ports, and CDP endpoints used in docs and tests -- [docs/public-readiness-audit.md](docs/public-readiness-audit.md) — Sprint 15 audit of public-repo cleanup decisions +- [docs/agent-pack.md](docs/agent-pack.md) — Claude Code agent-pack layout and managed files - [docs/workflows.md](docs/workflows.md) — deep workflow reference for Attach, Replay, Sandbox, and MCP wiring - [docs/local-diagnostics-checklist.md](docs/local-diagnostics-checklist.md) — troubleshooting diff --git a/assets/agent-pack/README.md b/assets/agent-pack/README.md index 034446f..38a688a 100644 --- a/assets/agent-pack/README.md +++ b/assets/agent-pack/README.md @@ -1,28 +1,22 @@ # React-Sentinel Agent Pack -This pack is the local integration bundle that React-Sentinel installs for AI coding agents. +This pack installs **Claude Code-ready project files** for React runtime debugging. -## Primary target +## Installed layout -- **Primary:** Claude Code project-local integration -- **Also included as documentation profiles:** generic MCP, Gemini CLI, Copilot - -## Contents - -- `commands/` - ready-to-reuse prompt commands for React debugging -- `skills/` - reusable operating rules for when and how to call React-Sentinel -- `docs/` - heuristics and compatibility notes that stay local to the project -- `profiles/` - per-agent integration notes and limits -- `manifest.json` - machine-readable ownership record for update and uninstall +- `.claude/commands/` - ready-to-use slash commands +- `.claude/skills/react-sentinel-debug/SKILL.md` - reusable runtime-debugging skill +- `.claude/agents/` - optional specialized agent instructions +- `.claude/docs/` - supporting heuristics and compatibility notes +- `.claude/.react-sentinel-manifest.json` - ownership record for update and uninstall +- `.mcp.json` - React-Sentinel MCP server entry for Claude Code ## Core commands -1. `debug-react` - start with server/session status, then inspect runtime, console, network, and component state. -2. `reproduce-bug` - build a reproducible Replay or Attach scenario before changing code. -3. `validate-fix` - turn the bug into assertions and use validation or sandbox tools to prove the fix. - -## Managed MCP config +1. `debug-react` - inspect runtime state, console, network, and React component data. +2. `reproduce-bug` - reproduce a browser issue in Replay or Attach before editing code. +3. `validate-fix` - convert the bug into checks and validate the fix before finishing. -The pack expects React-Sentinel to manage one MCP server entry in the project config file, usually `.mcp.json` for Claude Code. +## Compatibility -The Markdown assets in this folder are intentionally client-agnostic so they can be copied or adapted outside Claude Code when needed. +Claude Code is the primary target because the installed files follow Claude Code's native command, skill, and agent layout directly. Other MCP clients can still reuse the transport config and the markdown guidance manually. diff --git a/assets/agent-pack/agents/react-sentinel-runtime-debugger.md b/assets/agent-pack/agents/react-sentinel-runtime-debugger.md new file mode 100644 index 0000000..9303a3b --- /dev/null +++ b/assets/agent-pack/agents/react-sentinel-runtime-debugger.md @@ -0,0 +1,30 @@ +--- +name: react-sentinel-runtime-debugger +description: Specialized React-Sentinel agent for runtime bug reproduction, browser inspection, and fix validation in Claude Code. +tools: Read, Grep, Glob, Bash +model: sonnet +--- + +# React-Sentinel Runtime Debugger + +You are the runtime-debugging specialist for React-Sentinel tasks. + +## Use this agent when + +- the user reports a React UI bug that must be reproduced in the browser; +- runtime state, props, hooks, network activity, or console output matter; +- or a proposed fix must be validated with browser assertions before completion. + +## Workflow + +1. Confirm the app or target URL that should be inspected. +2. Start from runtime evidence, not source-code guesses. +3. Prefer Replay before Attach. +4. Use the installed `/debug-react`, `/reproduce-bug`, and `/validate-fix` commands when they fit. +5. Summarize the reproduction path, the observed signals, and the validation result. + +## Avoid this agent when + +- the task is purely editorial or static; +- no runnable target exists; +- or the question can be answered from repository files alone. diff --git a/assets/agent-pack/commands/debug-react.md b/assets/agent-pack/commands/debug-react.md index 5323bb8..927dadd 100644 --- a/assets/agent-pack/commands/debug-react.md +++ b/assets/agent-pack/commands/debug-react.md @@ -1,3 +1,7 @@ +--- +description: Inspect a live React runtime with React-Sentinel before editing source code. +--- + # debug-react Use this command when the task looks like a real browser or React runtime bug instead of a pure source-code question. diff --git a/assets/agent-pack/commands/reproduce-bug.md b/assets/agent-pack/commands/reproduce-bug.md index 5137b5c..7d58e22 100644 --- a/assets/agent-pack/commands/reproduce-bug.md +++ b/assets/agent-pack/commands/reproduce-bug.md @@ -1,17 +1,22 @@ +--- +description: Reproduce a React or browser bug with React-Sentinel before proposing a fix. +--- + # reproduce-bug -Use this command when the agent needs a stable reproduction before proposing a fix. +Use this command when you need a deterministic reproduction before changing code. -## Checklist +## Recommended flow -1. Capture the target URL, important preconditions, and the exact user-visible failure. -2. Decide between: - - **Replay** for deterministic, isolated reproduction; - - **Attach** only if the issue depends on authenticated or extension-backed browser state. -3. Rebuild the bug with `navigate_replay`, `replay_interactions`, or attach-mode interaction tools. -4. Record the first verdict from console, network, runtime status, and visible UI state. -5. Keep the reproduction steps compact enough to replay after a code change. +1. Start with `get_server_info` and `get_session_status`. +2. Choose **Replay** unless the issue requires an existing logged-in tab or real browser state. +3. Navigate to the failing page and replay the minimal steps that trigger the bug. +4. Capture the useful signals early: console events, network events, render hotspots, hydration issues, or async timeline data. +5. Write down the exact trigger, observed result, and expected result. +6. End with a runtime assertion that can be reused by `validate-fix`. -## Guardrail +## Expected outcome -If the bug can be explained by static code inspection alone, do not force a runtime reproduction. +- a stable reproduction path exists; +- the failure is backed by observable runtime evidence; +- and follow-up validation can reuse the same scenario. diff --git a/assets/agent-pack/commands/validate-fix.md b/assets/agent-pack/commands/validate-fix.md index 7ccd271..4feabbf 100644 --- a/assets/agent-pack/commands/validate-fix.md +++ b/assets/agent-pack/commands/validate-fix.md @@ -1,19 +1,21 @@ +--- +description: Validate a proposed React fix with React-Sentinel assertions or replay checks. +--- + # validate-fix -Use this command after the bug is reproducible and the agent has a concrete fix hypothesis. +Use this command after the bug is reproduced and you have a concrete fix hypothesis. -## Validation sequence +## Recommended flow -1. Re-run the failing scenario with `validate_after_action` or `validate_scenario`. -2. If the fix is still hypothetical, use `apply_patch_then_replay` or `apply_runtime_patch` in replay mode first. -3. Prefer structured assertions over visual guesswork. -4. Confirm the fix against the same console, network, DOM, and React-state signals that proved the bug. -5. Clean up any sandbox patches after the verdict. +1. Reuse the reproduction scenario instead of inventing a new one. +2. Express success as `validate_after_action` or `validate_scenario` assertions. +3. Prefer Replay for deterministic validation. +4. Use Shadow Sandbox or runtime patch validation before editing source when one runtime hypothesis needs proof. +5. Re-run the assertions after the change and capture pass/fail evidence. ## Expected outcome -The agent should end with one of these states: - -- the scenario is now validated; -- the runtime patch proves the hypothesis but source code still needs to change; -- or the attempted fix is disproved and the investigation must continue. +- the fix is validated against the original bug; +- the final answer cites observed runtime evidence; +- and regressions are less likely because the success condition is explicit. diff --git a/assets/agent-pack/docs/compatibility.md b/assets/agent-pack/docs/compatibility.md index c977112..405e33e 100644 --- a/assets/agent-pack/docs/compatibility.md +++ b/assets/agent-pack/docs/compatibility.md @@ -1,11 +1,11 @@ # Agent compatibility -| Agent | Support level | What the pack provides | Notes | +| Agent / client | Support level | What the pack provides | Notes | |---|---|---|---| -| Claude Code | Primary | Project-local `.mcp.json`, commands, skills, heuristics, profile docs | The default install target | -| Generic MCP client | Supported with manual wiring | Standard stdio launch command, arguments, and local docs | Client-specific config path may differ | -| Cursor | Documented adaptation | Cursor profile notes plus the same MCP launch guidance | `.cursor/mcp.json` is a natural project-local target | -| Gemini CLI | Documented adaptation | Prompt/skill guidance and generic MCP notes | Manual setup expected | -| Copilot | Documented adaptation | Prompt/skill guidance and generic MCP notes | VS Code and CLI surfaces may differ | +| Claude Code | Primary | `.claude/commands`, `.claude/skills`, `.claude/agents`, `.claude/docs`, and `.mcp.json` | Immediately usable without rewriting the markdown files | +| Generic MCP client | Supported with manual wiring | Standard stdio launch command plus reusable guidance | Client-specific config path may differ | +| Cursor | Documented adaptation | Reuse the same MCP launch config and markdown guidance manually | `.cursor/mcp.json` remains a natural project-local target | +| Gemini CLI | Documented adaptation | Reuse the same MCP launch config and guidance manually | Command and prompt wiring remain client-specific | +| GitHub Copilot / VS Code | Documented adaptation | Reuse the same MCP launch config and guidance manually | `.vscode/mcp.json` remains the main config target | -The pack keeps the Markdown assets portable so the same guidance can move across clients even when their native command surfaces differ. +The pack keeps Claude Code as the only auto-wired experience. Other clients can still reuse the same transport config and prompt guidance without changing the core React-Sentinel launch command. diff --git a/assets/agent-pack/profiles/claude-code.md b/assets/agent-pack/profiles/claude-code.md deleted file mode 100644 index 86b96c3..0000000 --- a/assets/agent-pack/profiles/claude-code.md +++ /dev/null @@ -1,17 +0,0 @@ -# Claude Code profile - -## Role - -Claude Code is the primary Sprint 14 target. - -## Integration shape - -- project-local MCP config in `.mcp.json`; -- React-Sentinel server entry added under `mcpServers`; -- local command, skill, and heuristic files stored under `.react-sentinel/agent-pack/`. - -## Why this profile is first - -- project-scoped MCP config fits React-Sentinel's local workflow; -- commands and skills can live next to the repository; -- install, update, and uninstall can stay deterministic. diff --git a/assets/agent-pack/profiles/copilot-cli.md b/assets/agent-pack/profiles/copilot-cli.md deleted file mode 100644 index c75975f..0000000 --- a/assets/agent-pack/profiles/copilot-cli.md +++ /dev/null @@ -1,17 +0,0 @@ -# Copilot adaptation - -Use the **generic MCP profile** as the baseline and keep the pack guidance close to the repository. - -## What carries over - -- the same stdio launch command and arguments; -- the same runtime-debugging heuristics; -- the same command routines for debug, reproduction, and fix validation. - -## What stays manual in Sprint 14 - -- mapping the pack routines to Copilot chat prompts or custom instructions; -- deciding where to surface the skill text in the client workflow; -- any client-specific packaging beyond standard MCP wiring. - -For VS Code workspaces, a project-local `.vscode/mcp.json` file is a reasonable place to carry the same stdio launch command. diff --git a/assets/agent-pack/profiles/cursor.md b/assets/agent-pack/profiles/cursor.md deleted file mode 100644 index 8062470..0000000 --- a/assets/agent-pack/profiles/cursor.md +++ /dev/null @@ -1,14 +0,0 @@ -# Cursor adaptation - -Use the **generic MCP profile** as the transport baseline and point Cursor at the same stdio launch command. - -## What carries over - -- the same `mcp` launch command for React-Sentinel; -- the same runtime-debugging heuristics and command routines; -- project-local setup through `.cursor/mcp.json` when you want repository-scoped wiring. - -## What stays manual - -- Cursor-specific prompt recipes or chat habits; -- any non-MCP project instructions you want Cursor to load automatically. diff --git a/assets/agent-pack/profiles/gemini-cli.md b/assets/agent-pack/profiles/gemini-cli.md deleted file mode 100644 index c021c2a..0000000 --- a/assets/agent-pack/profiles/gemini-cli.md +++ /dev/null @@ -1,15 +0,0 @@ -# Gemini CLI adaptation - -Use the **generic MCP profile** as the transport baseline. - -## What carries over - -- the same stdio launch command for React-Sentinel; -- the `debug-react`, `reproduce-bug`, and `validate-fix` routines; -- the same heuristics for deciding between Replay, Attach, and Sandbox. - -## What stays manual in Sprint 14 - -- command alias registration; -- persistent prompt memory wiring; -- any Gemini-specific packaging conventions beyond standard MCP launch data. diff --git a/assets/agent-pack/profiles/generic-mcp.md b/assets/agent-pack/profiles/generic-mcp.md deleted file mode 100644 index cb8b9e7..0000000 --- a/assets/agent-pack/profiles/generic-mcp.md +++ /dev/null @@ -1,19 +0,0 @@ -# Generic MCP profile - -## Role - -This profile describes the portable stdio setup for any MCP client that can launch a local command. - -## Expected values - -- command: `node`, `react-sentinel`, or `npx` -- args: launch React-Sentinel with `mcp` and a replay visibility flag -- env: normal local shell environment, plus any client-specific overrides - -When the client fetches React-Sentinel from npm, the public package name is `@edgarbrunet/react-sentinel`. - -## Limits - -- config file path and JSON shape may differ by client; -- command palette and slash-command wiring are not assumed; -- the Markdown command and skill files may need manual copy or adaptation. diff --git a/assets/agent-pack/skills/react-sentinel-debug.md b/assets/agent-pack/skills/react-sentinel-debug/SKILL.md similarity index 83% rename from assets/agent-pack/skills/react-sentinel-debug.md rename to assets/agent-pack/skills/react-sentinel-debug/SKILL.md index 278c866..ada62ee 100644 --- a/assets/agent-pack/skills/react-sentinel-debug.md +++ b/assets/agent-pack/skills/react-sentinel-debug/SKILL.md @@ -1,3 +1,8 @@ +--- +name: react-sentinel-debug +description: Use React-Sentinel when a task needs live browser or React runtime inspection rather than static code reading alone. +--- + # React-Sentinel Debug Skill Use React-Sentinel only when the task benefits from **observing a live browser runtime** instead of only reading repository files. @@ -21,9 +26,9 @@ Use React-Sentinel only when the task benefits from **observing a live browser r 1. `get_server_info` 2. `get_session_status` -3. `debug-react` -4. `reproduce-bug` -5. `validate-fix` +3. `/debug-react` +4. `/reproduce-bug` +5. `/validate-fix` ## Mode rules diff --git a/docs/adoption-checklist.md b/docs/adoption-checklist.md index 4d4b481..f069a45 100644 --- a/docs/adoption-checklist.md +++ b/docs/adoption-checklist.md @@ -1,6 +1,6 @@ # Universal adoption checklist -This checklist captures the onboarding scenarios React-Sentinel must support for Sprint 15. +This checklist captures the onboarding scenarios React-Sentinel should support across its documented environments. ## Validation scenarios diff --git a/docs/agent-pack.md b/docs/agent-pack.md index 3b4991d..0e2fa94 100644 --- a/docs/agent-pack.md +++ b/docs/agent-pack.md @@ -2,70 +2,44 @@ ## Objective -The agent pack turns React-Sentinel into a project-local integration bundle that an AI coding agent can install, inspect, update, and remove without hand-editing every file. +The agent pack installs a **Claude Code-ready local bundle** so the repository gets usable commands, skills, agents, and MCP wiring in one pass. -Claude Code is the primary target. The same pack also exposes a generic MCP profile plus documented adaptations for Cursor, Gemini CLI, and Copilot. +## Target layout -## Target format - -The pack is a **managed project-local bundle** rooted at: +The managed Claude Code bundle is rooted at: ```text -.react-sentinel/agent-pack/ +.claude/ ``` -The bundle is designed around three principles: - -1. **Deterministic ownership** — React-Sentinel tracks every managed file in a manifest so update and uninstall can tell which files belong to the pack. -2. **Claude Code first** — installation writes the MCP server entry to the project-local `.mcp.json` file by default. -3. **Portable guidance** — commands, skills, heuristics, and compatibility notes live as plain Markdown files so they stay readable outside one specific client. - -The repository keeps the reusable pack assets under `assets/agent-pack/`. Install and update flows copy those assets into the project-local managed bundle. - -## Managed file layout +## Managed files | Path | Purpose | |---|---| -| `.react-sentinel/agent-pack/manifest.json` | Ownership record for generated files, install mode, server name, and conflict detection | -| `.react-sentinel/agent-pack/README.md` | Local summary of what the pack contains and how to use it | -| `.react-sentinel/agent-pack/commands/debug-react.md` | Main React debugging routine for agents | -| `.react-sentinel/agent-pack/commands/reproduce-bug.md` | Reproduction-focused routine for Replay or Attach | -| `.react-sentinel/agent-pack/commands/validate-fix.md` | Validation routine for assertions or Shadow Sandbox | -| `.react-sentinel/agent-pack/skills/react-sentinel-debug.md` | Reusable agent instructions for when and how to call React-Sentinel | -| `.react-sentinel/agent-pack/docs/heuristics.md` | Trigger signals, non-trigger rules, and mode decision guidance | -| `.react-sentinel/agent-pack/docs/compatibility.md` | Compatibility matrix across Claude Code, generic MCP, Cursor, Gemini CLI, and Copilot | -| `.react-sentinel/agent-pack/profiles/*.md` | Per-agent profile notes and integration constraints | +| `.claude/.react-sentinel-manifest.json` | Ownership record for generated files, install mode, server name, and conflict detection | +| `.claude/README.md` | Local summary of what the installed pack contains | +| `.claude/commands/debug-react.md` | Runtime debugging slash command | +| `.claude/commands/reproduce-bug.md` | Reproduction-first slash command | +| `.claude/commands/validate-fix.md` | Validation slash command | +| `.claude/skills/react-sentinel-debug/SKILL.md` | Reusable runtime-debugging skill | +| `.claude/agents/react-sentinel-runtime-debugger.md` | Specialized Claude Code agent | +| `.claude/docs/heuristics.md` | Trigger and non-trigger guidance | +| `.claude/docs/compatibility.md` | Compatibility notes for Claude Code and other MCP clients | | `.mcp.json` | Claude Code MCP config entry written or updated by install/update flows | ## Install model -The initial install model is: - -- generate the pack bundle in `.react-sentinel/agent-pack/`, -- merge or write a `react-sentinel` server entry in `.mcp.json`, -- keep a manifest of content hashes for managed files, -- and refuse destructive overwrites unless the caller explicitly forces them. - -The MCP entry remains standard stdio JSON and reuses the existing React-Sentinel launch modes: +The install flow: -- `local` -> `node /absolute/path/to/dist/index.js mcp --headless` -- `global` -> `react-sentinel mcp --headless` -- `npx` -> `npx -y @edgarbrunet/react-sentinel mcp --headless` +- writes Claude Code-native markdown files into `.claude/`, +- writes or updates the `react-sentinel` entry in `.mcp.json`, +- tracks managed content hashes in a manifest, +- and refuses destructive overwrites unless the caller explicitly forces them. ## Compatibility boundaries -### Fully supported in Sprint 14 - -- **Claude Code** project-local installation through `.mcp.json` -- **Generic MCP** documented profile using the same stdio command, args, and environment expectations - -### Documented, not auto-wired - -- **Cursor** adaptation notes -- **Gemini CLI** adaptation notes -- **Copilot** adaptation notes - -These profiles stay in the pack as documentation-first adapters because their command and prompt surfaces are less uniform than Claude Code's project-local MCP file. +- **Claude Code** is the primary target and is ready to use immediately after installation. +- **Other MCP clients** reuse the same stdio transport and guidance, but their command or prompt surfaces stay manual. ## Conflict model @@ -74,5 +48,3 @@ The pack must never silently overwrite user customizations. - **Install** fails if managed files already exist outside the manifest, or if the target MCP entry already exists with a conflicting shape. - **Update** compares current file hashes with the manifest and warns before overwriting modified managed files. - **Uninstall** removes only React-Sentinel-owned files and only removes the MCP entry that the pack previously managed. - -When the caller wants to override a conflict intentionally, the CLI must require an explicit force flag instead of guessing. diff --git a/docs/github-visibility-plan.md b/docs/github-visibility-plan.md deleted file mode 100644 index 25b6905..0000000 --- a/docs/github-visibility-plan.md +++ /dev/null @@ -1,168 +0,0 @@ -# GitHub visibility plan - -This document provides a ready-to-apply configuration for the public GitHub repository. All actions listed here require Edgar's manual approval or execution; none are applied automatically. - ---- - -## Suggested repository description - -``` -Runtime debugger for AI agents — MCP server that gives AI tools live React inspection, bug replay, and fix validation. -``` - -(140 characters, within GitHub's limit.) - -## Suggested website URL - -``` -https://www.npmjs.com/package/@edgarbrunet/react-sentinel -``` - -Update this once the npm package is published. - -## Suggested topics (GitHub repository topics) - -Apply these under **Settings → General → Topics**: - -``` -mcp react debugging ai playwright devtools typescript model-context-protocol agent browser-automation -``` - -Keep the list to 10 or fewer for maximum discoverability. Topics must be lowercase, hyphen-separated. - -## Suggested repository labels - -Create or rename labels under **Issues → Labels**: - -| Name | Color | Description | -|---|---|---| -| `bug` | `#d73a4a` | Something is not working as expected | -| `enhancement` | `#a2eeef` | New feature or improvement request | -| `good first issue` | `#7057ff` | Easy entry point for new contributors | -| `help wanted` | `#008672` | Maintainer is actively seeking contributions | -| `needs-triage` | `#e4e669` | Not yet reviewed by a maintainer | -| `documentation` | `#0075ca` | Improvements or additions to documentation | -| `dependencies` | `#0366d6` | Pull requests that update a dependency | -| `ci` | `#bfd4f2` | Related to the CI/CD pipeline | -| `agent-pack` | `#f9d0c4` | Agent Pack CLI feature area | -| `mcp-protocol` | `#c5def5` | MCP server core or tool definitions | - -## Social preview image - -A placeholder SVG is available at [`assets/social-preview.svg`](../assets/social-preview.svg). To apply it as the repository's Open Graph image: - -1. Convert the SVG to a PNG at 1280 × 640 px (GitHub requires PNG or JPEG for social previews). -2. Go to **Settings → General → Social preview → Edit**. -3. Upload the converted PNG. - -Suggested conversion command (requires Inkscape or a similar tool): - -```bash -inkscape assets/social-preview.svg --export-type=png --export-filename=assets/social-preview.png -w 1280 -h 640 -``` - -Or using ImageMagick with rsvg-convert: - -```bash -rsvg-convert -w 1280 -h 640 assets/social-preview.svg > assets/social-preview.png -``` - -## Draft public issues to create - -Create these issues on GitHub after making the repository public. They improve discoverability and signal active maintenance. - ---- - -### Issue 1 — Good first issue (new contributor entry point) - -**Title:** `Add --json flag to init-mcp for machine-readable output` - -**Labels:** `good first issue`, `enhancement` - -**Body:** - -``` -### Task - -The `init-mcp` command currently prints human-readable text. Add an optional `--json` flag that -outputs the generated MCP config snippet as a JSON object to stdout, making it easier for -shell scripts or editor plugins to consume. - -### Acceptance criteria - -- `node dist/index.js init-mcp --client claude-code --mode npx --json` prints valid JSON. -- The JSON shape is `{ "client": "", "mode": "", "config": { … } }`. -- All existing text output is unchanged when `--json` is not passed. -- `npm run check && npm run build` pass. - -### Starting points - -- Entry point: `src/index.ts` — look for the `init-mcp` command handler. -- Config generation: `src/mcp-config.ts`. -- Run `npm run build && node dist/index.js init-mcp --client claude-code --mode npx` to see current output. - -### Effort estimate - -1–3 hours. -``` - ---- - -### Issue 2 — Feature request (ecosystem expansion) - -**Title:** `Support JetBrains AI Assistant as an MCP client target` - -**Labels:** `enhancement`, `help wanted` - -**Body:** - -``` -### Motivation - -JetBrains AI Assistant (IntelliJ, WebStorm, etc.) supports MCP servers via its plugin ecosystem. -React-Sentinel already supports Claude Code, Cursor, GitHub Copilot, and Gemini CLI. Adding a -`--client jetbrains` target would make the `init-mcp` command usable for JetBrains users. - -### Proposed solution - -1. Research the JetBrains AI Assistant MCP config file path and format. -2. Add a `jetbrains` client entry to `src/mcp-config.ts`. -3. Update `docs/integration-guides.md` with a JetBrains section. -4. Add the new client to the supported environments table in `README.md`. -``` - ---- - -### Issue 3 — Documentation improvement - -**Title:** `Document how to use React-Sentinel with pnpm and Yarn workspaces` - -**Labels:** `documentation` - -**Body:** - -``` -### Motivation - -The current `init-mcp` and agent-pack install flows assume npm. Teams using pnpm workspaces -or Yarn Berry (PnP) may encounter path or lockfile differences. - -### Task - -Add a section to `docs/universal-install.md` covering: -- How to run `npx @edgarbrunet/react-sentinel init-mcp` under pnpm (`pnpm dlx`) and Yarn (`yarn dlx`). -- Whether `install-agent-pack` works in a monorepo root vs. a sub-package. -- Known limitations (if any) when Yarn PnP is enabled. -``` - -## Pinned discussions / README badges - -Consider adding these badges to `README.md` once the package is published: - -```markdown -[![npm version](https://img.shields.io/npm/v/@edgarbrunet/react-sentinel)](https://www.npmjs.com/package/@edgarbrunet/react-sentinel) -[![CI](https://github.com/edgarbnt/ReactSentinel/actions/workflows/ci.yml/badge.svg)](https://github.com/edgarbnt/ReactSentinel/actions/workflows/ci.yml) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) -``` - -Apply these after the npm package is live and CI has run at least once. diff --git a/docs/local-ports.md b/docs/local-ports.md index f3b15b2..9a464c2 100644 --- a/docs/local-ports.md +++ b/docs/local-ports.md @@ -12,7 +12,7 @@ These local URLs and ports are legitimate examples used by React-Sentinel for de | `http://localhost:5176/` | Validation-loop scenario example | `docs/scenarios/validation-loop.md` | | `http://127.0.0.1:3000` | Common fallback suggestion for Next.js-style local apps | `src/index.ts`, `src/project-detection.ts` | | `http://127.0.0.1:9222` | Default Chrome CDP endpoint for attach mode | `src/browser/index.ts` | -| `http://127.0.0.1:9333` | Alternate CDP endpoint example | `docs/release-mvp.md` | +| `http://127.0.0.1:9333` | Alternate CDP endpoint example | `src/index.ts` | ## Why these values stay in the repo diff --git a/docs/project-history/BLUEPRINT.fr.md b/docs/project-history/BLUEPRINT.fr.md deleted file mode 100644 index 971ba75..0000000 --- a/docs/project-history/BLUEPRINT.fr.md +++ /dev/null @@ -1,49 +0,0 @@ -React-Sentinel est une infrastructure de débogage autonome conçue pour transformer les agents IA (comme Claude Code ou GitHub Copilot CLI) de simples générateurs de texte en véritables ingénieurs capables d'observer et de valider leurs actions en temps réel. - -L'outil agit comme un serveur MCP (Model Context Protocol) qui fait le pont entre le terminal où réside l'IA et l'environnement d'exécution du navigateur. - -Ce que fait l'outil : Les capacités techniques -1. Vision du Runtime (L'Inspection "Live") -Au lieu de se baser uniquement sur les fichiers sources statiques, l'outil donne à l'IA un accès direct aux entrailles du navigateur : - -Extraction de l'arbre React (Fiber) : L'IA peut explorer la structure des composants, voir les props passées, les valeurs actuelles des hooks (useState, useMemo) et l'état des contextes globaux. - -Audit Réseau et Console : L'outil remonte instantanément les erreurs JavaScript, les avertissements de performance et les échecs de requêtes API (401, 500) directement dans le flux de réflexion de l'IA. - -Analyse de l'Hydratation : Pour les frameworks comme Next.js, il identifie les divergences entre le rendu serveur et le rendu client, un domaine où les IA sont habituellement aveugles. - -2. La "Shadow Sandbox" (Validation par l'expérience) -C’est la fonctionnalité maîtresse : la capacité de tester sans casser. - -Hot-Patching éphémère : L'IA peut soumettre un "patch" (une modification de code) à l'outil. Ce dernier l'injecte dans une instance de navigateur isolée sans modifier les fichiers locaux de l'utilisateur. - -Assertions autonomes : Après avoir injecté le patch, l'IA peut vérifier si le crash a disparu ou si l'élément visuel est désormais correct. Elle ne propose le code final que si le test en sandbox est concluant. - -3. Simulation d'Interactions -L'outil permet à l'IA de "manipuler" l'application : - -Scripts de reproduction : L'IA peut ordonner au navigateur de cliquer sur des boutons, de remplir des formulaires ou de naviguer dans l'application pour reproduire un bug complexe avant de tenter de le résoudre. - -Cas d'usages principaux -Résolution des boucles de rendu (Infinite Loops) -Lorsqu'un composant React boucle à l'infini à cause d'une dépendance mal gérée dans un useEffect, l'IA ne peut généralement pas le voir via le code seul. Avec React-Sentinel, l'outil détecte l'explosion du nombre de rendus et fournit à l'IA l'historique des changements de variables. L'IA identifie alors la variable instable et corrige le hook avec une certitude absolue. - -Débogage des flux asynchrones complexes -Dans une application où plusieurs appels API influencent l'état de l'UI (ex: un tableau de bord financier), l'IA utilise l'outil pour tracer l'ordre exact des promesses et l'évolution du state à chaque étape. Elle peut ainsi détecter une condition de course (race condition) qu'elle aurait ignorée par une simple lecture de code. - -Validation de la cohérence UI/UX -Si un utilisateur signale qu'un menu déroulant se ferme de manière inattendue, l'IA peut utiliser l'outil pour déclencher l'ouverture du menu, inspecter les événements "blur" ou "click-away" dans le runtime, et comprendre quel gestionnaire d'événements est responsable du comportement erroné. - -Migration et Refactoring de sécurité -Lors du changement d'une bibliothèque de gestion d'état (ex: passer de Redux à Zustand), l'IA peut migrer les composants un par un et utiliser la sandbox pour vérifier que chaque composant migré conserve un état identique à la version originale en comparant les instantanés de la mémoire (snapshots) fournis par l'outil. - -En résumé, l'outil transforme le débogage par IA d'un processus de "devinette" basé sur la lecture de code en un processus scientifique basé sur l'observation des faits et la validation expérimentale. - -4. Stratégie de Connexion au Navigateur (Le Mur Conceptuel) -Pour que le débogage soit réellement utile, l'IA doit pouvoir inspecter l'application dans son "état bugué" (ex: après avoir rempli un formulaire). Pour y parvenir, React-Sentinel adopte une stratégie hybride à deux niveaux : - -Priorité 1 : L'approche "Attach" (Idéale & Puissante) -Le serveur MCP tente d'abord de se connecter au navigateur de développement de l'utilisateur (via le protocole CDP, par exemple sur le port 9222 de Chrome). Cela permet à l'IA d'inspecter exactement l'onglet que le développeur regarde, avec son état complexe et sa session active. - -Priorité 2 : L'approche "Replay" (Fallback & Sandboxing) -Si la connexion "Attach" échoue ou si le développeur refuse l'accès, l'outil bascule sur une instance isolée "headless" (Playwright). Dans ce mode de "Shadow Sandbox", l'IA peut naviguer vers l'URL depuis un état vierge et simuler les interactions nécessaires pour reproduire le bug avant de l'inspecter. diff --git a/docs/project-history/README.md b/docs/project-history/README.md deleted file mode 100644 index 3eca2b6..0000000 --- a/docs/project-history/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Project history - -This directory keeps historical or internal project notes that are useful to preserve, but are not part of the main public onboarding flow. - -- French-language internal notes can live here without polluting the public product surface. -- Sprint reports remain in `docs/sprints/` because the active sprint workflow still writes there. diff --git a/docs/project-history/agent-rules/coding-style.fr.md b/docs/project-history/agent-rules/coding-style.fr.md deleted file mode 100644 index 8483dbe..0000000 --- a/docs/project-history/agent-rules/coding-style.fr.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -trigger: model_decision -description: before the modification of a file ---- - -1. Architecture MCP - -Chaque outil MCP = un fichier dans src/tools/ -Toujours valider les inputs avec Zod (jamais de any) -Format de retour uniforme : { content: [{ type: "text", text: JSON.stringify(...) }] } -2. Gestion des erreurs - -Jamais crasher le serveur — toujours try/catch dans les tools -Retourner une erreur structurée plutôt que de throw -3. Playwright / Browser - -Toujours fermer les contextes browser dans un finally -Une session Playwright = un contexte isolé, jamais partagé entre tools -4. TypeScript - -Mode strict obligatoire, zéro any, zéro as unknown -Types explicites sur tous les retours de fonctions async -5. Conventions de code - -Commits en Conventional Commits (feat:, fix:, chore:) -Commentaires en anglais, messages de commit en anglais -6. Sécurité / Sandbox - -Le hot-patching n'écrit jamais sur les fichiers locaux de l'user -Les sessions browser sont toujours headless sauf en mode debug explicite diff --git a/docs/public-readiness-audit.md b/docs/public-readiness-audit.md deleted file mode 100644 index 646c32b..0000000 --- a/docs/public-readiness-audit.md +++ /dev/null @@ -1,57 +0,0 @@ -# Public readiness audit - -This audit was produced before the Sprint 15 cleanup changes for public-repo readiness. - -## Safe to keep - -| Path | Why it stays | -|---|---| -| `README.md` | Public product entrypoint in English | -| `docs/universal-install.md`, `docs/integration-guides.md`, `docs/agent-runtime-ux.md`, `docs/adoption-checklist.md`, `docs/workflows.md` | Public onboarding and workflow docs | -| `examples/test-app/` and `examples/README.md` | Legitimate demo and validation fixture | -| `src/`, `scripts/`, `assets/agent-pack/`, `dist/` | Product source, automation, packaged CLI output, and reusable assets | -| `docs/sprints/` | Historical delivery reports; useful as project history | -| `.github/copilot-instructions.md` | Automation config, not user-facing product documentation | - -## Should document - -| Topic | Evidence | Follow-up | -|---|---|---| -| Local URLs and ports | `examples/test-app/package.json`, `scripts/mcp-e2e-utils.ts`, `src/browser/index.ts`, `src/project-detection.ts`, `docs/workflows.md`, `docs/local-diagnostics-checklist.md` | Centralize them in `docs/local-ports.md` | -| Alternate CDP endpoint example | `docs/release-mvp.md`, `src/index.ts` | Keep it as a documented example rather than treating it as suspicious | -| Historical docs | `docs/sprints/*.md` | Keep them clearly framed as history, not onboarding | - -## Should move - -| Path | Reason | -|---|---| -| `BLUEPRINT.md` | French internal vision note at the repository root; better kept under project history | -| `.agents/rules/coding-style.md` | Internal agent rule file in French; not part of the public product surface | - -## Should remove - -No obviously useless temporary files, generated crash dumps, or real secrets were found during this audit. - -## Needs human decision - -| Topic | Why human validation is required | -|---|---| -| GitHub visibility, topics, social preview, and description | Public reputation and settings ownership belong to Edgar | -| npm publication under `@edgarbrunet/react-sentinel` | Public release is irreversible and must stay manual | -| Marketplace submissions and launch messaging | Public distribution choices must remain human-approved | - -## Secret scan summary - -`git grep` produced only false positives: - -- `js-tokens` entries in example lockfiles; -- a demo DOM label named `render-loop-token`; -- the `username` and `password` parameter names in the browser instrumentation wrapper. - -No likely real credentials, access tokens, or private keys were found. - -## MCP stdio audit - -- `node dist/index.js mcp --headless` produced **0 stdout bytes** during startup. -- startup and shutdown logs are emitted on **stderr** via `console.error`. -- normal `console.log` usage in `src/index.ts` is restricted to non-MCP commands such as `doctor`, `init-mcp`, and install helpers. diff --git a/docs/release-gate.md b/docs/release-gate.md deleted file mode 100644 index db0b451..0000000 --- a/docs/release-gate.md +++ /dev/null @@ -1,147 +0,0 @@ -# Manual release gate - -This document lists every action that **must stay manual** before and during the public launch of React-Sentinel. No agent, CI job, or automation script should perform these steps without Edgar's explicit approval. - ---- - -## Why this gate exists - -React-Sentinel operates in two modes: - -1. **Repository mode** — source code visible on GitHub (low risk, mostly reversible). -2. **Package mode** — a published npm package under `@edgarbrunet/react-sentinel` (irreversible once indexed by registries and consumed by users). - -The release gate separates the two and ensures Edgar retains ownership of every public reputation decision. - ---- - -## Checklist: before making the repository public - -- [ ] **Read and accept the public-readiness audit** at `docs/public-readiness-audit.md`. -- [ ] **Apply repository settings manually:** - - Repository description (see `docs/github-visibility-plan.md`). - - Website URL (npm page once published). - - Topics (see `docs/github-visibility-plan.md`). - - Social preview image (see `docs/github-visibility-plan.md` for the PNG export step). -- [ ] **Review default branch protection rules** — ensure `main` requires a passing CI check before merges. -- [ ] **Verify that no secrets are committed** — run the secret scan below. -- [ ] **Confirm `LICENSE` file exists** at the repo root (MIT). - -### Secret scan command (run locally before going public) - -```bash -git grep -n -E "(password|token|secret|api.?key|private.?key)\s*[:=]\s*['\"]" \ - -- ':!node_modules' ':!dist' ':!pnpm-lock.yaml' ':!package-lock.json' -``` - -Expected result: zero matches (the audit in `docs/public-readiness-audit.md` confirmed this as of Sprint 15). - ---- - -## Checklist: npm publish - -npm publication is **irreversible**. Once a version is indexed, it is permanently available in the npm registry. - -- [ ] **Ensure the package name is exactly `@edgarbrunet/react-sentinel`** — confirm in `package.json`. -- [ ] **Bump `version`** in `package.json` to the intended release version (e.g., `0.1.0`). -- [ ] **Run the full validation suite locally:** - -```bash -# From repo root -npm run check -npm run build -cd examples/test-app && npm run build -``` - -- [ ] **Dry-run publish** to inspect what will be uploaded: - -```bash -npm pack --dry-run -``` - -This prints the list of files that would be included. Verify no internal docs, French notes, or agent rules are accidentally bundled. Check `package.json` for a `files` allowlist if needed. - -- [ ] **Authenticate with the npm registry:** - -```bash -npm login --scope=@edgarbrunet -``` - -- [ ] **Publish:** - -```bash -npm publish --access public -``` - -- [ ] **Verify the published package on npm:** - -```bash -npm info @edgarbrunet/react-sentinel -npx -y @edgarbrunet/react-sentinel --version -``` - -### Current `package.json` `files` allowlist - -React-Sentinel now uses this `files` field in `package.json` to limit what is uploaded: - -```json -"files": [ - "dist/", - "assets/agent-pack/", - "README.md", - "LICENSE" -] -``` - -Verify that the allowlist still matches the release intent before every publish. It keeps internal docs, sprint reports, and project-history files out of the npm package. - ---- - -## Checklist: post-publish GitHub actions - -These steps are manual because they affect public reputation and discoverability: - -- [ ] **Create a GitHub Release** tagged `v0.1.0` with a human-written changelog. -- [ ] **Create the public issues** listed in `docs/github-visibility-plan.md` (bug report, feature request, good first issue). -- [ ] **Apply repository labels** as specified in `docs/github-visibility-plan.md`. -- [ ] **Pin or close the planning issues** once they are no longer relevant. -- [ ] **Update the README badges** (npm version, CI status) once CI has run successfully on `main`. - ---- - -## What automation is allowed to do - -| Action | Allowed | Notes | -|---|---|---| -| Type-check (`npm run check`) | ✅ CI | Runs on every PR and push | -| Build (`npm run build`) | ✅ CI | Runs on every PR and push | -| Test-app build | ✅ CI | Runs on every PR and push | -| Open pull requests | ✅ Agents | Always reviewed by Edgar before merge | -| Commit and push to sprint branches | ✅ Agents | Never to `main` directly | -| `npm publish` | ❌ Never automated | Must be manual | -| Change repository visibility | ❌ Never automated | Must be manual in GitHub Settings | -| Apply repository topics/description | ❌ Never automated | Must be manual in GitHub Settings | -| Create public GitHub issues | ❌ Never automated | Must be manual (drafts provided in `docs/github-visibility-plan.md`) | -| Upload social preview image | ❌ Never automated | Must be manual in GitHub Settings | - ---- - -## Rollback plan - -If a bad version is published to npm: - -1. **Deprecate immediately** (does not remove, but warns users): - -```bash -npm deprecate @edgarbrunet/react-sentinel@0.1.0 "This version has a known issue. Please use 0.1.1." -``` - -2. **Un-publish is only possible within 72 hours** and only if no other package depends on it: - -```bash -npm unpublish @edgarbrunet/react-sentinel@0.1.0 -``` - -3. **Publish a patch version** with the fix and update documentation. - -npm does not support true deletion after 72 hours; plan accordingly. diff --git a/docs/release-mvp.md b/docs/release-mvp.md deleted file mode 100644 index d626d31..0000000 --- a/docs/release-mvp.md +++ /dev/null @@ -1,53 +0,0 @@ -# React-Sentinel Local MVP Release Note - -## Release scope - -This MVP release focuses on the **local manual workflow** for React-Sentinel before the zero-config agent automation work planned for later sprints. - -## MVP checklist - -| Area | Status | Evidence | -|---|---|---| -| Local CLI start command | Done | `node dist/index.js start --headed` starts the MCP server over stdio | -| Local doctor command | Done | `node dist/index.js doctor` validates Node, replay browser, and Chrome CDP availability | -| Main launch options | Done | CLI supports `--headed` / `--headless` and `--cdp-endpoint` | -| Local onboarding | Done | README now documents build, doctor, start, MCP client wiring, and attach fallback | -| User diagnostics | Done | `docs/local-diagnostics-checklist.md` covers replay, CDP, selected-tab, and target-app failures | -| Product workflows | Done | `docs/workflows.md` documents Attach, Replay, Sandbox, and minimal MCP integration | -| MVP examples | Done | The demo app now highlights simple React, console/network, render-loop, race-condition, and hydration fixtures | -| Validation | Done | Root type-check/build, example-app build, and `npm run e2e:smoke` all passed | - -## Main local commands - -```bash -npm run build -node dist/index.js doctor -node dist/index.js start --headed -``` - -Useful variants: - -```bash -node dist/index.js start --headless -node dist/index.js start --cdp-endpoint http://127.0.0.1:9333 -``` - -## Included in this MVP - -- a stable stdio CLI entrypoint for local MCP clients; -- actionable onboarding and troubleshooting guidance; -- a dedicated product workflow guide for live attach, replay, and replay-only hot patching; -- a more explicit demo app catalog for the main React-Sentinel value cases. - -## Known limits - -- Live attach still depends on a Chrome instance started with remote debugging enabled. -- MCP integration is still manual: the user must point the client at the React-Sentinel CLI entrypoint. -- Replay patches stay limited to runtime script injection in the isolated browser session. -- The automated agent setup layers remain intentionally deferred to later sprints. - -## Next steps - -- streamline client-side setup beyond the manual stdio configuration; -- build the zero-config agent integration planned for the next roadmap steps; -- keep expanding guided examples and benchmarks around real debugging workflows. diff --git a/docs/scenarios/validation-loop.md b/docs/scenarios/validation-loop.md index 6c86cb1..f254ec3 100644 --- a/docs/scenarios/validation-loop.md +++ b/docs/scenarios/validation-loop.md @@ -32,7 +32,7 @@ L'agent ré-exécute le même tool `validate_after_action`. **Résultat attendu :** `pass: true`. -## Variante Sprint 8 : scénario multi-étapes avec rapport +## Variante : scénario multi-étapes avec rapport Pour valider plusieurs invariants d'un coup, l'agent peut maintenant utiliser `validate_scenario`. @@ -58,7 +58,7 @@ Pour valider plusieurs invariants d'un coup, l'agent peut maintenant utiliser `v - un rapport Markdown lisible pour l'IA ou le développeur ; - `success: true` si toutes les assertions passent. -## Variante Sprint 9 : patch éphémère + replay + verdict +## Variante : patch éphémère + replay + verdict Pour tester une correction sans modifier les fichiers locaux, l'agent peut maintenant utiliser `apply_patch_then_replay`. @@ -94,4 +94,4 @@ Pour tester une correction sans modifier les fichiers locaux, l'agent peut maint - un sandbox propre après le flux, grâce au cleanup par défaut via reset de session. --- -*Ce scénario a été validé lors du Sprint 3 (SCRUM-15) en utilisant l'application de test intégrée.* +*Ce scénario a été validé sur l'application de test intégrée.* diff --git a/docs/sprints/SPRINT1.md b/docs/sprints/SPRINT1.md deleted file mode 100644 index 8ace4a0..0000000 --- a/docs/sprints/SPRINT1.md +++ /dev/null @@ -1,90 +0,0 @@ -# Sprint 1 — Résumé et inventaire - -> **Objectif du sprint :** poser les fondations du serveur MCP React-Sentinel — -> infrastructure, premier outil de diagnostic React, app de test, documentation. - ---- - -## Ce qui a été livré - -### 🔧 Infrastructure MCP - -| Fichier | Rôle | -|---|---| -| `src/index.ts` | Point d'entrée du serveur MCP (stdio transport, graceful shutdown) | -| `src/types.ts` | Types partagés — `ToolResponse`, helpers `ok()` / `err()` | - -### 🛠️ Outils MCP exposés (5 tools) - -| Tool | Description | -|---|---| -| `ping` | Health-check du serveur MCP | -| `get_server_info` | Métadonnées et capacités du serveur | -| `echo` | Écho de message (test transport) | -| `browser_ping` | Navigue vers une URL, retourne titre + timestamp | -| `get_runtime_status` | Snapshot complet : titre, viewport, détection React | - -### 🌐 Couche navigateur (Playwright) - -| Fichier | Rôle | -|---|---| -| `src/browser/index.ts` | `BrowserManager` — launch/close Chromium, contextes isolés par appel | -| `src/browser/protocol.ts` | Types `BrowserResult`, `PingData` | - -### 🔬 Diagnostics React - -| Fichier | Rôle | -|---|---| -| `src/diagnostics/react-detector.ts` | Détecte React côté navigateur (3 stratégies : fiber keys, DevTools hook, legacy) | -| `src/diagnostics/protocol.ts` | Types `ReactInfo`, `RuntimeStatus` | -| `src/diagnostics/index.ts` | Barrel export | - -### 🧪 App de test - -| Fichier | Rôle | -|---|---| -| `examples/test-app/` | Mini-app React 18 + Vite sur `:5173` | -| `examples/test-app/src/App.tsx` | Page fixture avec compteur `useState` | - -### 📄 Documentation - -| Fichier | Contenu | -|---|---| -| `README.md` | Prérequis, lancement local étape par étape, config Claude Desktop | -| `docs/sprints/SPRINT1.md` | Ce fichier — inventaire du sprint | -| `docs/project-history/BLUEPRINT.fr.md` | Vision technique long terme du projet | - ---- - -## Résultats des tests — validation manuelle - -> Voir `docs/test-scenario-sprint1.md` pour le scénario détaillé. - -### Commandes testées - -| Tool | URL | Résultat | -|---|---|---| -| `ping` | — | ✅ `{ status: "online" }` | -| `echo` | — | ✅ Message renvoyé à l'identique | -| `browser_ping` | `http://localhost:5173` | ✅ Titre et URL corrects | -| `get_runtime_status` | `http://localhost:5173` | ✅ React détecté, version 18.x | -| `get_runtime_status` | `http://localhost:9999` | ✅ Erreur structurée, pas de crash | - ---- - -## Ce qui n'est pas encore là (Sprint 2+) - -- Inspection de l'arbre React Fiber (`get_react_tree`) -- Capture des erreurs console (`get_console_events`) -- Inspection ciblée par composant (`inspect_component`) -- Interactions navigateur (clic, fill) - ---- - -## Tickets Jira associés - -| Ticket | Résumé | Statut | -|---|---|---| -| SCRUM-10 | [Sprint 1] Documenter le lancement local et le scénario de test minimal | ✅ Terminé | -| SCRUM-27 | Écrire les étapes de lancement local dans le README | ✅ Terminé | -| SCRUM-29 | Documenter le scénario de test minimal de bout en bout | ✅ Terminé | diff --git a/docs/sprints/SPRINT10.md b/docs/sprints/SPRINT10.md deleted file mode 100644 index 35a7bec..0000000 --- a/docs/sprints/SPRINT10.md +++ /dev/null @@ -1,105 +0,0 @@ -# Sprint 10 Report - React-Sentinel - -## Objective - -Sprint 10 focused on giving React-Sentinel a first **render-loop diagnosis** workflow for AI agents: -- reproduce a controlled render explosion in the demo app, -- count renders per component, -- detect hotspot components that rerender too fast, -- and explain unstable hook values behind those loops. - -## Key Accomplishments - -### 1. Reproducible Infinite Loop Fixture (SCRUM-181) -- Added a dedicated `InfiniteLoopScenario` to the demo app. -- The fixture starts a short controlled rerender burst through an effect that keeps reacting to a changing hook-derived value until a safety cap is reached. -- Documented how to trigger the fixture and what diagnosis to expect. - -**What this enables:** an AI agent now has a stable demo scenario to validate render-loop tooling without freezing the app forever. - -### 2. Per-Component Render Counting (SCRUM-182) -- Added a browser-side render monitor that hooks into the React commit flow in replay mode. -- Recorded per-component counters with: - - `componentName` - - `pathText` - - `count` - - `firstSeen` - - `lastSeen` -- Added the new MCP tool **`get_render_counts`**. -- Validated the counters on the demo app through the Sprint 10 loop fixture. - -**What this enables:** an AI agent can now ask which React components rerender the most during a replay session instead of guessing from source code. - -### 3. Render Hotspot Detection (SCRUM-185) -- Added configurable hotspot detection based on: - - a render-count threshold, - - a sliding time window, - - and renders-per-second calculation. -- Added the new MCP tool **`get_render_hotspots`**. -- Added probable-cause summaries that classify recent behavior as: - - unstable state, - - unstable hook value, - - unstable props, - - or repeated effect / chained updates. - -**What this enables:** an AI agent can now spot the components that are actually exploding during replay and get a first diagnosis before opening the code. - -### 4. Hook Change Timeline (SCRUM-178) -- Reused the render monitor history to persist simple hook snapshots across renders. -- Added chronological hook diffs with: - - render IDs, - - previous value, - - next value, - - suspicious hook ranking. -- Added the new MCP tool **`get_hook_changes`**. -- Validated the hook trace on `InfiniteLoopScenario`, where unstable hook values are surfaced as the likely cause. - -**What this enables:** an AI agent can now move from “this component is rerendering too much” to “this specific hook value keeps changing and is likely causing the loop.” - -## Technical Choices - -- **Replay-only render monitoring:** Sprint 10 keeps commit tracking in the isolated replay browser, where React-Sentinel can install its own DevTools hook before page load and collect stable render history without touching a live user tab. -- **Commit-hook instrumentation first:** instead of polling the tree after the fact, the render monitor records data on React commits. This keeps render counts, hotspot windows, and hook timelines aligned with the actual runtime behavior. -- **Shared render history:** hotspot detection and hook tracing both read from the same captured sample history. That avoids duplicate instrumentation and keeps diagnostics consistent across tools. -- **Bounded snapshots:** per-component samples keep compact serialized props and hook values with bounded history. This is enough for AI diagnosis while preventing runaway payload growth. -- **Controlled demo explosion:** the new fixture deliberately stops after a safety cap, so it remains reproducible in automation while still generating enough churn to prove the monitor and hook trace flows. - -## Validation - -- **Root project validation** - - `npm run check` - - `npm run build` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Runtime validation** - - `npm run e2e:smoke` - - verified: - - `get_render_counts` - - `get_render_hotspots` - - `get_hook_changes` - - the controlled render-loop fixture on `InfiniteLoopScenario` - -## Jira Tickets Completed - -- **SCRUM-181**: [S10-04][Demo App] Créer un cas infinite loop reproductible -- **SCRUM-182**: [S10-01][Render Monitor] Compter les rendus par composant -- **SCRUM-185**: [S10-02][Render Monitor] Détecter les explosions de rendu -- **SCRUM-178**: [S10-03][Hooks Trace] Tracer les changements de hooks entre rendus - -### Subtasks delivered -- **SCRUM-233**: [S10-04.01] Créer un composant de démo avec useEffect instable -- **SCRUM-235**: [S10-04.02] Documenter le scénario infinite loop -- **SCRUM-229**: [S10-01.01] Définir le modèle de compteur de rendu par composant -- **SCRUM-228**: [S10-01.02] Instrumenter le rendu des composants détectables -- **SCRUM-225**: [S10-01.03] Créer la commande MCP get_render_counts -- **SCRUM-224**: [S10-01.04] Tester les compteurs sur la mini-app React -- **SCRUM-227**: [S10-02.01] Définir un seuil d’alerte de rendu excessif -- **SCRUM-230**: [S10-02.02] Détecter les composants qui rendent trop vite -- **SCRUM-226**: [S10-02.03] Créer la commande MCP get_render_hotspots -- **SCRUM-223**: [S10-02.04] Ajouter un résumé de cause probable pour l’IA -- **SCRUM-234**: [S10-03.01] Capturer un snapshot simple des hooks à chaque rendu -- **SCRUM-231**: [S10-03.02] Comparer les valeurs de hooks entre deux rendus -- **SCRUM-237**: [S10-03.03] Détecter les valeurs instables répétées -- **SCRUM-232**: [S10-03.04] Créer la commande MCP get_hook_changes -- **SCRUM-238**: [S10-03.05] Résumer la cause probable d’une boucle de rendu -- **SCRUM-236**: [S10-03.06] Tester le hook trace sur un composant instable diff --git a/docs/sprints/SPRINT11.md b/docs/sprints/SPRINT11.md deleted file mode 100644 index f9d1425..0000000 --- a/docs/sprints/SPRINT11.md +++ /dev/null @@ -1,105 +0,0 @@ -# Sprint 11 Report - React-Sentinel - -## Objective - -Sprint 11 focused on two related debugging signals for AI agents: - -- **hydration mismatches** between server HTML and client React output, -- and **async race conditions** where a late response overwrites newer UI state. - -The goal was to make both issues reproducible in the demo app and diagnosable through dedicated MCP tools. - -## Key Accomplishments - -### 1. Next.js-Style Hydration Mismatch Fixture (SCRUM-184) -- Added a dedicated page at `examples/test-app/hydration-nextjs.html`. -- The page ships a server snapshot and hydrates it with a different client tree on load. -- The mismatch now emits real React hydration warnings and recovery errors in the replay browser. -- Added scenario documentation for reproduction and expected signals. - -**What this enables:** an AI agent now has a stable hydration bug fixture instead of relying on hypothetical SSR/client divergence. - -### 2. Hydration Issue Detection Tool (SCRUM-179) -- Added normalized hydration issue parsing on top of captured runtime console events. -- Introduced the new MCP tool **`get_hydration_issues`**. -- Each returned issue is: - - tagged as `hydration`, - - classified (`mismatch`, `replacement`, `hydration_failure`, `client_render_fallback`, `warning`), - - and summarized by framework and severity. -- Extended the smoke runner to verify the hydration fixture through the published MCP surface. - -**What this enables:** an AI agent can now ask directly for hydration problems instead of manually filtering raw console noise. - -### 3. Async Timeline Diagnostics (SCRUM-183) -- Added a new async timeline model derived from captured fetch/XHR lifecycles. -- Introduced the new MCP tool **`get_async_timeline`**. -- Added a concurrent request fixture in the demo app that produces a deterministic inversion: - - one request starts first but resolves last, - - another starts later but resolves earlier. -- Surfaced summary signals for: - - slow requests, - - grouped request flows, - - and inverted completion order. - -**What this enables:** an AI agent can now inspect concurrent request order chronologically instead of inferring races from source code alone. - -### 4. Readable Race Condition Diagnosis (SCRUM-180) -- Added a dedicated UI fixture where a stale `slow` response overwrites the newer `fast` intent. -- Introduced the new MCP tool **`get_race_condition_diagnosis`**. -- The diagnosis links: - - the latest user intent, - - the real completion order from the async timeline, - - and the final visible UI state. -- Extended the smoke runner to prove the stale overwrite is detected end to end. - -**What this enables:** an AI agent can now move from “these requests completed out of order” to “this older response overwrote the final UI and explains the inconsistency.” - -## Technical Choices - -- **Hydration via dedicated page:** instead of forcing a mismatch inside the main demo tree, Sprint 11 uses a separate hydration page with pre-rendered HTML and a client boot entry. This keeps the bug realistic while preserving the existing demo app flows. -- **Hydration normalization on top of console capture:** the hydration tool reuses the existing runtime console buffer rather than adding a separate browser probe. This keeps the implementation small and aligned with the real React warnings already emitted in the browser. -- **Async timeline derived from network lifecycle:** instead of instrumenting generic Promises globally, Sprint 11 derives start and settle phases from captured fetch/XHR timing. This keeps the signal deterministic and directly tied to observable UI-facing async work. -- **Race diagnosis as correlation, not guesswork:** the race-condition tool compares final UI text with request query parameters and the inverted request order. This keeps the explanation grounded in runtime evidence rather than heuristic speculation. -- **Shared mock endpoint for async and race fixtures:** the concurrent timeline fixture and the stale overwrite fixture both reuse the same delayed mock API. That avoids duplicate backend logic while still exercising two different diagnoses. - -## Validation - -- **Root project validation** - - `npm run check` - - `npm run build` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Runtime validation** - - `npm run e2e:smoke` - - verified: - - `get_hydration_issues` - - `get_async_timeline` - - `get_race_condition_diagnosis` - - the hydration mismatch page - - the concurrent async trace fixture - - the stale overwrite race-condition fixture - -## Jira Tickets Completed - -- **SCRUM-184**: [S11-02][Hydration Demo] Créer un scénario Next.js de mismatch -- **SCRUM-179**: [S11-01][Hydration] Détecter les warnings d’hydratation React ou Next.js -- **SCRUM-183**: [S11-03][Async Trace] Tracer l’ordre des promesses et requêtes -- **SCRUM-180**: [S11-04][Race Condition] Détecter un état UI écrasé par une réponse tardive - -### Subtasks delivered -- **SCRUM-243**: [S11-02.01] Créer une mini page Next.js de démonstration -- **SCRUM-239**: [S11-02.02] Introduire volontairement un mismatch SSR/client -- **SCRUM-246**: [S11-02.03] Vérifier que React-Sentinel détecte le mismatch -- **SCRUM-244**: [S11-02.04] Documenter le scénario d’hydratation Next.js -- **SCRUM-245**: [S11-01.01] Capturer les warnings React liés à l’hydratation -- **SCRUM-242**: [S11-01.02] Normaliser les événements hydration_mismatch -- **SCRUM-241**: [S11-01.03] Créer la commande MCP get_hydration_issues -- **SCRUM-240**: [S11-01.04] Tester la capture sur un warning simulé -- **SCRUM-253**: [S11-03.01] Définir un schéma d’événement async -- **SCRUM-251**: [S11-03.02] Relier les événements réseau à la timeline async -- **SCRUM-250**: [S11-03.03] Tracer l’ordre de résolution des opérations async -- **SCRUM-247**: [S11-03.04] Créer la commande MCP get_async_timeline -- **SCRUM-252**: [S11-03.05] Ajouter un résumé des opérations lentes ou inversées -- **SCRUM-248**: [S11-03.06] Tester async trace sur deux requêtes concurrentes -- **SCRUM-254**: [S11-04.01] Créer un scénario de réponse tardive qui écrase l’état -- **SCRUM-249**: [S11-04.02] Générer un diagnostic race condition lisible diff --git a/docs/sprints/SPRINT12.md b/docs/sprints/SPRINT12.md deleted file mode 100644 index 6edffe5..0000000 --- a/docs/sprints/SPRINT12.md +++ /dev/null @@ -1,118 +0,0 @@ -# Sprint 12 Report - React-Sentinel - -## Objective - -Sprint 12 focused on packaging the local MVP into something coherent, testable, and explainable before the more advanced agent-integration sprints. - -The goal was to ship: - -- a stable local CLI entrypoint, -- actionable onboarding and troubleshooting, -- product-level workflow documentation, -- clearer demo examples, -- and a first MVP release package with explicit limits and next steps. - -## Key Accomplishments - -### 1. Stable local CLI for the MVP (SCRUM-189) - -- Added a real CLI surface with `start`, `doctor`, and `help`. -- Kept the stdio MCP server behavior as the default `start` path. -- Added launch options for replay mode (`--headed` / `--headless`) and the default CDP endpoint (`--cdp-endpoint`). -- Verified the CLI through a local stdio smoke run that executed MCP calls against `dist/index.js start`. - -**What this enables:** React-Sentinel can now be started, diagnosed, and configured through a stable local command instead of relying on the raw source entrypoint only. - -### 2. Actionable local onboarding and diagnostics (SCRUM-190) - -- Improved the Chrome CDP failure path so users get: - - the failing endpoint, - - the Chrome launch command, - - and an explicit replay fallback. -- Improved the missing/closed live-tab guidance for attach mode. -- Reworked the README so the local MVP flow starts with `build -> doctor -> start`. -- Added `docs/local-diagnostics-checklist.md` to cover the main recovery flows. - -**What this enables:** a new local user can understand whether the problem is Node, Playwright, Chrome attach, tab selection, or the target app itself. - -### 3. Product workflow documentation (SCRUM-187) - -- Added `docs/workflows.md`. -- Documented the main MVP flows: - - **Attach** for real live-tab inspection, - - **Replay** for deterministic isolated reproduction, - - **Sandbox / hot patch** for replay-only runtime experimentation, - - and the **minimal MCP integration** for local clients. -- Linked the workflow guide from the README. - -**What this enables:** a human developer or guided agent now has one place to understand when to use attach, replay, or sandbox mode. - -### 4. Clearer MVP demo examples (SCRUM-188) - -- Added a dedicated **Simple React Example** fixture to the demo app. -- Promoted the app into a clearer MVP example catalog covering: - - simple React state + props, - - console and network diagnostics, - - infinite render loop behavior, - - async race conditions, - - and hydration mismatch on the dedicated page. -- Updated `examples/README.md` to document the fixtures that actually exist today. - -**What this enables:** the demo app now reads like a curated MVP showcase instead of a loose collection of internal test fixtures. - -### 5. MVP release package and sprint closing artifacts (SCRUM-186) - -- Added `docs/release-mvp.md` with the final MVP checklist. -- Listed the main commands, known limits, and next steps for the local release. -- Produced this sprint report at `docs/sprints/SPRINT12.md`. - -**What this enables:** Sprint 12 closes with an explicit release-ready narrative, not just implementation changes scattered across code and README updates. - -## Technical Choices - -- **CLI-first local MVP:** instead of introducing a new wrapper package or extra dependency, Sprint 12 extends the existing Node entrypoint into a small CLI while preserving the published stdio server behavior. -- **Configurable defaults, not duplicate tools:** replay headless/headed mode and the default CDP endpoint are now CLI-configurable through the existing browser manager and tool surface, which avoids maintaining a second attach/replay API. -- **Actionable attach failures with replay fallback:** rather than treating missing Chrome CDP as a hard blocker, the MVP now explains the fix and explicitly points users back to replay mode so the product remains usable. -- **One workflow guide for product-level understanding:** the new workflow documentation groups attach, replay, sandbox, and MCP setup into a single guide, which is easier to navigate than scattering the story across low-level tool references. -- **Examples as a catalog, not only as fixtures:** the demo app and `examples/README.md` now present the core MVP scenarios as deliberate examples that match product value, while still staying compatible with the existing smoke runner. - -## Validation - -- **Root project validation** - - `npm run check` - - `npm run build` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Runtime validation** - - `npm run e2e:smoke` - - local CLI doctor run - - stdio smoke against `dist/index.js start --headed --cdp-endpoint http://127.0.0.1:9333` - -## Jira Tickets Completed - -- **SCRUM-189**: [S12-01][CLI] Stabiliser la CLI MVP de base -- **SCRUM-190**: [S12-02][DX] Finaliser l’onboarding utilisateur local -- **SCRUM-187**: [S12-03][Docs] Documenter les workflows produit Attach, Replay et Sandbox -- **SCRUM-188**: [S12-04][Examples] Ajouter des scénarios de démonstration MVP complets -- **SCRUM-186**: [S12-05][Release] Préparer une release MVP locale taggable - -### Subtasks delivered - -- **SCRUM-256**: [S12-01.01] Créer la commande react-sentinel start -- **SCRUM-262**: [S12-01.02] Créer la commande react-sentinel doctor -- **SCRUM-255**: [S12-01.03] Ajouter les options de lancement principales -- **SCRUM-261**: [S12-01.04] Tester la CLI sur un lancement local complet -- **SCRUM-257**: [S12-02.01] Améliorer le message quand Chrome CDP est absent -- **SCRUM-260**: [S12-02.02] Améliorer les erreurs de navigateur non connecté -- **SCRUM-258**: [S12-02.03] Ajouter un onboarding minimal dans le README -- **SCRUM-259**: [S12-02.04] Ajouter une checklist de diagnostic utilisateur -- **SCRUM-268**: [S12-03.01] Documenter le workflow Attach -- **SCRUM-263**: [S12-03.02] Documenter le workflow Replay -- **SCRUM-264**: [S12-03.03] Documenter le workflow Sandbox et hot patch -- **SCRUM-269**: [S12-03.04] Documenter l’intégration MCP minimale et pointer vers l’automatisation agent -- **SCRUM-267**: [S12-04.01] Ajouter un exemple React simple -- **SCRUM-265**: [S12-04.02] Ajouter un exemple bug console et réseau -- **SCRUM-270**: [S12-04.03] Ajouter un exemple infinite render -- **SCRUM-266**: [S12-04.04] Ajouter un exemple hydration ou async race condition -- **SCRUM-271**: [S12-05.01] Créer la checklist MVP finale -- **SCRUM-272**: [S12-05.02] Rédiger la note de release MVP diff --git a/docs/sprints/SPRINT13.md b/docs/sprints/SPRINT13.md deleted file mode 100644 index e9d886e..0000000 --- a/docs/sprints/SPRINT13.md +++ /dev/null @@ -1,115 +0,0 @@ -# Sprint 13 Report - React-Sentinel - -## Objective - -Sprint 13 focused on making React-Sentinel easier for MCP clients and AI agents to adopt without manual glue code. - -The goal was to ship: - -- a zero-config CLI surface for explicit MCP startup, -- MCP client config generation and validation, -- automatic React project detection for local targets, -- trustworthy capability metadata for agents, -- and a machine-friendly playbook that explains how an agent should choose and use Attach, Replay, and Sandbox workflows. - -## Key Accomplishments - -### 1. Zero-config MCP startup path (SCRUM-274) - -- Added an explicit `mcp` CLI command while keeping `start` backward-compatible. -- Added agent-friendly `--verbose` startup logs on stderr without polluting stdout MCP transport. -- Added `prepare` packaging support and validated `npx react-sentinel mcp`. -- Updated the smoke launcher to prefer the compiled CLI entrypoint and to assert child-process startup behavior. - -**What this enables:** MCP clients and agents can launch React-Sentinel through a stable, explicit command instead of depending on a source-only entrypoint or ad-hoc setup. - -### 2. MCP config generation and doctor validation (SCRUM-275) - -- Added `init-mcp` to generate snippets for Claude Desktop and Claude Code in `local`, `global`, and `npx` modes. -- Added `--write` and `--config-path` support so React-Sentinel can update client config files directly while preserving unrelated keys. -- Extended `doctor` to validate existing MCP config files, including command shape, args, local path safety, and `npx react-sentinel mcp` wiring. -- Documented the new setup and validation flow in the README and workflow guide. - -**What this enables:** a user or agent can generate, write, and validate MCP client configuration from the product itself instead of maintaining JSON by hand. - -### 3. Local environment detection for React apps (SCRUM-277) - -- Added `detect-project` to scan descendant `package.json` files and identify the best React, Vite React, or Next.js candidate. -- Exposed relevant scripts such as `dev`, `start`, `preview`, and `serve`, with a recommended script for the detected app. -- Added target URL suggestion and lightweight localhost probing, including explicit port parsing from scripts. -- Added a manual `--target-url` override that still works when no local React app is detected automatically. - -**What this enables:** an agent can find the right local app, startup script, and likely URL before starting replay-driven debugging. - -### 4. Trustworthy capability metadata for agents (SCRUM-279) - -- Added `src/capabilities.ts` as the source of truth for capability names, summaries, supported modes, and backing tools. -- Defined the three capability states: `planned`, `partial`, and `available`. -- Updated `get_server_info` to return `capabilities`, `capabilityDetails`, and `capabilitiesByMode`. -- Added doctor validation and smoke assertions to ensure every available capability maps to real registered tools. -- Documented the meaning of the capability states, including why `runtime_inspection` and `shadow_sandbox` are currently partial. - -**What this enables:** agents can trust the advertised capability surface and make better workflow choices based on real tool availability. - -### 5. Machine-friendly agent playbook (SCRUM-278) - -- Expanded `docs/workflows.md` with an agent-first React debug flow covering status checks, console, network, runtime health, tree inspection, and structured validation. -- Added replay-to-sandbox escalation guidance so agents know when to stop at diagnosis and when to validate a runtime-only hypothesis. -- Added a decision matrix comparing Attach, Replay, and Shadow Sandbox across real user state, isolation, safety, and reproducibility. -- Added prompt examples for UI bugs, network failures, render loops, and sandbox patch validation. - -**What this enables:** an AI agent now has a concrete operating guide for choosing the right mode and using React-Sentinel in a consistent order. - -## Technical Choices - -- **CLI-first zero-config integration:** instead of adding a wrapper tool, Sprint 13 extends the existing CLI so MCP clients can launch, configure, and validate React-Sentinel through one consistent entrypoint. -- **Config generation and validation in the product:** `init-mcp` and `doctor --config-path` keep MCP onboarding close to the runtime behavior they configure, which reduces drift between docs and actual startup expectations. -- **Project detection based on package manifests and scripts:** scanning descendant `package.json` files lets React-Sentinel infer the most likely local target without imposing framework-specific project structure assumptions. -- **One source of truth for capabilities:** centralizing capability metadata in `src/capabilities.ts` prevents docs, doctor checks, and MCP server metadata from drifting apart. -- **Agent guidance embedded in existing product docs:** instead of creating a separate playbook file, Sprint 13 extends `docs/workflows.md` so the human and agent guidance stay aligned with the actual shipped workflows. - -## Validation - -- **Repository validation** - - `npm run check` - - `npm run build` - - `npm run e2e:smoke` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Targeted launch and setup validation** - - packaged `npx react-sentinel mcp` launch from a temporary install - - `init-mcp` snippet generation and config write/merge checks - - `doctor --config-path` validation for both valid and invalid MCP config shapes - - `detect-project` checks for manifest detection, script recommendation, URL suggestion, and manual target URL fallback - - `get_server_info` checks for capability state and mode grouping - -## Jira Tickets Completed - -- **SCRUM-274**: [S13-01][Zero Config CLI] Permettre un lancement MCP sans friction -- **SCRUM-275**: [S13-02][Config MCP] Générer la config client MCP automatiquement -- **SCRUM-277**: [S13-04][Environment Detection] Détecter projet, scripts et URL cible -- **SCRUM-279**: [S13-05][Capabilities] Fiabiliser les capabilities et leur cohérence avec les tools -- **SCRUM-278**: [S13-03][Agent Playbook] Créer un playbook machine-friendly pour agents IA - -### Subtasks delivered - -- **SCRUM-284**: [S13-01.01] Ajouter une commande claire `react-sentinel mcp` -- **SCRUM-289**: [S13-01.02] Permettre `npx react-sentinel mcp` -- **SCRUM-290**: [S13-01.03] Ajouter un mode `--verbose` orienté agent -- **SCRUM-286**: [S13-01.04] Vérifier le lancement en child process côté client MCP -- **SCRUM-287**: [S13-02.01] Ajouter la commande `init-mcp` -- **SCRUM-285**: [S13-02.02] Permettre l’écriture automatique de config client -- **SCRUM-283**: [S13-02.03] Étendre `doctor` pour vérifier une config MCP existante -- **SCRUM-288**: [S13-02.04] Documenter les modes local, global et npx -- **SCRUM-294**: [S13-04.01] Détecter automatiquement un package React/Next/Vite -- **SCRUM-293**: [S13-04.02] Détecter et recommander le bon script de dev -- **SCRUM-295**: [S13-04.03] Déduire ou tester l’URL locale par défaut -- **SCRUM-298**: [S13-04.04] Permettre un override manuel si la détection échoue -- **SCRUM-304**: [S13-05.01] Introduire le statut capability `partial` -- **SCRUM-301**: [S13-05.02] Vérifier que les capabilities `available` ont des tools réels -- **SCRUM-306**: [S13-05.03] Ajouter la vue `capabilitiesByMode` -- **SCRUM-302**: [S13-05.04] Documenter la sémantique planned, partial et available -- **SCRUM-292**: [S13-03.01] Définir le flow agent de debug React standard -- **SCRUM-291**: [S13-03.02] Définir le flow agent pour Replay et Sandbox -- **SCRUM-296**: [S13-03.03] Ajouter des exemples de prompts agent -- **SCRUM-297**: [S13-03.04] Documenter quand utiliser Attach, Replay ou Shadow Sandbox diff --git a/docs/sprints/SPRINT14.md b/docs/sprints/SPRINT14.md deleted file mode 100644 index 665ccd9..0000000 --- a/docs/sprints/SPRINT14.md +++ /dev/null @@ -1,46 +0,0 @@ -# Sprint 14 Report — Agent Plugin, Skills & Commands Pack - -## Objective - -The objective of Sprint 14 was to turn React-Sentinel into a project-local integration bundle ("Agent Pack") that AI coding agents (primarily Claude Code) can install, use, and manage autonomously. This included defining the pack format, creating agent-specific guidance (commands, skills, heuristics), and implementing the lifecycle management (install, update, uninstall) in the CLI. - -## Key Accomplishments - -- **Agent Pack Architecture**: Defined a deterministic, project-local bundle structure rooted at `.react-sentinel/agent-pack/`. -- **Agent Guidance Assets**: - - **Commands**: Created `debug-react.md`, `reproduce-bug.md`, and `validate-fix.md` routines. - - **Skills**: Structured the `react-sentinel-debug.md` reusable agent instructions. - - **Heuristics**: Documented auto-use triggers and decision trees in `heuristics.md`. -- **Lifecycle Implementation**: - - Implemented `install-agent-pack`: Copies assets and updates project-local `.mcp.json`. - - Implemented `update-agent-pack`: Refreshes assets while detecting non-managed conflicts. - - Implemented `uninstall-agent-pack`: Deterministically removes managed files and cleans up the MCP configuration. -- **Multi-Agent Support**: Prepared profiles for Claude Code, generic MCP, Gemini CLI, and Copilot. - -## Technical Choices - -- **Manifest-Driven Ownership**: Use of a `manifest.json` with content hashes ensures that React-Sentinel only touches or removes files it owns, preventing accidental deletion of user customizations. -- **Markdown-First Guidance**: All agent instructions are stored as plain Markdown files. This makes them readable by both humans and LLMs, and allows them to be portable across different agent environments. -- **MCP Config Integration**: The CLI now handles parsing and merging of `.mcp.json` files, allowing for a "one-command" setup experience similar to `claude-mem`. -- **Safe Directory Cleanup**: The uninstallation process includes a safe, deepest-first removal of empty directories to leave the project tree clean. - -## Validation - -- **Build**: Successfully compiled with `tsc` after all changes. -- **Functional Testing**: - - Verified `install-agent-pack` creates the correct directory structure and `.mcp.json` entry. - - Verified `update-agent-pack` overwrites files only when forced or when they match previous hashes. - - Verified `uninstall-agent-pack` removes all managed files and restores `.mcp.json` to its previous state (removing the `react-sentinel` entry). -- **Conflict Detection**: Confirmed that the installer refuses to overwrite existing files that are not tracked in the manifest. - -## Jira Tickets Completed - -- **[SCRUM-276]**: [S14-01][Claude Code Plugin] Préparer un package/plugin installable type claude-mem -- **[SCRUM-280]**: [S14-02][Skills & Commands] Définir les skills et commandes agent pour debug React -- **[SCRUM-273]**: [S14-03][Auto Use Heuristics] Déclencher React-Sentinel au bon moment -- **[SCRUM-282]**: [S14-04][Distribution] Installer, mettre à jour et désinstaller l’intégration agent - - [SCRUM-319]: [S14-04.01] Définir une commande install-agent-pack - - [SCRUM-317]: [S14-04.02] Définir une commande update-agent-pack - - [SCRUM-320]: [S14-04.03] Définir une commande uninstall-agent-pack - - [SCRUM-321]: [S14-04.04] Gérer les conflits avec une configuration agent existante -- **[SCRUM-281]**: [S14-05][Multi-Agent Support] Préparer les profils Claude, Gemini et Copilot diff --git a/docs/sprints/SPRINT15.md b/docs/sprints/SPRINT15.md deleted file mode 100644 index cac0ba6..0000000 --- a/docs/sprints/SPRINT15.md +++ /dev/null @@ -1,67 +0,0 @@ -# Sprint 15 Report — Universal Agent Adoption & Public Repo Readiness - -## Objective - -The objective of Sprint 15 was to turn React-Sentinel into a clearer public product: define a safe public npm package contract, support more agent and IDE environments, rewrite the documentation around user onboarding, and prepare the repository for a public launch without automating sensitive release actions. - -## Key Accomplishments - -- **Universal install contract**: - - Switched the public npm package name to `@edgarbrunet/react-sentinel`. - - Kept the CLI binary name `react-sentinel`. - - Updated `init-mcp` to support `auto`, `claude-code`, `claude-desktop`, `cursor`, `github-copilot`, `gemini-cli`, and `generic-mcp`. - - Added client-aware write targets for `.mcp.json`, `.cursor/mcp.json`, `.vscode/mcp.json`, and `.gemini/settings.json`. -- **Product documentation refresh**: - - Rewrote `README.md` into a product-facing entrypoint with a quick start and supported-environment table. - - Added dedicated docs for universal install, integration guides, runtime UX, adoption validation, local ports, public-readiness audit, GitHub visibility planning, and the manual release gate. - - Extended the agent-pack docs and assets with a Cursor profile and updated portability notes for Copilot and Gemini. -- **Adoption validation**: - - Validated `init-mcp` flows for Claude Code, Cursor, GitHub Copilot / VS Code, Gemini CLI, generic MCP, and auto-detection in temporary workspaces. - - Converted the onboarding findings into a reusable adoption checklist and explicit limitations. -- **Public repo cleanup**: - - Produced a public-readiness audit before cleanup. - - Moved the French root blueprint and internal agent rule file into `docs/project-history/`. - - Centralized legitimate local URLs, ports, and CDP endpoints in `docs/local-ports.md`. -- **GitHub visibility assets**: - - Added `CONTRIBUTING.md`, `SECURITY.md`, `CODE_OF_CONDUCT.md`, issue templates, a PR template, a declarative labels file, and a baseline CI workflow. - - Added a social-preview placeholder SVG and linked it from the README. - - Drafted a GitHub visibility plan with repo description, topics, labels, badges, and seeded public issue ideas. -- **Manual release safety**: - - Added `docs/release-gate.md` listing every action that must remain manual for Edgar. - - Added an npm `files` allowlist and an MIT `LICENSE` file to keep package publication scoped and predictable. - -## Technical Choices - -- **Scoped package, stable binary**: the public npm package uses the scope `@edgarbrunet/react-sentinel`, while the command-line binary stays `react-sentinel`. This avoids collisions with the unscoped npm package while keeping CLI ergonomics familiar. -- **Client-specific MCP config roots**: `init-mcp` now differentiates between `mcpServers`-based configs and the VS Code/Copilot `servers` root. This keeps each target honest instead of pretending one JSON shape works everywhere. -- **History preserved, not deleted**: internal French notes were moved into `docs/project-history/` instead of being destroyed. The repository stays cleaner at the root while preserving useful project context. -- **Publish surface explicitly bounded**: the `files` allowlist limits what goes into the npm tarball to `dist/`, `assets/agent-pack/`, `README.md`, and `LICENSE`. This avoids leaking sprint reports, project-history notes, or internal automation files into the package. -- **Manual-only release steps**: sensitive actions such as npm publish, GitHub visibility changes, topics, social preview, and public issue creation remain manual by design. The repository now prepares these steps instead of automating them unsafely. - -## Validation - -- **Type-check**: `npm run check` -- **Build**: `npm run build` -- **Demo app build**: `cd examples/test-app && npm run build` -- **Smoke test**: `npm run e2e:smoke` - - confirmed MCP connection, replay navigation, runtime inspection, validation tools, patch workflow, and hydration diagnostics. -- **Multi-client onboarding**: - - verified `init-mcp --write` for Claude Code, Cursor, GitHub Copilot / VS Code, and Gemini CLI in temporary workspaces; - - verified generic MCP snippet generation uses `@edgarbrunet/react-sentinel`; - - verified `doctor --config-path` accepts the Copilot / VS Code config shape. -- **Package dry-run**: `npm pack --dry-run` - - confirmed that `LICENSE`, `README.md`, `assets/agent-pack/`, and `dist/` are included; - - confirmed that internal docs and historical files are excluded from the npm package. -- **MCP stdio cleanliness**: - - confirmed `node dist/index.js mcp --headless` writes **0 bytes to stdout** during startup and uses stderr for human-readable startup logs. - -## Jira Tickets Completed - -- **[SCRUM-327]**: [S15-01][Universal Install] Créer l’installation universelle avec `@edgarbrunet/react-sentinel` -- **[SCRUM-325]**: [S15-02][Integration Guides] Documenter chaque environnement agent et IDE -- **[SCRUM-326]**: [S15-03][Agent Runtime UX] Définir comment les agents utilisent React-Sentinel au bon moment -- **[SCRUM-323]**: [S15-04][README Product] Refaire le README en mode produit installable -- **[SCRUM-324]**: [S15-05][Adoption Validation] Tester l’onboarding complet sur plusieurs environnements -- **[SCRUM-348]**: [S15-06][Public Repo Readiness] Nettoyer le repo public avec règles d’automatisation Copilot CLI -- **[SCRUM-355]**: [S15-07][GitHub Visibility] Optimiser visibilité avec `@edgarbrunet/react-sentinel` -- **[SCRUM-422]**: [S15-08][Manual Release Gate] Actions sensibles à valider uniquement par Edgar diff --git a/docs/sprints/SPRINT2.md b/docs/sprints/SPRINT2.md deleted file mode 100644 index 4d86e1e..0000000 --- a/docs/sprints/SPRINT2.md +++ /dev/null @@ -1,33 +0,0 @@ -# Sprint 2 Report - React-Sentinel - -## Objective -The goal of Sprint 2 was to implement core diagnostic capabilities, specifically: -- Targeted React component inspection (props, metadata). -- Runtime error and console event telemetry. -- Transitioning to a stateful browser architecture to support real-time debugging. - -## Key Accomplishments -- **Stateful Browser Manager**: Refactored the `BrowserManager` from an ephemeral pattern to a persistent singleton session. This allows capturing events (like crashes) that occur after the initial page load and maintains context for future interactions. -- **Console & Error Telemetry**: Implemented the `get_console_events` tool. It captures: - - `console.error` and `console.warn` calls. - - Unhandled exceptions (`pageerror`). - - Unhandled promise rejections. -- **Targeted Component Inspection**: Implemented the `inspect_component` tool. - - Uses a DFS search on the React Fiber tree. - - Extracts props, paths, and metadata for a specific component name. -- **Validation Suite**: - - Updated `examples/test-app` with a "Crash Test" button to simulate runtime exceptions. - - Verified that errors triggered by user interaction (via future interaction tools) are correctly captured and reported via the MCP protocol. - -## Technical Choices -- **Persistent Context**: We shifted from a "snapshot" model to a "persistent session" model. This is critical for React applications where many errors occur during runtime interactions rather than during initial render. -- **Buffer-based Telemetry**: Implemented a circular buffer (or simple list) for console events to ensure the AI agent can "catch up" on errors that happened since the last check. - -## Jira Tickets Completed -- **SCRUM-8**: Remonter les erreurs console et exceptions JavaScript au serveur MCP -- **SCRUM-9**: Ajouter une commande d’inspection d’un composant React ciblé -- **SCRUM-11**: Tester l’inspection sur une mini-application React de démonstration - -## Next Steps (Sprint 3) -- **Interaction Layer**: Implementing tools for clicking, typing, and filling forms to enable end-to-end bug reproduction. -- **Advanced Inspection**: Investigating React Hooks state extraction and context provider inspection. diff --git a/docs/sprints/SPRINT3.md b/docs/sprints/SPRINT3.md deleted file mode 100644 index e67d299..0000000 --- a/docs/sprints/SPRINT3.md +++ /dev/null @@ -1,44 +0,0 @@ -# Sprint 3 Report - React-Sentinel - -## Objective -The primary goal of Sprint 3 was to implement the **Interaction and Validation Layer**. This phase focuses on transforming React-Sentinel from a passive observer into an active agent capable of: -- Simulating user actions (clics, keyboard input). -- Verifying the consequences of these actions on the application state. -- Implementing a full "Observation -> Correction -> Validation" loop. - -## Key Accomplishments - -### 1. Simple Interaction Simulation (SCRUM-13) -- **Tool `simulate_interaction`**: Implemented a tool that supports `click`, `type`, and `fill` actions via Playwright. -- **Robust Selection**: Integrated `waitForSelector` with a default 3-second timeout to ensure elements are ready and visible before interaction, reducing flakiness in React's dynamic UI. -- **Structured Feedback**: Interactions return detailed results, including success/failure flags and descriptive error messages if elements are missing or obstructed. - -### 2. Validation Mechanism (SCRUM-14) -- **Tool `validate_after_action`**: Created an atomic flow to perform an interaction and immediately verify an assertion. -- **Extensible Assertions**: - - `text_present`: Validates that specific strings (e.g., success messages, counter values) appear in the DOM. - - `no_console_errors`: Checks if the interaction triggered new JavaScript exceptions or console errors. -- **Error Buffer Management**: Added capability to clear the console event buffer before an action to ensure validations are scoped specifically to the tested interaction. - -### 3. End-to-End Scenario Validation (SCRUM-15) -- **Buggy Search Demo**: Enhanced the test application with a `BuggySearch` component that crashes intentionally when searching for specific keywords. -- **Workflow Demonstration**: Successfully validated the complete debugging loop: - 1. **Detect**: Triggered a crash via interaction and captured the stack trace via `no_console_errors`. - 2. **Fix**: Applied a code modification to the React source. - 3. **Verify**: Re-ran the interaction and confirmed the absence of errors via the validation tool. - -## Technical Choices - -- **Atomic Interaction-Validation**: We chose to implement a combined tool (`validate_after_action`) instead of requiring the agent to call two separate tools. This reduces latency and ensures that the validation happens in the same browser context immediately after the action. -- **DOM-based Assertion**: For the first iteration, we prioritized `innerText` checks over complex snapshot testing. This is faster and more resilient to minor styling changes while remaining highly effective for functional verification. -- **Wait for Settlement**: Implemented an optional `waitMs` (default 500ms) between interaction and validation to account for React's asynchronous rendering cycles and state updates. - -## Jira Tickets Completed -- **SCRUM-13**: Simulation d’interaction navigateur simple (click, type) -- **SCRUM-14**: Mécanisme minimal de validation après action -- **SCRUM-15**: Cas de test complet : détecter une erreur puis vérifier sa disparition - -## Next Steps (Sprint 4) -- **Sandboxing & Safety**: Implementing "dry-run" modes and confirmation prompts for destructive actions. -- **Complex UI Interactions**: Supporting drag-and-drop, hover, and multi-step workflows. -- **State Deep-Dive**: Expanding assertions to check React internal state (hooks, context) directly after interactions. diff --git a/docs/sprints/SPRINT4.md b/docs/sprints/SPRINT4.md deleted file mode 100644 index 2f3beb3..0000000 --- a/docs/sprints/SPRINT4.md +++ /dev/null @@ -1,134 +0,0 @@ -# Sprint 4 Report - React-Sentinel - -## Objective - -The goal of Sprint 4 was to add a first **network diagnostics layer** to React-Sentinel and make it usable end-to-end: -- capture browser-side HTTP activity, -- expose it through MCP tools, -- merge it with existing runtime signals, -- and provide a deterministic demo scenario to validate the whole flow. - -This sprint extends React-Sentinel from "console + interaction debugging" to a broader **runtime observability** model where an AI agent can understand not only what crashed, but also what the application called over the network and in what order. - -## Key Accomplishments - -### 1. Network Event Capture (SCRUM-99) -- **Browser-side fetch interception**: `fetch` is wrapped in the page context so each request produces a structured runtime event. -- **XMLHttpRequest interception**: legacy or library-driven XHR traffic is captured the same way as `fetch`. -- **Normalized network event model**: all events now share the same fields: - - `type` - - `url` - - `method` - - `status` - - `durationMs` - - `timestamp` - - `error` -- **Bounded runtime buffer**: network events are stored in a fixed-size in-browser buffer instead of growing without limit. - -**What this enables:** the AI can inspect recent network activity after reproducing a bug, instead of inferring API failures from code alone. - -### 2. HTTP Error Exposure for MCP (SCRUM-102) -- **Tool `get_network_events`**: added a dedicated MCP command to retrieve recent network traffic. -- **HTTP error classification**: responses in the `4xx` and `5xx` ranges are explicitly marked as network errors. -- **Compact summary for the AI**: the tool returns: - - total events, - - number of HTTP errors, - - status distribution, - - unique URLs involved. -- **Filtering support**: `onlyErrors` and `limit` make the tool usable both for broad inspection and focused diagnostics. - -**What this enables:** an agent can immediately answer questions like “what request failed?”, “how many errors occurred?”, and “which endpoints are involved?”. - -### 3. Unified Runtime Timeline (SCRUM-97) -- **Shared timeline schema**: introduced a common event format for: - - console logs/warnings/errors, - - unhandled JavaScript exceptions, - - network events. -- **Tool `get_runtime_timeline`**: added an MCP command that returns a merged chronological event stream. -- **Stable chronological sorting**: timeline events are ordered by timestamp, with deterministic tie-breaking to keep the output stable when multiple events happen at nearly the same time. -- **High-signal summary**: the timeline includes counts by source, counts by level, and a total error count. - -**What this enables:** an AI can reconstruct the actual sequence of a bug, for example: -1. a user action, -2. a network request, -3. a `500`, -4. a console error, -5. a thrown exception. - -### 4. Mock API Scenario in the Demo App (SCRUM-100) -- **New demo component `MockApiScenario`**: added a reproducible UI fixture with: - - one success request, - - one error request. -- **Self-contained mock endpoints in Vite**: - - `/api/mock/success` returns `200` - - `/api/mock/error` returns `500` -- **Visible UI feedback**: the component displays the result of each scenario directly in the demo app. -- **Explicit fetch failure handling**: unexpected fetch or JSON parsing failures are surfaced in the UI instead of failing silently. - -**What this enables:** Sprint 4 features can be tested locally without depending on an external API or flaky backend. - -## Technical Choices - -- **In-page interception instead of external proxying**: network capture is implemented by instrumenting `fetch` and `XMLHttpRequest` directly in the browser context. This keeps the architecture simple, aligned with the existing persistent Playwright session, and close to the runtime state the AI is inspecting. -- **Buffer-based retention**: network events are kept in a bounded in-browser buffer. This avoids unbounded memory growth while still giving enough recent history for diagnostics. -- **Separated tool responsibilities**: - - `get_network_events` focuses on raw network diagnostics and summary, - - `get_runtime_timeline` focuses on cross-signal ordering and reconstruction. - This keeps each MCP command specialized and easier for an agent to use correctly. -- **Typed protocol first**: network and timeline payloads were formalized in shared TypeScript interfaces before tool exposure. This reduces drift between browser capture, MCP responses, and future consumers. -- **Self-contained demo infrastructure**: mocked endpoints were added through Vite middleware rather than ad-hoc client-side stubs. This produces real HTTP traffic, which is critical because the goal of the sprint was to validate network capture, not only simulate state changes. - -## Validation - -Sprint 4 was validated through both compile-time and runtime checks: - -- **Root project validation** - - `npm run build` - - `npm run check` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Runtime validation scenarios** - - verified `fetch` and `XMLHttpRequest` capture on a local HTTP server, - - verified `200`, `404`, and `500` classification in `get_network_events`, - - verified merged console/exception/network ordering in `get_runtime_timeline`, - - verified the demo app’s mocked success/error flows through the browser with observable `200` and `500` network events. - -## Jira Tickets Completed - -- **SCRUM-99**: [S4-01][Network] Capturer les requêtes fetch et XHR -- **SCRUM-102**: [S4-02][Network] Exposer les erreurs HTTP au serveur MCP -- **SCRUM-97**: [S4-03][Timeline] Créer une timeline runtime unifiée -- **SCRUM-100**: [S4-04][Demo App] Ajouter un scénario API mocké dans la mini-app - -### Subtasks delivered -- **SCRUM-117**: Intercepter les appels fetch côté navigateur -- **SCRUM-113**: Intercepter les appels XMLHttpRequest -- **SCRUM-118**: Normaliser le format des événements réseau -- **SCRUM-119**: Stocker les événements réseau dans un buffer runtime -- **SCRUM-115**: Identifier les réponses HTTP 4xx et 5xx -- **SCRUM-116**: Créer la commande MCP `get_network_events` -- **SCRUM-114**: Ajouter un résumé des erreurs HTTP pour l’IA -- **SCRUM-112**: Tester la remontée d’une requête HTTP en erreur -- **SCRUM-122**: Définir le schéma d’événement de timeline runtime -- **SCRUM-121**: Fusionner console, exceptions et réseau dans la timeline -- **SCRUM-124**: Trier les événements runtime par timestamp -- **SCRUM-123**: Créer la commande MCP `get_runtime_timeline` -- **SCRUM-125**: Ajouter un scénario API mocké en succès -- **SCRUM-120**: Ajouter un scénario API mocké en erreur - -## Outcome - -At the end of Sprint 4, React-Sentinel can now: -- observe recent browser network traffic, -- highlight failing HTTP requests, -- merge network activity with console and exception signals, -- and validate the whole diagnostic flow against a deterministic local demo scenario. - -This is the first sprint where React-Sentinel provides a genuinely **multi-signal runtime narrative** instead of isolated diagnostics. - -## Next Steps (Sprint 5) - -- Add richer timeline filtering (by source, level, status, or URL). -- Support clearing/resetting runtime buffers in a more explicit way for test isolation. -- Expand interaction-driven validation so agents can assert not only DOM outcomes, but also runtime/network invariants after an action. -- Continue toward the broader “observe -> patch -> validate” workflow described in the project blueprint. diff --git a/docs/sprints/SPRINT5.md b/docs/sprints/SPRINT5.md deleted file mode 100644 index e763c4d..0000000 --- a/docs/sprints/SPRINT5.md +++ /dev/null @@ -1,97 +0,0 @@ -# Sprint 5 Report - React-Sentinel - -## Objectif - -Le Sprint 5 a fait passer React-Sentinel du mode **observateur distant** au mode **attach live** : -- connexion a un Chrome expose en CDP, -- selection explicite d'un onglet cible avec consentement, -- reusabilite du runtime bridge dans un onglet reel, -- inspection React plus riche (arbre, composant, etat), -- sorties plus compactes pour mieux servir un agent IA. - -## Key Accomplishments - -### 1. Attach navigateur reel via CDP -- **Detection de l'endpoint CDP** : `get_attach_status` verifie qu'un Chrome expose bien `/json/version` et retourne un diagnostic machine-readable. -- **Inventaire des onglets** : `get_attach_tabs` liste les onglets `page` exposes par `/json/list`, avec support de filtres par URL et par titre. -- **Selection explicite** : `select_attach_tab` permet de choisir un onglet par index, URL ou titre. -- **Consentement utilisateur** : la selection peut rester en mode preview tant qu'elle n'est pas confirmee, pour eviter un branchement involontaire sur un onglet reel. - -**Ce que cela change :** React-Sentinel peut inspecter le navigateur deja ouvert par le developpeur au lieu de toujours repartir d'un navigateur sandboxe. - -### 2. Runtime bridge partage entre sandbox et attach -- **Un seul chemin runtime** : les outils de diagnostic utilisent maintenant `getRuntimePage()` pour basculer soit vers la sandbox Playwright, soit vers l'onglet attach selectionne. -- **Injection idempotente du bridge** : le bridge runtime est installe une seule fois par page pour capturer les evenements sans dupliquer les hooks. -- **Capture des signaux runtime dans l'onglet reel** : le bridge garde les interceptions `fetch`/`XMLHttpRequest`, le buffer reseau et les evenements console sur le bon contexte. -- **Nettoyage explicite** : si l'onglet cible disparait ou si une nouvelle selection est faite, la connexion attach est fermee proprement. - -**Ce que cela change :** les outils d'observation fonctionnent dans le vrai contexte utilisateur, sans diverger entre sandbox et live tab. - -### 3. Inspection React plus riche -- **Extraction du Fiber tree** : `get_react_tree` s'appuie sur un inspecteur runtime unifie pour reconstruire l'arbre React. -- **Inspection de composant** : `inspect_component` retourne les props, le chemin dans l'arbre, les contextes traverses et un resume compact. -- **Inspection de l'etat hook** : `get_component_state` expose les hooks serialisables d'un composant React. -- **Modes de reponse** : `full` et `compact` permettent d'adapter la charge au besoin de l'agent. - -**Ce que cela change :** l'IA peut lire l'etat React interne sans se limiter au DOM visible. - -### 4. Protocoles de donnees enrichis -- **Types dedies** : le protocole inclut maintenant les structures pour les onglets CDP, les selections attach, les hooks, les contextes et les resumes d'inspection. -- **Format normalise** : les sorties d'inspection exposent `found`, `responseMode`, `summary` et des objets stables pour faciliter l'analyse cote agent. -- **Erreurs structurees** : les echecs d'inspection utilisent des codes comme `runtime_unreachable`, `page_reloaded` et `inspection_failed`. - -**Ce que cela change :** les erreurs sont plus actionnables et plus simples a filtrer dans un flux IA. - -### 5. Couches de securite et d'ergonomie -- **Mise en garde explicite** : le mode attach avertit quand un onglet reel va etre reutilise. -- **Sorties compactes** : les payloads lourds peuvent etre fortement reduits pour eviter le bruit contextuel. -- **Separation sandbox / live** : le code conserve un chemin sandboxe pour les tests et un chemin attach pour l'observation sur session reelle. - -**Ce que cela change :** l'outil reste exploitable sur des pages sensibles sans sacrifier la precision d'inspection. - -## Technical Choices - -- **Consentement avant reuse d'un onglet live** : un navigateur reel porte l'etat de l'utilisateur. On impose donc une confirmation explicite avant de basculer les outils dessus. -- **Bridge runtime idempotent** : l'injection est protege par un flag global pour eviter les doubles patchs et les evenements dupliques. -- **Unification par `ReactRuntimeInspectRequest`** : arbre, composant et etat utilisent une seule logique runtime cote navigateur, ce qui limite la duplication et les derives. -- **Mode compact/full :** les sorties d'inspection peuvent etre reserrees pour garder des reponses exploitables par un agent sans exploser le contexte. -- **Nettoyage des connexions attach** : on ferme et on reinitialise les sessions CDP quand l'onglet change ou disparait afin d'eviter les references mortes. -- **Erreurs typées et stables** : les messages structurees facilitent le debug agentique et la priorisation des echecs. - -## Validation - -Le sprint a ete valide avec : -- `pnpm check` -- `pnpm build` -- un smoke test local sur `get_attach_tabs` et `select_attach_tab` via un endpoint CDP mocke - -## Jira Tickets Completed - -- **SCRUM-98** : [S5-01][CDP Attach] Detecter un Chrome expose sur le port 9222 -- **SCRUM-103** : [S5-02][CDP Attach] Lister et selectionner un onglet cible -- **SCRUM-101** : [S5-03][CDP Attach] Connecter React-Sentinel a l'onglet selectionne -- **SCRUM-96** : [S5-04][Security] Ajouter des garde-fous de consentement utilisateur - -### Subtasks delivered -- **SCRUM-128** : Recuperer la liste des onglets CDP -- **SCRUM-133** : Filtrer les onglets par URL ou titre -- **SCRUM-130** : Selectionner un onglet cible par identifiant -- **SCRUM-127** : Gerer le cas aucun onglet compatible trouve -- **SCRUM-137** : Ouvrir une connexion WebSocket CDP vers l'onglet -- **SCRUM-134** : Injecter le bridge runtime dans la page attachee -- **SCRUM-139** : Valider `get_runtime_status` en mode attach -- **SCRUM-135** : Gerer la deconnexion ou fermeture de l'onglet attache -- **SCRUM-136** : Definir le message de consentement du mode attach -- **SCRUM-138** : Bloquer l'attach sans confirmation explicite - -## Outcome - -Au terme du Sprint 5, React-Sentinel peut maintenant : -- verifier qu'un Chrome CDP est disponible, -- lister et selectionner un onglet reel, -- exiger un consentement avant reuse, -- injecter le bridge runtime dans la session live, -- lire le runtime React dans un contexte reel, -- et renvoyer des diagnostics plus courts et plus robustes pour l'agent. - -Cela rapproche le projet de la boucle cible : **observer -> patch -> valider** sur un navigateur deja en cours d'utilisation. diff --git a/docs/sprints/SPRINT6.md b/docs/sprints/SPRINT6.md deleted file mode 100644 index 062b622..0000000 --- a/docs/sprints/SPRINT6.md +++ /dev/null @@ -1,153 +0,0 @@ -# Sprint 6 Report - React-Sentinel - -## Objective - -Sprint 6 focused on making React-Sentinel materially better at **runtime state inspection** for AI agents: -- extract simple React hook values from component Fibers, -- surface detectable React context values, -- reshape inspection responses for AI consumption, -- and keep rich runtime payloads safe through bounded serialization. - -This sprint extends the project from "component props + runtime signals" to a more useful **component state inspection** layer where an agent can ask what a component currently holds, not only what props it received. - -## Key Accomplishments - -### 1. Hook State Extraction (SCRUM-110) -- Added a new MCP tool: **`get_component_state`** -- Implemented browser-side traversal of the React Fiber hook chain through `memoizedState` -- Extracted serializable values for simple hooks: - - `useState` - - `useRef` - - `useMemo` -- Returned hook metadata with: - - hook index, - - hook kind, - - source, - - serialized value -- Added a stable demo fixture in the mini-app to validate real hook extraction - -**What this enables:** an AI agent can inspect a component's current local state directly from the browser runtime instead of inferring it from source code. - -### 2. React Context Surfacing (SCRUM-105) -- Added context extraction to **`inspect_component`** -- Surfaced context values from the inspected component through: - - React context dependencies when available, - - provider-based fallback detection when dependency metadata is unavailable -- Preserved context names via `displayName` when available -- Added a dedicated context fixture in the demo app using `ThemeContext` - -**What this enables:** an AI can see which context values are actively shaping a component's behavior, which is critical when debugging apps that rely on providers instead of explicit props. - -### 3. AI-Oriented Inspection Format (SCRUM-111) -- Enriched inspection responses with: - - `pathText` - - `summary` - - consistent `responseMode` -- Added **compact mode** for `inspect_component` and `get_component_state` -- Normalized runtime inspection failures into stable prefixed error messages: - - `get_react_tree:*` - - `inspect_component:*` - - `get_component_state:*` - -**What this enables:** large responses are easier for an agent to summarize, compare, and route into follow-up actions without being flooded by low-signal nested payloads. - -### 4. Safe Serialization Limits (SCRUM-107) -- Introduced a shared bounded serializer for runtime inspection payloads -- Added explicit safeguards for: - - circular references, - - maximum depth, - - maximum array length, - - maximum object key count, - - maximum total traversed nodes, - - long strings -- Added readable placeholders for complex runtime values such as: - - functions, - - React elements, - - DOM elements, - - `Map`, - - `Set`, - - `Date`, - - `URL` - -**What this enables:** inspection stays deterministic and safe even when runtime objects become deeply nested, recursive, or non-JSON-native. - -## Technical Choices - -- **One shared browser-side inspection runtime:** instead of duplicating Fiber traversal logic across multiple tools, Sprint 6 centralizes the core runtime traversal in a single browser-evaluated helper. This keeps hook extraction, context extraction, and serialization rules aligned. -- **Dependency-first context detection:** context values are resolved from React dependency metadata when available, then fall back to provider ancestry. This favors the values actually consumed by the inspected component. -- **Compact mode through stricter serialization limits:** rather than defining a second response shape, compact mode keeps the same schema but uses more aggressive payload trimming. This makes the tool easier for both humans and AI clients to consume. -- **Safe placeholders over silent drops:** complex or unsupported values are rendered as explicit placeholders (`[Circular]`, `[MaxDepthReached]`, `[Function:...]`, etc.) instead of disappearing from the payload. - -## Documentation d'usage et limites (SCRUM-142) - -La doc d'usage doit expliciter les limites suivantes pour que l'outil soit compréhensible côté utilisateur: - -- **Hooks supportés:** extraction fiable pour les cellules React reconnues comme `useState`, `useRef` et `useMemo`. -- **Limite de parcours:** la remontée des hooks s'arrête à **25 cellules** par composant pour éviter les chaînes trop longues ou cycliques. -- **Hooks custom / non reconnus:** React-Sentinel ne devine pas le nom des custom hooks; il inspecte les cellules internes du Fiber. Si une cellule ne ressemble pas à un hook connu et que sa valeur n'est pas un primitif sérialisable, elle est ignorée plutôt qu'inventée. Les primitives non reconnues sont exposées comme `kind: "unknown"`. -- **Troncature des valeurs complexes:** les chaînes longues, tableaux, objets, `Map`, `Set`, éléments React et objets DOM sont tronqués ou remplacés par des placeholders explicites (`[MaxDepthReached]`, `[MaxNodesReached]`, `[Circular]`, `[Function:...]`, `[ReactElement:...]`, `[HTMLElement:...]`). - -Ces limites sont volontaires: elles gardent les réponses stables, lisibles et exploitables par un agent IA sans faire exploser le contexte. - -## Demo App Additions - -Sprint 6 added a dedicated runtime fixture to `examples/test-app`: -- **`ThemeContextScenario`** - - exposes a stable `ThemeContext` - - consumes that context through `ThemePreview` - - keeps a local accent state to validate hook extraction - - allows a visible state transition via a toggle button - -This fixture complements the existing counter and todo demos by providing a deterministic context-driven scenario. - -## Validation - -Sprint 6 was validated through compile-time, build-time, and runtime checks: - -- **Root project validation** - - `npm run check` - - `npm run build` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Runtime validation** - - verified `get_component_state` on `ThemeContextScenario` - - verified hook extraction returns both a `state` hook and a `memo` hook - - verified `inspect_component` on `ThemePreview` returns `ThemeContext` - - verified compact inspection mode on `TodoList` - - verified `summary.pathText` is present - - verified `browserManager` cleanup remains stable after runtime inspection - -## Jira Tickets Completed - -- **SCRUM-110**: [S6-01][React Hooks] Extraire les hooks simples des composants -- **SCRUM-105**: [S6-02][React Context] Remonter les contextes détectables -- **SCRUM-111**: [S6-03][Inspector] Améliorer le format d’inspection pour l’IA -- **SCRUM-107**: [S6-04][Safety] Limiter et sérialiser proprement les valeurs complexes - -### Subtasks delivered -- **SCRUM-146**: [S6-01.01] Explorer memoizedState dans les Fiber React -- **SCRUM-144**: [S6-01.02] Détecter les valeurs simples de useState -- **SCRUM-145**: [S6-01.03] Sérialiser les valeurs de hooks compatibles JSON -- **SCRUM-143**: [S6-01.04] Créer la commande MCP get_component_state -- **SCRUM-141**: [S6-01.05] Tester l’extraction des hooks sur la mini-app -- **SCRUM-142**: [S6-01.06] Documenter les limites d’extraction des hooks -- **SCRUM-140**: [S6-02.01] Identifier les contextes React détectables -- **SCRUM-147**: [S6-02.02] Sérialiser les valeurs simples de contexte -- **SCRUM-154**: [S6-02.03] Exposer les contextes dans l’inspection composant -- **SCRUM-155**: [S6-02.04] Tester la remontée d’un contexte sur la mini-app -- **SCRUM-152**: [S6-03.01] Définir un format résumé pour l’inspection IA -- **SCRUM-148**: [S6-03.02] Ajouter le chemin du composant dans les réponses -- **SCRUM-153**: [S6-03.03] Normaliser les erreurs d’inspection runtime -- **SCRUM-151**: [S6-03.04] Ajouter un mode compact pour les réponses longues -- **SCRUM-149**: [S6-04.01] Ajouter une sérialisation protégée contre les cycles -- **SCRUM-150**: [S6-04.02] Ajouter une limite de profondeur et de taille - -## Outcome - -At the end of Sprint 6, React-Sentinel can now: -- inspect a component's current hook state, -- surface detectable React context values, -- deliver AI-friendly compact inspection payloads, -- and serialize complex runtime values safely. - -This makes the runtime inspector substantially more actionable for real debugging sessions, especially in React applications that rely heavily on stateful hooks and provider trees. diff --git a/docs/sprints/SPRINT7.md b/docs/sprints/SPRINT7.md deleted file mode 100644 index be153e5..0000000 --- a/docs/sprints/SPRINT7.md +++ /dev/null @@ -1,85 +0,0 @@ -# Sprint 7 Report - React-Sentinel - -## Objective - -Sprint 7 focused on building a **Playwright-based replay sandbox** for React-Sentinel: -- launch an isolated browser session, -- navigate to a target app and wait for it to settle, -- replay a sequence of user interactions, -- and expose the difference between attach and replay modes in the MCP API. - -This sprint turned the runtime from a single attached browser view into a controlled replay environment that can reproduce bugs more deterministically. - -## Key Accomplishments - -### 1. Isolated Playwright browser session (SCRUM-109) -- Added and configured Playwright for the sandbox runtime. -- Launched Chromium inside an isolated browser session. -- Made the headless / headed mode configurable. -- Ensured the browser session shuts down cleanly. - -**What this enables:** React-Sentinel can now create a dedicated browser context for replay work instead of relying only on the live attached tab. - -### 2. Target navigation and app readiness (SCRUM-108) -- Added a MCP command to navigate to a target URL. -- Made the application wait behavior configurable so replay can pause until the app is ready. -- Returned clearer navigation failures when the target cannot be reached or does not load correctly. -- Injected the runtime bridge after navigation so replay logic remains available in the sandbox. - -**What this enables:** the agent can open a specific application, wait for a stable state, and keep replay behavior attached to the right page lifecycle. - -### 3. Replay of interaction sequences (SCRUM-104) -- Defined the replay step format. -- Supported the core interaction actions: - - click - - fill - - wait - - press -- Logged the result of every replay step. -- Tested a complete replay scenario on the mini-app. - -**What this enables:** an AI agent can now reproduce a bug as a structured interaction trace instead of manually driving the browser. - -### 4. Attach vs replay in the MCP API (SCRUM-106) -- Exposed the current session type in the API. -- Clarified how commands behave in attach mode versus replay mode. -- Documented the limits of each mode so the runtime contract stays explicit. - -**What this enables:** clients can decide whether they are operating on the live attached page or on the isolated replay sandbox, which avoids ambiguity in later validation flows. - -## Technical Choices - -- **Isolate replay from attach:** the replay workflow was kept separate from the live attached session to avoid accidental side effects on the developer browser. -- **Make navigation explicit:** navigation and readiness are separate from replay so the sandbox can recover cleanly when a target app loads slowly or fails. -- **Use structured replay steps:** a small typed step format keeps the replay runner predictable and makes step-level logging easier to consume. -- **Surface session mode in the API:** exposing attach vs replay keeps the behavior contract visible to callers and reduces hidden runtime assumptions. - -## Validation - -Sprint 7 is validated in Jira by the closure of the four parent tickets and their subtasks: -- SCRUM-109, SCRUM-108, SCRUM-104, SCRUM-106 all reached `Terminé`. -- The linked subtasks for Playwright setup, navigation, replay execution, and mode clarity were also completed. - -## Jira Tickets Completed - -- **SCRUM-109**: [S7-01][Playwright] Lancer une instance navigateur isolée -- **SCRUM-108**: [S7-02][Replay] Naviguer vers une URL cible et attendre l’app -- **SCRUM-104**: [S7-03][Replay] Rejouer une séquence d’interactions -- **SCRUM-106**: [S7-04][Sandbox] Comparer attach vs replay dans l’API MCP - -### Subtasks delivered -- **SCRUM-159**: [S7-01.01] Installer et configurer Playwright -- **SCRUM-163**: [S7-01.02] Lancer Chromium en mode isolé -- **SCRUM-161**: [S7-01.03] Rendre le mode headless/headed configurable -- **SCRUM-160**: [S7-01.04] Fermer proprement la session navigateur isolée -- **SCRUM-156**: [S7-02.01] Créer une commande MCP navigate -- **SCRUM-162**: [S7-02.02] Attendre le chargement de l’application cible -- **SCRUM-158**: [S7-02.03] Retourner les erreurs de navigation de façon exploitable -- **SCRUM-157**: [S7-02.04] Injecter le bridge runtime après navigation -- **SCRUM-169**: [S7-03.01] Définir le format des étapes de replay -- **SCRUM-167**: [S7-03.02] Supporter les actions click, fill, wait et press -- **SCRUM-168**: [S7-03.03] Journaliser le résultat de chaque étape de replay -- **SCRUM-165**: [S7-03.04] Tester un scénario complet de replay sur la mini-app -- **SCRUM-166**: [S7-04.01] Exposer le type de session attach ou replay -- **SCRUM-164**: [S7-04.02] Documenter les limites attach vs replay - diff --git a/docs/sprints/SPRINT8.md b/docs/sprints/SPRINT8.md deleted file mode 100644 index c16bcf7..0000000 --- a/docs/sprints/SPRINT8.md +++ /dev/null @@ -1,101 +0,0 @@ -# Sprint 8 Report - React-Sentinel - -## Objective - -Sprint 8 focused on turning React-Sentinel's validation layer into a broader **assertion engine** that an AI agent can use after an interaction or a replay: -- validate richer DOM outcomes, -- check React runtime invariants directly, -- detect remaining console or network problems, -- and generate readable validation reports for humans and AI clients. - -## Key Accomplishments - -### 1. Advanced DOM Assertions (SCRUM-173) -- Extended the assertion model beyond the original `text_present` check. -- Added support for: - - `text_absent` - - `selector_visible` - - `selector_hidden` -- Kept the result format structured with explicit `expected`, `actual`, `details`, and `durationMs` fields. - -**What this enables:** an agent can now verify both positive and negative DOM outcomes without falling back to brittle manual page scraping. - -### 2. React Runtime Assertions (SCRUM-172) -- Added `component_present` to validate that a React component exists in the current Fiber tree. -- Added `component_prop_value` for simple prop checks through dot-path access (for example `todo.completed`). -- Added `component_state_value` for simple hook-state checks with hook index targeting. -- Normalized failure messages so missing components, missing hooks, and value mismatches are explicit. - -**What this enables:** an agent can now confirm React-level outcomes directly, instead of inferring success only from the DOM. - -### 3. Console and Network Assertions (SCRUM-171) -- Added `no_console_warnings` alongside the existing `no_console_errors`. -- Added `no_http_5xx` and `no_unexpected_http_requests`. -- Introduced runtime signal clearing before validation so assertions are scoped to the current action sequence. -- Fixed the runtime bridge installation so fetch/XHR interception reliably survives replay navigation. - -**What this enables:** validation can now fail with the exact remaining warning, error, or failing request traces that blocked success. - -### 4. Validation Reports (SCRUM-170) -- Added a new MCP tool: **`validate_scenario`** -- `validate_scenario`: - - replays a deterministic sequence, - - evaluates multiple assertions, - - returns a raw JSON report, - - returns a readable Markdown report. -- The report includes: - - action results, - - assertion outcomes, - - pass/fail summary, - - relevant console and network traces. - -**What this enables:** an agent can now produce a compact proof of validation instead of only a raw tool response. - -## Technical Choices - -- **Typed assertion union instead of loose flags:** each assertion now carries its own explicit payload (`expected`, `selector`, `componentName`, etc.), which keeps validation logic predictable and easier to extend. -- **Scenario runner built on replay infrastructure:** `validate_scenario` reuses the replay session and step executor instead of creating a second browser workflow. -- **Path-based React value lookup:** prop assertions use dot-paths and state assertions use hook indexes plus optional value paths, which keeps the API simple while still covering nested serializable values. -- **String-based runtime bridge injection:** the browser bridge is now injected from a generated source string, avoiding function-serialization issues during Playwright evaluation and restoring reliable network capture. -- **Current-root React resolution:** runtime inspection now resolves the current HostRoot fiber, which keeps state assertions aligned with the latest rendered React tree after updates. - -## Validation - -Sprint 8 was validated through compile-time, build-time, and runtime checks: - -- **Root project validation** - - `npm run check` - - `npm run build` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Runtime validation** - - validated DOM assertions on the mocked success scenario, - - validated React component, prop, and state assertions on the demo app, - - validated console/network pass assertions on the success flow, - - validated a failing `no_http_5xx` report on the mocked error flow, - - validated Markdown report generation with actions, assertions, and traces. - -## Jira Tickets Completed - -- **SCRUM-173**: [S8-01][Assertions] Ajouter des assertions DOM avancées -- **SCRUM-172**: [S8-02][Assertions] Ajouter des assertions runtime React -- **SCRUM-171**: [S8-03][Assertions] Ajouter des assertions réseau et console -- **SCRUM-170**: [S8-04][Reports] Générer un rapport de validation lisible - -### Subtasks delivered -- **SCRUM-192**: [S8-01.01] Implémenter une assertion texte présent -- **SCRUM-193**: [S8-01.02] Implémenter une assertion texte absent -- **SCRUM-198**: [S8-01.03] Implémenter une assertion sélecteur visible -- **SCRUM-191**: [S8-01.04] Implémenter une assertion sélecteur caché ou absent -- **SCRUM-196**: [S8-02.01] Implémenter une assertion composant React présent -- **SCRUM-194**: [S8-02.02] Implémenter une assertion prop simple attendue -- **SCRUM-195**: [S8-02.03] Implémenter une assertion state simple attendu -- **SCRUM-197**: [S8-02.04] Normaliser les erreurs d’assertion React runtime -- **SCRUM-206**: [S8-03.01] Implémenter une assertion aucune erreur console -- **SCRUM-204**: [S8-03.02] Implémenter une assertion aucun warning critique -- **SCRUM-200**: [S8-03.03] Implémenter une assertion aucune requête HTTP 5xx -- **SCRUM-201**: [S8-03.04] Implémenter une assertion aucune requête HTTP inattendue -- **SCRUM-203**: [S8-04.01] Définir le format JSON du rapport de validation -- **SCRUM-199**: [S8-04.02] Générer un rapport Markdown lisible par l’IA -- **SCRUM-205**: [S8-04.03] Inclure les traces console et réseau pertinentes -- **SCRUM-202**: [S8-04.04] Tester le rapport sur un scénario pass et un scénario fail diff --git a/docs/sprints/SPRINT9.md b/docs/sprints/SPRINT9.md deleted file mode 100644 index dbeb453..0000000 --- a/docs/sprints/SPRINT9.md +++ /dev/null @@ -1,114 +0,0 @@ -# Sprint 9 Report - React-Sentinel - -## Objective - -Sprint 9 focused on turning the replay sandbox into a first **shadow patching** workflow for AI agents: -- define a safe ephemeral patch payload, -- inject runtime-only fixes inside the replay browser, -- validate those fixes through replay + assertions, -- and guarantee the sandbox can return to a clean state afterward. - -## Key Accomplishments - -### 1. Runtime Patch Format (SCRUM-177) -- Added a typed Sprint 9 MVP patch payload with: - - `type: "script"` - - `target: "page"` - - `source` - - `metadata` -- Required `metadata.expiresWithSession = true` so every patch is explicitly session-scoped. -- Added normalization and validation for: - - empty patch rejection, - - unsupported type / target rejection, - - source length cap, - - generated patch IDs when none are provided. -- Documented the MVP payload and its current limits in the public docs. - -**What this enables:** an AI agent can now propose a structured temporary patch without touching the developer's files. - -### 2. Runtime Patch Application in the Replay Sandbox (SCRUM-175) -- Added a new MCP tool: **`apply_runtime_patch`** -- Implemented replay-only patch injection so shadow patches never target the live attach tab. -- Preferentially register future-navigation patch scripts through CDP when available, with Playwright init-script fallback. -- Apply the same patch immediately to the current replay document with per-patch deduplication. -- Surface patch failures with explicit `[runtime_patch:]` errors. -- Track active replay patches in session metadata. - -**What this enables:** an agent can now test a browser-side fix experimentally inside the isolated sandbox before proposing any real source edit. - -### 3. Patch + Replay + Assertions Flow (SCRUM-174) -- Added a new MCP tool: **`apply_patch_then_replay`** -- Combined: - - runtime patch application, - - deterministic replay steps, - - post-replay assertions, - - explicit verdicts: `patch_validated` or `patch_failed`. -- Added a readable Markdown report that merges patch metadata, replay results, assertions, and cleanup outcome. - -**What this enables:** an AI agent can now run the full "patch -> replay -> validate" loop in one tool call and get a compact proof of success or failure. - -### 4. Cleanup and Safety Guardrails (SCRUM-176) -- Added a new MCP tool: **`reset_runtime_patches`** -- Implemented cleanup by: - - reloading the replay page when removal is safe, - - automatically falling back to full replay-session reset when cleanup in place is not reliable. -- Ensured failed patch application resets the replay session to avoid leaking partial state. -- Documented the main guardrails: - - replay-only scope, - - session-bound lifetime, - - no local file writes, - - top-level module imports not supported in the MVP patch source, - - cleanup fallback to session reset when necessary. - -**What this enables:** temporary fixes can be tested aggressively without polluting later replay sessions. - -## Technical Choices - -- **Replay-only patch target:** Sprint 9 deliberately keeps hot patches inside the isolated replay sandbox instead of the live attach tab. This keeps the feature aligned with the "test without touching the developer environment" goal. -- **Single MVP patch type:** the first iteration supports only JavaScript `script` payloads targeting the page main world. This keeps validation, reporting, and cleanup predictable. -- **CDP-first init-script registration:** when Chromium exposes CDP, React-Sentinel registers patch scripts for future navigations there first, while keeping a Playwright fallback for resilience. -- **Per-document deduplication:** patch execution is wrapped in a runtime registry so the same patch ID does not re-apply twice in the same document when both init-script and immediate execution paths are used. -- **Cleanup favors correctness over cleverness:** if in-place removal cannot be trusted, React-Sentinel resets the replay session and reopens a clean page instead of leaving ambiguous patch state behind. - -## Validation - -Sprint 9 was validated through compile-time, build-time, and runtime checks: - -- **Root project validation** - - `npm run check` - - `npm run build` -- **Demo app validation** - - `cd examples/test-app && npm run build` -- **Runtime validation** - - started the demo app on `http://127.0.0.1:5173` - - applied an ephemeral fetch patch that converts `/api/mock/error` into a mocked `200` response - - validated the patched replay scenario with: - - `text_present "Error: 200 — Patched success response"` - - `no_http_5xx` - - reset runtime patches and confirmed the unpatched replay returns: - - `text_present "Error: 500 — Mock error response"` - -## Jira Tickets Completed - -- **SCRUM-177**: [S9-01][Hot Patch] Définir le format d’un patch éphémère -- **SCRUM-175**: [S9-02][Hot Patch] Injecter un patch simple côté navigateur -- **SCRUM-174**: [S9-03][Sandbox] Exécuter patch, replay et assertions -- **SCRUM-176**: [S9-04][Safety] Isoler et nettoyer les patchs après test - -### Subtasks delivered -- **SCRUM-213**: [S9-01.01] Définir le payload minimal d’un patch -- **SCRUM-211**: [S9-01.02] Définir les types de patch supportés au MVP -- **SCRUM-208**: [S9-01.03] Documenter les limites du patch éphémère -- **SCRUM-214**: [S9-01.04] Valider le format de patch avant exécution -- **SCRUM-210**: [S9-02.01] Injecter un script runtime via Playwright -- **SCRUM-209**: [S9-02.02] Injecter un script runtime via CDP si disponible -- **SCRUM-207**: [S9-02.03] Capturer les erreurs d’exécution du patch -- **SCRUM-212**: [S9-02.04] Vérifier que le patch reste limité à la session -- **SCRUM-216**: [S9-02.05] Tester le patch sur un bug simple de la mini-app -- **SCRUM-220**: [S9-02.06] Documenter les erreurs connues d’injection -- **SCRUM-215**: [S9-03.01] Créer un flux apply_patch_then_replay -- **SCRUM-217**: [S9-03.02] Lancer les assertions après replay patché -- **SCRUM-222**: [S9-03.03] Retourner un verdict patch_validated ou patch_failed -- **SCRUM-219**: [S9-03.04] Générer un rapport de validation après patch -- **SCRUM-221**: [S9-04.01] Réinitialiser la page ou session après patch -- **SCRUM-218**: [S9-04.02] Documenter les garde-fous de sécurité des patchs diff --git a/examples/test-app/package-lock.json b/examples/test-app/package-lock.json deleted file mode 100644 index 4749b68..0000000 --- a/examples/test-app/package-lock.json +++ /dev/null @@ -1,1768 +0,0 @@ -{ - "name": "react-sentinel-test-app", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "react-sentinel-test-app", - "version": "0.1.0", - "dependencies": { - "react": "^18.3.0", - "react-dom": "^18.3.0" - }, - "devDependencies": { - "@types/react": "^18.3.0", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.0", - "typescript": "^5.5.0", - "vite": "^5.4.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", - "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz", - "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz", - "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz", - "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz", - "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz", - "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz", - "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz", - "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz", - "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz", - "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz", - "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz", - "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz", - "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz", - "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz", - "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz", - "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz", - "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz", - "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", - "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", - "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz", - "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz", - "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz", - "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz", - "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz", - "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz", - "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.29", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", - "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", - "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.353", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz", - "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==", - "dev": true, - "license": "ISC" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", - "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.3", - "@rollup/rollup-android-arm64": "4.60.3", - "@rollup/rollup-darwin-arm64": "4.60.3", - "@rollup/rollup-darwin-x64": "4.60.3", - "@rollup/rollup-freebsd-arm64": "4.60.3", - "@rollup/rollup-freebsd-x64": "4.60.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", - "@rollup/rollup-linux-arm-musleabihf": "4.60.3", - "@rollup/rollup-linux-arm64-gnu": "4.60.3", - "@rollup/rollup-linux-arm64-musl": "4.60.3", - "@rollup/rollup-linux-loong64-gnu": "4.60.3", - "@rollup/rollup-linux-loong64-musl": "4.60.3", - "@rollup/rollup-linux-ppc64-gnu": "4.60.3", - "@rollup/rollup-linux-ppc64-musl": "4.60.3", - "@rollup/rollup-linux-riscv64-gnu": "4.60.3", - "@rollup/rollup-linux-riscv64-musl": "4.60.3", - "@rollup/rollup-linux-s390x-gnu": "4.60.3", - "@rollup/rollup-linux-x64-gnu": "4.60.3", - "@rollup/rollup-linux-x64-musl": "4.60.3", - "@rollup/rollup-openbsd-x64": "4.60.3", - "@rollup/rollup-openharmony-arm64": "4.60.3", - "@rollup/rollup-win32-arm64-msvc": "4.60.3", - "@rollup/rollup-win32-ia32-msvc": "4.60.3", - "@rollup/rollup-win32-x64-gnu": "4.60.3", - "@rollup/rollup-win32-x64-msvc": "4.60.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - } - } -} diff --git a/src/agent-pack.ts b/src/agent-pack.ts index 730c6d1..bfdb9ff 100644 --- a/src/agent-pack.ts +++ b/src/agent-pack.ts @@ -4,7 +4,7 @@ import path from "node:path"; import { fileURLToPath } from "node:url"; import { buildMcpServerConfig, resolveDefaultConfigPath, type McpInstallMode, type McpServerConfig } from "./mcp-config.js"; -export type AgentPackFileKind = "readme" | "command" | "skill" | "doc" | "profile"; +export type AgentPackFileKind = "readme" | "command" | "skill" | "doc" | "agent"; export type AgentPackProfileId = "claude-code" | "generic-mcp" | "cursor" | "gemini-cli" | "copilot-cli"; export type AgentPackTemplateDefinition = { @@ -46,15 +46,15 @@ export type AgentPackManifest = { }>; }; -export const AGENT_PACK_ROOT = path.join(".react-sentinel", "agent-pack"); -export const AGENT_PACK_MANIFEST_FILENAME = "manifest.json"; +export const AGENT_PACK_ROOT = ".claude"; +export const AGENT_PACK_MANIFEST_FILENAME = ".react-sentinel-manifest.json"; export const AGENT_PACK_PRIMARY_PROFILE = "claude-code"; const supportedProfiles: AgentPackManifest["profiles"] = [ { id: "claude-code", support: "primary", - summary: "Project-local installation target with a managed .mcp.json entry.", + summary: "Project-local Claude Code installation with managed slash commands, skills, agents, and .mcp.json wiring.", }, { id: "generic-mcp", @@ -103,8 +103,8 @@ const templateDefinitions: AgentPackTemplateDefinition[] = [ kind: "command", }, { - relativePath: "skills/react-sentinel-debug.md", - description: "Reusable skill text describing when and how to call React-Sentinel.", + relativePath: "skills/react-sentinel-debug/SKILL.md", + description: "Reusable Claude Code skill describing when and how to call React-Sentinel.", kind: "skill", }, { @@ -118,29 +118,9 @@ const templateDefinitions: AgentPackTemplateDefinition[] = [ kind: "doc", }, { - relativePath: "profiles/claude-code.md", - description: "Primary Claude Code integration profile.", - kind: "profile", - }, - { - relativePath: "profiles/generic-mcp.md", - description: "Portable MCP stdio integration profile.", - kind: "profile", - }, - { - relativePath: "profiles/cursor.md", - description: "Cursor adaptation notes.", - kind: "profile", - }, - { - relativePath: "profiles/gemini-cli.md", - description: "Gemini CLI adaptation notes.", - kind: "profile", - }, - { - relativePath: "profiles/copilot-cli.md", - description: "Copilot adaptation notes.", - kind: "profile", + relativePath: "agents/react-sentinel-runtime-debugger.md", + description: "Specialized Claude Code agent for runtime debugging and validation.", + kind: "agent", }, ];