claude-code-templates 1.21.13 → 1.21.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +8 -2
- package/.claude-plugin/marketplace.json +251 -0
- package/.github/workflows/component-security-validation.yml +129 -0
- package/README.md +13 -6
- package/cli-tool/README.md +56 -0
- package/cli-tool/bin/create-claude-config.js +2 -0
- package/cli-tool/components/.claude-plugin/marketplace.json +92 -0
- package/cli-tool/components/agents/development-tools/flutter-go-reviewer.md +163 -0
- package/cli-tool/components/agents/development-tools/unused-code-cleaner.md +194 -0
- package/cli-tool/components/commands/git-workflow/gemini-review.md +293 -0
- package/cli-tool/components/commands/testing/add-mutation-testing.md +2 -2
- package/cli-tool/components/commands/testing/add-property-based-testing.md +2 -2
- package/cli-tool/components/commands/testing/e2e-setup.md +2 -2
- package/cli-tool/components/commands/testing/generate-test-cases.md +2 -2
- package/cli-tool/components/commands/testing/generate-tests.md +8 -3
- package/cli-tool/components/commands/testing/setup-comprehensive-testing.md +2 -2
- package/cli-tool/components/commands/testing/setup-load-testing.md +2 -2
- package/cli-tool/components/commands/testing/setup-visual-testing.md +2 -2
- package/cli-tool/components/commands/testing/test-automation-orchestrator.md +2 -2
- package/cli-tool/components/commands/testing/test-changelog-automation.md +2 -2
- package/cli-tool/components/commands/testing/test-coverage.md +2 -2
- package/cli-tool/components/commands/testing/test-quality-analyzer.md +2 -2
- package/cli-tool/components/commands/testing/testing_plan_integration.md +2 -2
- package/cli-tool/components/commands/testing/write-tests.md +2 -2
- package/cli-tool/components/commands/utilities/ultra-think.md +10 -5
- package/cli-tool/components/hooks/git/validate-branch-name.json +1 -1
- package/cli-tool/components/mcps/devtools/chrome-devtools.json +9 -0
- package/cli-tool/components/mcps/devtools/grafana.json +15 -0
- package/cli-tool/components/mcps/devtools/pulumi.json +9 -0
- package/cli-tool/components/mcps/devtools/terraform.json +1 -1
- package/cli-tool/components/settings/statusline/context-monitor.py +1 -1
- package/cli-tool/components/skills/ANTHROPIC_ATTRIBUTION.md +81 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/SKILL.md +405 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/templates/generator_template.js +223 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/templates/viewer.html +599 -0
- package/cli-tool/components/skills/creative-design/canvas-design/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/canvas-design/SKILL.md +130 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/SKILL.md +646 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/color_palettes.py +302 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/easing.py +230 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/frame_composer.py +469 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/gif_builder.py +246 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/typography.py +357 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/validators.py +264 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/visual_effects.py +494 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/requirements.txt +4 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/bounce.py +106 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/explode.py +331 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/fade.py +329 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/flip.py +291 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/kaleidoscope.py +211 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/morph.py +329 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/move.py +293 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/pulse.py +268 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/shake.py +127 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/slide.py +291 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/spin.py +269 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/wiggle.py +300 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/zoom.py +312 -0
- package/cli-tool/components/skills/creative-design/theme-factory/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/theme-factory/SKILL.md +59 -0
- package/cli-tool/components/skills/creative-design/theme-factory/theme-showcase.pdf +0 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/arctic-frost.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/botanical-garden.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/desert-rose.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/forest-canopy.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/golden-hour.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/midnight-galaxy.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/modern-minimalist.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/ocean-depths.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/sunset-boulevard.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/tech-innovation.md +19 -0
- package/cli-tool/components/skills/development/artifacts-builder/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/artifacts-builder/SKILL.md +74 -0
- package/cli-tool/components/skills/development/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/cli-tool/components/skills/development/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/cli-tool/components/skills/development/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/cli-tool/components/skills/development/git-commit-helper/SKILL.md +203 -0
- package/cli-tool/components/skills/development/mcp-builder/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/mcp-builder/SKILL.md +328 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/evaluation.md +602 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/node_mcp_server.md +916 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/python_mcp_server.md +752 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/connections.py +151 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/evaluation.py +373 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/requirements.txt +2 -0
- package/cli-tool/components/skills/development/skill-creator/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/skill-creator/SKILL.md +209 -0
- package/cli-tool/components/skills/development/skill-creator/scripts/init_skill.py +303 -0
- package/cli-tool/components/skills/development/skill-creator/scripts/package_skill.py +110 -0
- package/cli-tool/components/skills/development/skill-creator/scripts/quick_validate.py +65 -0
- package/cli-tool/components/skills/development/webapp-testing/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/webapp-testing/SKILL.md +96 -0
- package/cli-tool/components/skills/development/webapp-testing/examples/console_logging.py +35 -0
- package/cli-tool/components/skills/development/webapp-testing/examples/element_discovery.py +40 -0
- package/cli-tool/components/skills/development/webapp-testing/examples/static_html_automation.py +33 -0
- package/cli-tool/components/skills/development/webapp-testing/scripts/with_server.py +106 -0
- package/cli-tool/components/skills/document-processing/docx/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/docx/SKILL.md +197 -0
- package/cli-tool/components/skills/document-processing/docx/docx-js.md +350 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/pack.py +159 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/unpack.py +29 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validate.py +69 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/base.py +951 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/docx.py +274 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml.md +610 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/__init__.py +1 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/document.py +1276 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/comments.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsExtended.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsIds.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/people.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/utilities.py +374 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/SKILL.md +294 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/forms.md +205 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/reference.md +612 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_bounding_boxes.py +70 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_bounding_boxes_test.py +226 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_fillable_fields.py +12 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/convert_pdf_to_images.py +35 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/create_validation_image.py +41 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/extract_form_field_info.py +152 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/fill_fillable_fields.py +114 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/cli-tool/components/skills/document-processing/pdf-processing/FORMS.md +143 -0
- package/cli-tool/components/skills/document-processing/pdf-processing/SKILL.md +149 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/FORMS.md +610 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/OCR.md +137 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/SKILL.md +296 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/TABLES.md +626 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/scripts/analyze_form.py +307 -0
- package/cli-tool/components/skills/document-processing/pptx/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/pptx/SKILL.md +484 -0
- package/cli-tool/components/skills/document-processing/pptx/html2pptx.md +625 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/pack.py +159 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/unpack.py +29 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validate.py +69 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/base.py +951 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml.md +427 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/html2pptx.js +979 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/inventory.py +1020 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/rearrange.py +231 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/replace.py +385 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/thumbnail.py +450 -0
- package/cli-tool/components/skills/document-processing/xlsx/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/xlsx/SKILL.md +289 -0
- package/cli-tool/components/skills/document-processing/xlsx/recalc.py +178 -0
- package/cli-tool/components/skills/enterprise-communication/brand-guidelines/LICENSE.txt +202 -0
- package/cli-tool/components/skills/enterprise-communication/brand-guidelines/SKILL.md +73 -0
- package/cli-tool/components/skills/enterprise-communication/email-composer/SKILL.md +317 -0
- package/cli-tool/components/skills/enterprise-communication/excel-analysis/SKILL.md +247 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/LICENSE.txt +202 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/SKILL.md +32 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/3p-updates.md +47 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/company-newsletter.md +65 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/faq-answers.md +30 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/general-comms.md +16 -0
- package/cli-tool/package-lock.json +39 -16
- package/cli-tool/package.json +7 -2
- package/cli-tool/security-report.json +62361 -0
- package/cli-tool/src/analytics-web/chats_mobile.html +17 -16
- package/cli-tool/src/console-bridge.js +3 -3
- package/cli-tool/src/index.js +157 -10
- package/cli-tool/src/plugin-dashboard-web/app.js +806 -0
- package/cli-tool/src/plugin-dashboard-web/index.html +292 -0
- package/cli-tool/src/plugin-dashboard-web/styles.css +1781 -0
- package/cli-tool/src/plugin-dashboard.js +689 -0
- package/cli-tool/src/security-audit.js +164 -0
- package/cli-tool/src/validation/ARCHITECTURE.md +309 -0
- package/cli-tool/src/validation/BaseValidator.js +152 -0
- package/cli-tool/src/validation/README.md +543 -0
- package/cli-tool/src/validation/ValidationOrchestrator.js +305 -0
- package/cli-tool/src/validation/validators/IntegrityValidator.js +338 -0
- package/cli-tool/src/validation/validators/ProvenanceValidator.js +399 -0
- package/cli-tool/src/validation/validators/ReferenceValidator.js +373 -0
- package/cli-tool/src/validation/validators/SemanticValidator.js +449 -0
- package/cli-tool/src/validation/validators/StructuralValidator.js +376 -0
- package/docs/CLAUDE.md +363 -0
- package/docs/api/README.md +297 -0
- package/docs/api/package.json +7 -0
- package/docs/api/track-download-supabase.js +150 -0
- package/docs/blog/README.md +199 -0
- package/docs/blog/blog-articles.json +133 -0
- package/docs/blog/css/blog-controls.css +254 -0
- package/docs/blog/e2b-claude-code-sandbox/index.html +8 -0
- package/docs/blog/index.html +81 -124
- package/docs/blog/js/blog-loader.js +602 -0
- package/docs/blog/nextjs-vercel-claude-code-integration/index.html +8 -0
- package/docs/blog/supabase-claude-code-integration/index.html +8 -0
- package/docs/component.html +226 -48
- package/docs/components.json +61610 -604
- package/docs/css/blog.css +292 -0
- package/docs/css/component-page.css +840 -3
- package/docs/css/plugin-page.css +648 -0
- package/docs/css/styles.css +504 -1
- package/docs/css/trending.css +110 -6
- package/docs/download-stats.html +8 -0
- package/docs/index.html +48 -22
- package/docs/jobs.html +8 -0
- package/docs/js/cart-manager.js +21 -8
- package/docs/js/component-page.js +1013 -12
- package/docs/js/data-loader.js +11 -8
- package/docs/js/index-events.js +305 -53
- package/docs/js/plugin-page.js +390 -0
- package/docs/js/script.js +50 -3
- package/docs/js/search-functionality.js +19 -16
- package/docs/js/trending.js +55 -20
- package/docs/plugin.html +262 -0
- package/docs/sandbox-interface.html +8 -0
- package/docs/static/favicon/about.txt +6 -0
- package/docs/static/favicon/android-chrome-192x192.png +0 -0
- package/docs/static/favicon/android-chrome-512x512.png +0 -0
- package/docs/static/favicon/apple-touch-icon.png +0 -0
- package/docs/static/favicon/favicon-16x16.png +0 -0
- package/docs/static/favicon/favicon-32x32.png +0 -0
- package/docs/static/favicon/favicon.ico +0 -0
- package/docs/static/favicon/site.webmanifest +1 -0
- package/docs/trending-data.json +616 -579
- package/docs/trending.html +24 -3
- package/docs/vercel.json +12 -0
- package/docs/workflows.html +8 -0
- package/generate_components_json.py +386 -11
- package/package.json +1 -1
- package/sync-api.sh +50 -0
- package/vercel.json +10 -75
- package/ROADMAP.md +0 -278
- package/test_serpapi.py +0 -36
- /package/cli-tool/components/commands/svelte/{svelte:a11y.md → svelte-a11y.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:component.md → svelte-component.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:debug.md → svelte-debug.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:migrate.md → svelte-migrate.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:optimize.md → svelte-optimize.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:scaffold.md → svelte-scaffold.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-migrate.md → svelte-storybook-migrate.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-mock.md → svelte-storybook-mock.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-setup.md → svelte-storybook-setup.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-story.md → svelte-storybook-story.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-troubleshoot.md → svelte-storybook-troubleshoot.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook.md → svelte-storybook.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test-coverage.md → svelte-test-coverage.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test-fix.md → svelte-test-fix.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test-setup.md → svelte-test-setup.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test.md → svelte-test.md} +0 -0
|
@@ -102,25 +102,31 @@ class ComponentPageManager {
|
|
|
102
102
|
|
|
103
103
|
// Hide loading state
|
|
104
104
|
document.getElementById('loadingState').style.display = 'none';
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
// Show component content
|
|
107
107
|
document.getElementById('componentContent').style.display = 'block';
|
|
108
108
|
|
|
109
109
|
// Render component header
|
|
110
110
|
this.renderComponentHeader();
|
|
111
|
-
|
|
111
|
+
|
|
112
112
|
// Render component description
|
|
113
113
|
this.renderComponentDescription();
|
|
114
|
-
|
|
114
|
+
|
|
115
|
+
// Render security validation section
|
|
116
|
+
this.renderSecurityValidation();
|
|
117
|
+
|
|
118
|
+
// Render metadata section
|
|
119
|
+
await this.renderMetadataSection();
|
|
120
|
+
|
|
115
121
|
// Render installation section
|
|
116
122
|
this.renderInstallationSection();
|
|
117
|
-
|
|
123
|
+
|
|
118
124
|
// Render component code
|
|
119
125
|
await this.renderComponentCode();
|
|
120
|
-
|
|
126
|
+
|
|
121
127
|
// Render GitHub link
|
|
122
128
|
this.renderGitHubLink();
|
|
123
|
-
|
|
129
|
+
|
|
124
130
|
// Update page metadata
|
|
125
131
|
this.updatePageMetadata();
|
|
126
132
|
}
|
|
@@ -190,10 +196,319 @@ class ComponentPageManager {
|
|
|
190
196
|
}
|
|
191
197
|
}
|
|
192
198
|
|
|
199
|
+
renderSecurityValidation() {
|
|
200
|
+
const security = this.component.security;
|
|
201
|
+
|
|
202
|
+
// If no security data, hide everything
|
|
203
|
+
if (!security || !security.validated) {
|
|
204
|
+
const validationSection = document.getElementById('validationSection');
|
|
205
|
+
if (validationSection) validationSection.style.display = 'none';
|
|
206
|
+
|
|
207
|
+
const validationBadge = document.getElementById('componentValidationBadge');
|
|
208
|
+
if (validationBadge) validationBadge.style.display = 'none';
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Show validation section
|
|
213
|
+
const validationSection = document.getElementById('validationSection');
|
|
214
|
+
if (validationSection) validationSection.style.display = 'block';
|
|
215
|
+
|
|
216
|
+
const score = security.score || 0;
|
|
217
|
+
const isValid = security.valid;
|
|
218
|
+
const errors = security.errorCount || 0;
|
|
219
|
+
const warnings = security.warningCount || 0;
|
|
220
|
+
|
|
221
|
+
// Determine color based on score
|
|
222
|
+
let scoreColor = '#48bb78'; // Green
|
|
223
|
+
let scoreStatus = 'Excellent';
|
|
224
|
+
|
|
225
|
+
if (score < 70) {
|
|
226
|
+
scoreColor = '#f56565'; // Red
|
|
227
|
+
scoreStatus = 'Needs Attention';
|
|
228
|
+
} else if (score < 85) {
|
|
229
|
+
scoreColor = '#ed8936'; // Orange
|
|
230
|
+
scoreStatus = 'Good';
|
|
231
|
+
} else if (score < 100) {
|
|
232
|
+
scoreColor = '#48bb78'; // Green
|
|
233
|
+
scoreStatus = 'Very Good';
|
|
234
|
+
} else if (score === 100) {
|
|
235
|
+
scoreColor = '#48bb78'; // Green
|
|
236
|
+
scoreStatus = 'Excellent';
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Only override to red if score is below 70 OR (invalid AND low errors)
|
|
240
|
+
if (!isValid && score < 70) {
|
|
241
|
+
scoreColor = '#f56565'; // Red
|
|
242
|
+
scoreStatus = 'Needs Attention';
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Update header badge
|
|
246
|
+
const validationBadge = document.getElementById('componentValidationBadge');
|
|
247
|
+
const validationScoreSpan = document.getElementById('validationScore');
|
|
248
|
+
if (validationBadge && validationScoreSpan) {
|
|
249
|
+
validationBadge.style.display = 'inline-flex';
|
|
250
|
+
validationBadge.style.backgroundColor = scoreColor + '20';
|
|
251
|
+
validationBadge.style.borderColor = scoreColor + '50';
|
|
252
|
+
validationBadge.style.color = scoreColor;
|
|
253
|
+
validationScoreSpan.textContent = score;
|
|
254
|
+
validationBadge.title = `Quality Score: ${score}/100 - Click to see details`;
|
|
255
|
+
validationBadge.style.cursor = 'pointer';
|
|
256
|
+
|
|
257
|
+
// Add click event to scroll to validation section
|
|
258
|
+
validationBadge.onclick = function() {
|
|
259
|
+
const validationSection = document.getElementById('validationSection');
|
|
260
|
+
if (validationSection) {
|
|
261
|
+
validationSection.scrollIntoView({
|
|
262
|
+
behavior: 'smooth',
|
|
263
|
+
block: 'start'
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
// Add a highlight animation
|
|
267
|
+
validationSection.style.animation = 'highlight 1s ease';
|
|
268
|
+
setTimeout(() => {
|
|
269
|
+
validationSection.style.animation = '';
|
|
270
|
+
}, 1000);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Update score circle
|
|
276
|
+
const scoreCircle = document.getElementById('scoreCircle');
|
|
277
|
+
const scoreValue = document.getElementById('scoreValue');
|
|
278
|
+
if (scoreCircle && scoreValue) {
|
|
279
|
+
scoreCircle.style.borderColor = scoreColor;
|
|
280
|
+
scoreValue.textContent = score;
|
|
281
|
+
scoreValue.style.color = scoreColor;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Update score status
|
|
285
|
+
const scoreStatusEl = document.getElementById('scoreStatus');
|
|
286
|
+
if (scoreStatusEl) {
|
|
287
|
+
scoreStatusEl.textContent = scoreStatus;
|
|
288
|
+
scoreStatusEl.style.color = scoreColor;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Update inline stats
|
|
292
|
+
const inlineErrors = document.getElementById('inlineErrors');
|
|
293
|
+
const inlineWarnings = document.getElementById('inlineWarnings');
|
|
294
|
+
if (inlineErrors) {
|
|
295
|
+
inlineErrors.textContent = errors;
|
|
296
|
+
inlineErrors.style.color = errors > 0 ? '#f56565' : '#48bb78';
|
|
297
|
+
}
|
|
298
|
+
if (inlineWarnings) {
|
|
299
|
+
inlineWarnings.textContent = warnings;
|
|
300
|
+
inlineWarnings.style.color = warnings > 0 ? '#ed8936' : '#48bb78';
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Render validation checks with detailed messages
|
|
304
|
+
const validationChecks = document.getElementById('validationChecks');
|
|
305
|
+
if (validationChecks && security.validators) {
|
|
306
|
+
const checkDescriptions = {
|
|
307
|
+
structural: 'Verifies file format, YAML frontmatter, required fields, and encoding',
|
|
308
|
+
integrity: 'Checks for tampering using SHA256 hash and version tracking',
|
|
309
|
+
semantic: 'Detects malicious patterns, prompt injection, and dangerous commands',
|
|
310
|
+
references: 'Validates external URLs and prevents SSRF attacks',
|
|
311
|
+
provenance: 'Confirms author metadata and repository information'
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
const checkLabels = {
|
|
315
|
+
structural: 'Structure',
|
|
316
|
+
integrity: 'Integrity',
|
|
317
|
+
semantic: 'Content Safety',
|
|
318
|
+
references: 'references',
|
|
319
|
+
provenance: 'Source'
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
validationChecks.innerHTML = '';
|
|
323
|
+
Object.entries(security.validators).forEach(([key, validatorData]) => {
|
|
324
|
+
// Handle both old format (boolean) and new format (object with detailed data)
|
|
325
|
+
const passed = typeof validatorData === 'boolean' ? validatorData : validatorData.valid;
|
|
326
|
+
const hasErrors = typeof validatorData === 'object' && validatorData.errors && validatorData.errors.length > 0;
|
|
327
|
+
const hasWarnings = typeof validatorData === 'object' && validatorData.warnings && validatorData.warnings.length > 0;
|
|
328
|
+
const hasInfo = typeof validatorData === 'object' && validatorData.info && validatorData.info.length > 0;
|
|
329
|
+
const hasDetails = hasErrors || hasWarnings || hasInfo || passed;
|
|
330
|
+
|
|
331
|
+
// Determine status: passed, warning, or failed
|
|
332
|
+
let status = 'passed';
|
|
333
|
+
let icon = '✓';
|
|
334
|
+
if (hasErrors) {
|
|
335
|
+
status = 'failed';
|
|
336
|
+
icon = '✗';
|
|
337
|
+
} else if (hasWarnings) {
|
|
338
|
+
status = 'warning';
|
|
339
|
+
icon = '⚠';
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const checkItem = document.createElement('div');
|
|
343
|
+
checkItem.className = `validation-check-item ${status}`;
|
|
344
|
+
checkItem.style.cursor = 'pointer';
|
|
345
|
+
|
|
346
|
+
// Build HTML for check item
|
|
347
|
+
checkItem.innerHTML = `
|
|
348
|
+
<div class="check-header">
|
|
349
|
+
<div class="check-main">
|
|
350
|
+
<span class="check-icon">${icon}</span>
|
|
351
|
+
<span class="check-label">${checkLabels[key] || key}</span>
|
|
352
|
+
</div>
|
|
353
|
+
<div class="check-stats">
|
|
354
|
+
${typeof validatorData === 'object' ? `
|
|
355
|
+
${validatorData.errorCount > 0 ? `<span class="check-error-count">${validatorData.errorCount} errors</span>` : ''}
|
|
356
|
+
${validatorData.warningCount > 0 ? `<span class="check-warning-count">${validatorData.warningCount} warnings</span>` : ''}
|
|
357
|
+
` : ''}
|
|
358
|
+
</div>
|
|
359
|
+
</div>
|
|
360
|
+
`;
|
|
361
|
+
|
|
362
|
+
// Add click event listener - all items are clickable now
|
|
363
|
+
checkItem.addEventListener('click', () => {
|
|
364
|
+
window.openValidationModal(key, checkLabels[key] || key, validatorData, checkDescriptions[key]);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
validationChecks.appendChild(checkItem);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
async renderMetadataSection() {
|
|
373
|
+
const metadataSection = document.getElementById('metadataSection');
|
|
374
|
+
|
|
375
|
+
console.log('=== Metadata Section Debug ===');
|
|
376
|
+
console.log('Component type:', this.component.type);
|
|
377
|
+
console.log('Component name:', this.component.name);
|
|
378
|
+
|
|
379
|
+
// Only show metadata for agents (since marketplace.json only contains agent metadata)
|
|
380
|
+
if (this.component.type !== 'agent') {
|
|
381
|
+
console.log('Not an agent, hiding metadata section');
|
|
382
|
+
if (metadataSection) metadataSection.style.display = 'none';
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
try {
|
|
387
|
+
// Load components marketplace (Claude Code standard)
|
|
388
|
+
const marketplace = await this.loadComponentsMarketplace();
|
|
389
|
+
console.log('Components marketplace loaded:', marketplace);
|
|
390
|
+
|
|
391
|
+
if (!marketplace || !marketplace.agents) {
|
|
392
|
+
console.log('No components marketplace or agents found');
|
|
393
|
+
if (metadataSection) metadataSection.style.display = 'none';
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Find the component in marketplace
|
|
398
|
+
const componentName = this.component.name.replace('.md', '');
|
|
399
|
+
console.log('Looking for component:', componentName);
|
|
400
|
+
console.log('Available agents:', marketplace.agents.map(a => a.name));
|
|
401
|
+
|
|
402
|
+
const agentMetadata = marketplace.agents.find(
|
|
403
|
+
agent => agent.name === componentName
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
console.log('Found agent metadata:', agentMetadata);
|
|
407
|
+
|
|
408
|
+
if (!agentMetadata) {
|
|
409
|
+
console.log('No metadata found for component:', componentName);
|
|
410
|
+
if (metadataSection) metadataSection.style.display = 'none';
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Show metadata section
|
|
415
|
+
if (metadataSection) metadataSection.style.display = 'block';
|
|
416
|
+
|
|
417
|
+
// Populate version
|
|
418
|
+
const versionElement = document.getElementById('metadataVersion');
|
|
419
|
+
if (versionElement) {
|
|
420
|
+
versionElement.textContent = agentMetadata.version || '--';
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// Populate author
|
|
424
|
+
const authorElement = document.getElementById('metadataAuthor');
|
|
425
|
+
if (authorElement) {
|
|
426
|
+
const authorName = agentMetadata.author?.name || agentMetadata.author || '--';
|
|
427
|
+
authorElement.textContent = authorName;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Populate license
|
|
431
|
+
const licenseElement = document.getElementById('metadataLicense');
|
|
432
|
+
if (licenseElement) {
|
|
433
|
+
licenseElement.textContent = agentMetadata.license || '--';
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Populate repository
|
|
437
|
+
const repositoryLink = document.getElementById('metadataRepository');
|
|
438
|
+
const repositoryNone = document.getElementById('metadataRepositoryNone');
|
|
439
|
+
if (agentMetadata.repository) {
|
|
440
|
+
if (repositoryLink) {
|
|
441
|
+
repositoryLink.href = agentMetadata.repository;
|
|
442
|
+
repositoryLink.style.display = 'inline-flex';
|
|
443
|
+
}
|
|
444
|
+
if (repositoryNone) {
|
|
445
|
+
repositoryNone.style.display = 'none';
|
|
446
|
+
}
|
|
447
|
+
} else {
|
|
448
|
+
if (repositoryLink) {
|
|
449
|
+
repositoryLink.style.display = 'none';
|
|
450
|
+
}
|
|
451
|
+
if (repositoryNone) {
|
|
452
|
+
repositoryNone.style.display = 'inline';
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Populate keywords
|
|
457
|
+
const keywordsContainer = document.getElementById('metadataKeywords');
|
|
458
|
+
if (keywordsContainer && agentMetadata.keywords && agentMetadata.keywords.length > 0) {
|
|
459
|
+
keywordsContainer.innerHTML = '';
|
|
460
|
+
agentMetadata.keywords.forEach(keyword => {
|
|
461
|
+
const keywordChip = document.createElement('span');
|
|
462
|
+
keywordChip.className = 'metadata-keyword';
|
|
463
|
+
keywordChip.textContent = keyword;
|
|
464
|
+
keywordsContainer.appendChild(keywordChip);
|
|
465
|
+
});
|
|
466
|
+
} else if (keywordsContainer) {
|
|
467
|
+
keywordsContainer.innerHTML = '<span class="metadata-value">--</span>';
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
} catch (error) {
|
|
471
|
+
console.error('Error loading marketplace metadata:', error);
|
|
472
|
+
if (metadataSection) metadataSection.style.display = 'none';
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
async loadComponentsMarketplace() {
|
|
477
|
+
try {
|
|
478
|
+
// Check if components marketplace is already cached
|
|
479
|
+
if (this.componentsMarketplace) {
|
|
480
|
+
return this.componentsMarketplace;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// Use the already loaded components data from dataLoader
|
|
484
|
+
const componentsData = await this.dataLoader.loadAllComponents();
|
|
485
|
+
|
|
486
|
+
if (componentsData && componentsData.componentsMarketplace) {
|
|
487
|
+
this.componentsMarketplace = componentsData.componentsMarketplace;
|
|
488
|
+
console.log('Loaded components marketplace:', this.componentsMarketplace);
|
|
489
|
+
return this.componentsMarketplace;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// Fallback: try to fetch marketplace.json directly from components/.claude-plugin/
|
|
493
|
+
const marketplaceResponse = await fetch('https://raw.githubusercontent.com/davila7/claude-code-templates/main/cli-tool/components/.claude-plugin/marketplace.json');
|
|
494
|
+
if (marketplaceResponse.ok) {
|
|
495
|
+
this.componentsMarketplace = await marketplaceResponse.json();
|
|
496
|
+
console.log('Loaded components marketplace from GitHub:', this.componentsMarketplace);
|
|
497
|
+
return this.componentsMarketplace;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
console.warn('No components marketplace found');
|
|
501
|
+
return null;
|
|
502
|
+
} catch (error) {
|
|
503
|
+
console.error('Error loading components marketplace:', error);
|
|
504
|
+
return null;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
193
508
|
renderInstallationSection() {
|
|
194
509
|
const componentPath = this.getCleanPath();
|
|
195
510
|
const basicInstallCommand = `npx claude-code-templates@latest --${this.component.type}=${componentPath} --yes`;
|
|
196
|
-
|
|
511
|
+
|
|
197
512
|
// Update basic installation command
|
|
198
513
|
const basicInstallElement = document.getElementById('basicInstallCommand');
|
|
199
514
|
if (basicInstallElement) {
|
|
@@ -208,7 +523,7 @@ class ComponentPageManager {
|
|
|
208
523
|
// Hide agent-specific sections for non-agents
|
|
209
524
|
const globalAgentSection = document.getElementById('globalAgentSection');
|
|
210
525
|
const e2bSandboxSection = document.getElementById('e2bSandboxSection');
|
|
211
|
-
|
|
526
|
+
|
|
212
527
|
if (globalAgentSection) globalAgentSection.style.display = 'none';
|
|
213
528
|
if (e2bSandboxSection) e2bSandboxSection.style.display = 'none';
|
|
214
529
|
}
|
|
@@ -265,7 +580,7 @@ class ComponentPageManager {
|
|
|
265
580
|
// Pretty print JSON
|
|
266
581
|
try {
|
|
267
582
|
content = JSON.stringify(JSON.parse(content), null, 2);
|
|
268
|
-
} catch (e) {
|
|
583
|
+
} catch (e) {
|
|
269
584
|
console.warn('Could not parse JSON content:', e);
|
|
270
585
|
}
|
|
271
586
|
break;
|
|
@@ -279,6 +594,47 @@ class ComponentPageManager {
|
|
|
279
594
|
}
|
|
280
595
|
}
|
|
281
596
|
|
|
597
|
+
// Collect line numbers with errors and warnings
|
|
598
|
+
const errorLines = new Set();
|
|
599
|
+
const warningLines = new Set();
|
|
600
|
+
|
|
601
|
+
if (this.component.security && this.component.security.validators) {
|
|
602
|
+
Object.values(this.component.security.validators).forEach(validator => {
|
|
603
|
+
if (validator.errors) {
|
|
604
|
+
validator.errors.forEach(error => {
|
|
605
|
+
// Check direct line property
|
|
606
|
+
if (error.line) {
|
|
607
|
+
errorLines.add(error.line);
|
|
608
|
+
}
|
|
609
|
+
// Check examples array
|
|
610
|
+
if (error.examples && error.examples.length > 0) {
|
|
611
|
+
error.examples.forEach(example => {
|
|
612
|
+
if (example.line) {
|
|
613
|
+
errorLines.add(example.line);
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
if (validator.warnings) {
|
|
620
|
+
validator.warnings.forEach(warning => {
|
|
621
|
+
// Check direct line property
|
|
622
|
+
if (warning.line) {
|
|
623
|
+
warningLines.add(warning.line);
|
|
624
|
+
}
|
|
625
|
+
// Check examples array
|
|
626
|
+
if (warning.examples && warning.examples.length > 0) {
|
|
627
|
+
warning.examples.forEach(example => {
|
|
628
|
+
if (example.line) {
|
|
629
|
+
warningLines.add(example.line);
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
|
|
282
638
|
// Update code language indicator
|
|
283
639
|
const codeLanguageElement = document.getElementById('codeLanguage');
|
|
284
640
|
if (codeLanguageElement) {
|
|
@@ -292,12 +648,109 @@ class ComponentPageManager {
|
|
|
292
648
|
codeElement.className = `language-${language}`;
|
|
293
649
|
}
|
|
294
650
|
|
|
295
|
-
// Generate line numbers
|
|
651
|
+
// Generate line numbers with error/warning indicators
|
|
296
652
|
const lines = content.split('\n');
|
|
297
|
-
const lineNumbers = lines.map((_, index) =>
|
|
653
|
+
const lineNumbers = lines.map((_, index) => {
|
|
654
|
+
const lineNum = index + 1;
|
|
655
|
+
let className = '';
|
|
656
|
+
let style = '';
|
|
657
|
+
let title = '';
|
|
658
|
+
|
|
659
|
+
if (errorLines.has(lineNum)) {
|
|
660
|
+
className = 'line-with-error';
|
|
661
|
+
style = 'background-color: rgba(245, 101, 101, 0.15); color: #f56565; font-weight: 600; border-left: 3px solid #f56565; padding-left: 5px; cursor: pointer;';
|
|
662
|
+
title = 'Line has validation errors - Click to see details';
|
|
663
|
+
} else if (warningLines.has(lineNum)) {
|
|
664
|
+
className = 'line-with-warning';
|
|
665
|
+
style = 'background-color: rgba(237, 137, 54, 0.15); color: #ed8936; font-weight: 600; border-left: 3px solid #ed8936; padding-left: 5px; cursor: pointer;';
|
|
666
|
+
title = 'Line has validation warnings - Click to see details';
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
return `<span class="${className}" style="${style}" title="${title}" data-line-number="${lineNum}">${lineNum}</span>`;
|
|
670
|
+
}).join('');
|
|
671
|
+
|
|
298
672
|
const lineNumbersElement = document.getElementById('lineNumbers');
|
|
299
673
|
if (lineNumbersElement) {
|
|
300
674
|
lineNumbersElement.innerHTML = lineNumbers;
|
|
675
|
+
|
|
676
|
+
// Add click event listeners to error/warning line numbers
|
|
677
|
+
const clickableLines = lineNumbersElement.querySelectorAll('.line-with-error, .line-with-warning');
|
|
678
|
+
clickableLines.forEach(lineSpan => {
|
|
679
|
+
lineSpan.addEventListener('click', () => {
|
|
680
|
+
// Find which validator has the error for this line
|
|
681
|
+
const lineNum = parseInt(lineSpan.getAttribute('data-line-number'));
|
|
682
|
+
|
|
683
|
+
if (this.component.security && this.component.security.validators) {
|
|
684
|
+
// Look for the validator with this line number
|
|
685
|
+
for (const [validatorKey, validatorData] of Object.entries(this.component.security.validators)) {
|
|
686
|
+
if (typeof validatorData === 'object') {
|
|
687
|
+
// Check if this validator has errors/warnings for this line
|
|
688
|
+
const hasError = validatorData.errors && validatorData.errors.some(error => {
|
|
689
|
+
if (error.line === lineNum) return true;
|
|
690
|
+
if (error.examples && error.examples.some(ex => ex.line === lineNum)) return true;
|
|
691
|
+
return false;
|
|
692
|
+
});
|
|
693
|
+
|
|
694
|
+
const hasWarning = validatorData.warnings && validatorData.warnings.some(warning => {
|
|
695
|
+
if (warning.line === lineNum) return true;
|
|
696
|
+
if (warning.examples && warning.examples.some(ex => ex.line === lineNum)) return true;
|
|
697
|
+
return false;
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
if (hasError || hasWarning) {
|
|
701
|
+
// Found the validator with this line, open its modal
|
|
702
|
+
const checkLabels = {
|
|
703
|
+
structural: 'Structure',
|
|
704
|
+
integrity: 'Integrity',
|
|
705
|
+
semantic: 'Content Safety',
|
|
706
|
+
references: 'references',
|
|
707
|
+
provenance: 'Source'
|
|
708
|
+
};
|
|
709
|
+
|
|
710
|
+
const checkDescriptions = {
|
|
711
|
+
structural: 'Verifies file format, YAML frontmatter, required fields, and encoding',
|
|
712
|
+
integrity: 'Checks for tampering using SHA256 hash and version tracking',
|
|
713
|
+
semantic: 'Detects malicious patterns, prompt injection, and dangerous commands',
|
|
714
|
+
references: 'Validates external URLs and prevents SSRF attacks',
|
|
715
|
+
provenance: 'Confirms author metadata and repository information'
|
|
716
|
+
};
|
|
717
|
+
|
|
718
|
+
window.openValidationModal(
|
|
719
|
+
validatorKey,
|
|
720
|
+
checkLabels[validatorKey] || validatorKey,
|
|
721
|
+
validatorData,
|
|
722
|
+
checkDescriptions[validatorKey]
|
|
723
|
+
);
|
|
724
|
+
break;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
});
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
// Add corresponding highlighting to code lines
|
|
734
|
+
if (errorLines.size > 0 || warningLines.size > 0) {
|
|
735
|
+
const codeLines = codeElement.innerHTML.split('\n');
|
|
736
|
+
const highlightedLines = codeLines.map((line, index) => {
|
|
737
|
+
const lineNum = index + 1;
|
|
738
|
+
if (errorLines.has(lineNum)) {
|
|
739
|
+
return `<span style="background-color: rgba(245, 101, 101, 0.08); display: block; margin: 0 -10px; padding: 0 10px;">${line}</span>`;
|
|
740
|
+
} else if (warningLines.has(lineNum)) {
|
|
741
|
+
return `<span style="background-color: rgba(237, 137, 54, 0.08); display: block; margin: 0 -10px; padding: 0 10px;">${line}</span>`;
|
|
742
|
+
}
|
|
743
|
+
return line;
|
|
744
|
+
});
|
|
745
|
+
codeElement.innerHTML = highlightedLines.join('\n');
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// Sync scroll between line numbers and code content
|
|
749
|
+
const codeContentDiv = document.getElementById('codeContent');
|
|
750
|
+
if (lineNumbersElement && codeContentDiv) {
|
|
751
|
+
codeContentDiv.addEventListener('scroll', function() {
|
|
752
|
+
lineNumbersElement.scrollTop = codeContentDiv.scrollTop;
|
|
753
|
+
});
|
|
301
754
|
}
|
|
302
755
|
|
|
303
756
|
} catch (error) {
|
|
@@ -805,4 +1258,552 @@ document.addEventListener('click', (e) => {
|
|
|
805
1258
|
if (shareDropdown && !shareDropdown.contains(e.target)) {
|
|
806
1259
|
shareDropdown.classList.remove('open');
|
|
807
1260
|
}
|
|
808
|
-
});
|
|
1261
|
+
});
|
|
1262
|
+
|
|
1263
|
+
// Validation Modal System
|
|
1264
|
+
window.openValidationModal = function(validatorKey, validatorLabel, validatorData, description) {
|
|
1265
|
+
// Create modal overlay
|
|
1266
|
+
const modalOverlay = document.createElement('div');
|
|
1267
|
+
modalOverlay.className = 'modal-overlay';
|
|
1268
|
+
modalOverlay.style.cssText = `
|
|
1269
|
+
position: fixed;
|
|
1270
|
+
top: 0;
|
|
1271
|
+
left: 0;
|
|
1272
|
+
width: 100%;
|
|
1273
|
+
height: 100%;
|
|
1274
|
+
background: rgba(0, 0, 0, 0.7);
|
|
1275
|
+
display: flex;
|
|
1276
|
+
align-items: center;
|
|
1277
|
+
justify-content: center;
|
|
1278
|
+
z-index: 10000;
|
|
1279
|
+
padding: 20px;
|
|
1280
|
+
backdrop-filter: blur(3px);
|
|
1281
|
+
overflow: hidden;
|
|
1282
|
+
`;
|
|
1283
|
+
|
|
1284
|
+
// Create modal container
|
|
1285
|
+
const modalContainer = document.createElement('div');
|
|
1286
|
+
modalContainer.style.cssText = `
|
|
1287
|
+
background: #1a1a1a;
|
|
1288
|
+
border: 1px solid #333;
|
|
1289
|
+
border-radius: 8px;
|
|
1290
|
+
max-width: 700px;
|
|
1291
|
+
max-height: 80vh;
|
|
1292
|
+
width: 100%;
|
|
1293
|
+
display: flex;
|
|
1294
|
+
flex-direction: column;
|
|
1295
|
+
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
|
|
1296
|
+
overflow: hidden;
|
|
1297
|
+
`;
|
|
1298
|
+
|
|
1299
|
+
// Handle both old format (boolean) and new format (object)
|
|
1300
|
+
const passed = typeof validatorData === 'boolean' ? validatorData : validatorData.valid;
|
|
1301
|
+
const hasErrors = typeof validatorData === 'object' && validatorData.errors && validatorData.errors.length > 0;
|
|
1302
|
+
const hasWarnings = typeof validatorData === 'object' && validatorData.warnings && validatorData.warnings.length > 0;
|
|
1303
|
+
const hasInfo = typeof validatorData === 'object' && validatorData.info && validatorData.info.length > 0;
|
|
1304
|
+
|
|
1305
|
+
// Determine status
|
|
1306
|
+
let status = 'passed';
|
|
1307
|
+
let statusColor = '#48bb78';
|
|
1308
|
+
let statusText = 'All Checks Passed';
|
|
1309
|
+
let statusIcon = '✓';
|
|
1310
|
+
|
|
1311
|
+
if (hasErrors) {
|
|
1312
|
+
status = 'failed';
|
|
1313
|
+
statusColor = '#f56565';
|
|
1314
|
+
statusText = 'Validation Failed';
|
|
1315
|
+
statusIcon = '✗';
|
|
1316
|
+
} else if (hasWarnings) {
|
|
1317
|
+
status = 'warning';
|
|
1318
|
+
statusColor = '#ed8936';
|
|
1319
|
+
statusText = 'Validation Passed with Warnings';
|
|
1320
|
+
statusIcon = '⚠';
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
// Build modal content - Header (fixed)
|
|
1324
|
+
let modalHeader = `
|
|
1325
|
+
<div style="padding: 30px 30px 20px 30px; flex-shrink: 0; border-bottom: 1px solid #333;">
|
|
1326
|
+
<!-- Header -->
|
|
1327
|
+
<div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 16px;">
|
|
1328
|
+
<div style="flex: 1;">
|
|
1329
|
+
<h2 style="margin: 0 0 8px 0; color: #fff; font-size: 24px; font-weight: 600;">
|
|
1330
|
+
${validatorLabel}
|
|
1331
|
+
</h2>
|
|
1332
|
+
<p style="margin: 0; color: #999; font-size: 14px; line-height: 1.6;">
|
|
1333
|
+
${description || 'Validation check details'}
|
|
1334
|
+
</p>
|
|
1335
|
+
</div>
|
|
1336
|
+
<button id="closeValidationModal" style="
|
|
1337
|
+
background: transparent;
|
|
1338
|
+
border: none;
|
|
1339
|
+
color: #999;
|
|
1340
|
+
font-size: 28px;
|
|
1341
|
+
cursor: pointer;
|
|
1342
|
+
padding: 0;
|
|
1343
|
+
width: 32px;
|
|
1344
|
+
height: 32px;
|
|
1345
|
+
display: flex;
|
|
1346
|
+
align-items: center;
|
|
1347
|
+
justify-content: center;
|
|
1348
|
+
transition: color 0.2s;
|
|
1349
|
+
margin-left: 20px;
|
|
1350
|
+
flex-shrink: 0;
|
|
1351
|
+
" onmouseover="this.style.color='#fff'" onmouseout="this.style.color='#999'">
|
|
1352
|
+
×
|
|
1353
|
+
</button>
|
|
1354
|
+
</div>
|
|
1355
|
+
|
|
1356
|
+
<!-- Status Badge -->
|
|
1357
|
+
<div style="
|
|
1358
|
+
display: inline-flex;
|
|
1359
|
+
align-items: center;
|
|
1360
|
+
gap: 8px;
|
|
1361
|
+
padding: 8px 16px;
|
|
1362
|
+
background: ${statusColor}20;
|
|
1363
|
+
border: 1px solid ${statusColor}40;
|
|
1364
|
+
border-radius: 6px;
|
|
1365
|
+
color: ${statusColor};
|
|
1366
|
+
font-weight: 600;
|
|
1367
|
+
font-size: 14px;
|
|
1368
|
+
">
|
|
1369
|
+
<span style="font-size: 16px;">${statusIcon}</span>
|
|
1370
|
+
${statusText}
|
|
1371
|
+
</div>
|
|
1372
|
+
</div>
|
|
1373
|
+
`;
|
|
1374
|
+
|
|
1375
|
+
// Build modal body content (scrollable)
|
|
1376
|
+
let modalBodyContent = '';
|
|
1377
|
+
|
|
1378
|
+
// Add errors section if present
|
|
1379
|
+
if (hasErrors) {
|
|
1380
|
+
modalBodyContent += `
|
|
1381
|
+
<div style="margin-bottom: 24px;">
|
|
1382
|
+
<h3 style="color: #f56565; font-size: 16px; font-weight: 600; margin: 0 0 12px 0; display: flex; align-items: center; gap: 8px;">
|
|
1383
|
+
<span>✗</span>
|
|
1384
|
+
Errors (${validatorData.errorCount || validatorData.errors.length})
|
|
1385
|
+
</h3>
|
|
1386
|
+
<div style="
|
|
1387
|
+
background: rgba(245, 101, 101, 0.1);
|
|
1388
|
+
border-left: 3px solid #f56565;
|
|
1389
|
+
border-radius: 4px;
|
|
1390
|
+
padding: 16px;
|
|
1391
|
+
">
|
|
1392
|
+
`;
|
|
1393
|
+
|
|
1394
|
+
validatorData.errors.forEach((error, index) => {
|
|
1395
|
+
// Build location info if available
|
|
1396
|
+
let locationInfo = '';
|
|
1397
|
+
if (error.position || error.line) {
|
|
1398
|
+
locationInfo = `
|
|
1399
|
+
<div style="
|
|
1400
|
+
display: inline-flex;
|
|
1401
|
+
align-items: center;
|
|
1402
|
+
gap: 8px;
|
|
1403
|
+
margin-top: 4px;
|
|
1404
|
+
padding: 4px 8px;
|
|
1405
|
+
background: rgba(0, 0, 0, 0.3);
|
|
1406
|
+
border-radius: 4px;
|
|
1407
|
+
font-size: 12px;
|
|
1408
|
+
color: #999;
|
|
1409
|
+
font-family: 'Courier New', monospace;
|
|
1410
|
+
">
|
|
1411
|
+
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
|
|
1412
|
+
<path d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,7H13V13H11V7M11,15H13V17H11V15Z"/>
|
|
1413
|
+
</svg>
|
|
1414
|
+
${error.position ? `Line ${error.position}` : `Line ${error.line}` + (error.column ? `:${error.column}` : '')}
|
|
1415
|
+
</div>
|
|
1416
|
+
`;
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
// Build line text preview if available
|
|
1420
|
+
let lineTextPreview = '';
|
|
1421
|
+
if (error.lineText) {
|
|
1422
|
+
lineTextPreview = `
|
|
1423
|
+
<div style="margin-top: 8px; padding: 8px 12px; background: rgba(0, 0, 0, 0.4); border-left: 2px solid #f56565; border-radius: 4px; font-family: 'Courier New', monospace; font-size: 12px; color: #ddd; white-space: normal; word-wrap: break-word; overflow-wrap: break-word;">
|
|
1424
|
+
${error.lineText.replace(/</g, '<').replace(/>/g, '>')}
|
|
1425
|
+
</div>
|
|
1426
|
+
`;
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
// Handle examples array (for patterns with multiple matches)
|
|
1430
|
+
let examplesSection = '';
|
|
1431
|
+
if (error.examples && error.examples.length > 0) {
|
|
1432
|
+
examplesSection = `
|
|
1433
|
+
<div style="margin-top: 12px;">
|
|
1434
|
+
<div style="color: #999; font-size: 12px; margin-bottom: 6px; font-weight: 600;">
|
|
1435
|
+
Found ${error.examples.length} occurrence${error.examples.length > 1 ? 's' : ''}:
|
|
1436
|
+
</div>
|
|
1437
|
+
`;
|
|
1438
|
+
|
|
1439
|
+
error.examples.slice(0, 5).forEach((example, exIdx) => {
|
|
1440
|
+
examplesSection += `
|
|
1441
|
+
<div style="margin-bottom: 8px; padding: 8px 12px; background: rgba(0, 0, 0, 0.3); border-radius: 4px;">
|
|
1442
|
+
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 4px;">
|
|
1443
|
+
<span style="color: #f56565; font-size: 11px; font-weight: 600; font-family: 'Courier New', monospace;">
|
|
1444
|
+
${example.position || `Line ${example.line}`}
|
|
1445
|
+
</span>
|
|
1446
|
+
${example.text ? `
|
|
1447
|
+
<span style="color: #ed8936; font-size: 11px; font-family: 'Courier New', monospace;">
|
|
1448
|
+
"${example.text.replace(/</g, '<').replace(/>/g, '>')}"
|
|
1449
|
+
</span>
|
|
1450
|
+
` : ''}
|
|
1451
|
+
</div>
|
|
1452
|
+
${example.lineText ? `
|
|
1453
|
+
<div style="color: #999; font-size: 11px; font-family: 'Courier New', monospace; white-space: normal; word-wrap: break-word; overflow-wrap: break-word;">
|
|
1454
|
+
${example.lineText.replace(/</g, '<').replace(/>/g, '>')}
|
|
1455
|
+
</div>
|
|
1456
|
+
` : ''}
|
|
1457
|
+
</div>
|
|
1458
|
+
`;
|
|
1459
|
+
});
|
|
1460
|
+
|
|
1461
|
+
if (error.examples.length > 5) {
|
|
1462
|
+
examplesSection += `
|
|
1463
|
+
<div style="color: #666; font-size: 11px; font-style: italic; margin-top: 4px;">
|
|
1464
|
+
... and ${error.examples.length - 5} more occurrence${error.examples.length - 5 > 1 ? 's' : ''}
|
|
1465
|
+
</div>
|
|
1466
|
+
`;
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
examplesSection += `</div>`;
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
modalBodyContent += `
|
|
1473
|
+
<div style="margin-bottom: ${index < validatorData.errors.length - 1 ? '12px' : '0'}; padding-bottom: ${index < validatorData.errors.length - 1 ? '12px' : '0'}; border-bottom: ${index < validatorData.errors.length - 1 ? '1px solid rgba(245, 101, 101, 0.2)' : 'none'};">
|
|
1474
|
+
<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px;">
|
|
1475
|
+
<div style="color: #f56565; font-weight: 600; font-size: 13px;">
|
|
1476
|
+
${error.code || 'ERROR'}
|
|
1477
|
+
</div>
|
|
1478
|
+
${locationInfo}
|
|
1479
|
+
</div>
|
|
1480
|
+
<div style="color: #ddd; font-size: 16px; line-height: 1.6; margin-bottom: 8px;">
|
|
1481
|
+
${error.message || error}
|
|
1482
|
+
</div>
|
|
1483
|
+
${lineTextPreview}
|
|
1484
|
+
${examplesSection}
|
|
1485
|
+
${error.context && !error.examples ? `
|
|
1486
|
+
<div style="margin-top: 8px; padding: 8px; background: rgba(0, 0, 0, 0.3); border-radius: 4px; font-family: 'Courier New', monospace; font-size: 12px; color: #999;">
|
|
1487
|
+
${JSON.stringify(error.context, null, 2).replace(/\n/g, '<br>').replace(/ /g, ' ')}
|
|
1488
|
+
</div>
|
|
1489
|
+
` : ''}
|
|
1490
|
+
</div>
|
|
1491
|
+
`;
|
|
1492
|
+
});
|
|
1493
|
+
|
|
1494
|
+
modalBodyContent += `
|
|
1495
|
+
</div>
|
|
1496
|
+
</div>
|
|
1497
|
+
`;
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1500
|
+
// Add warnings section if present
|
|
1501
|
+
if (hasWarnings) {
|
|
1502
|
+
modalBodyContent += `
|
|
1503
|
+
<div style="margin-bottom: 24px;">
|
|
1504
|
+
<h3 style="color: #ed8936; font-size: 16px; font-weight: 600; margin: 0 0 12px 0; display: flex; align-items: center; gap: 8px;">
|
|
1505
|
+
<span>⚠</span>
|
|
1506
|
+
Warnings (${validatorData.warningCount || validatorData.warnings.length})
|
|
1507
|
+
</h3>
|
|
1508
|
+
<div style="
|
|
1509
|
+
background: rgba(237, 137, 54, 0.1);
|
|
1510
|
+
border-left: 3px solid #ed8936;
|
|
1511
|
+
border-radius: 4px;
|
|
1512
|
+
padding: 16px;
|
|
1513
|
+
">
|
|
1514
|
+
`;
|
|
1515
|
+
|
|
1516
|
+
validatorData.warnings.forEach((warning, index) => {
|
|
1517
|
+
// Build location info if available
|
|
1518
|
+
let locationInfo = '';
|
|
1519
|
+
if (warning.position || warning.line) {
|
|
1520
|
+
locationInfo = `
|
|
1521
|
+
<div style="
|
|
1522
|
+
display: inline-flex;
|
|
1523
|
+
align-items: center;
|
|
1524
|
+
gap: 8px;
|
|
1525
|
+
margin-top: 4px;
|
|
1526
|
+
padding: 4px 8px;
|
|
1527
|
+
background: rgba(0, 0, 0, 0.3);
|
|
1528
|
+
border-radius: 4px;
|
|
1529
|
+
font-size: 12px;
|
|
1530
|
+
color: #999;
|
|
1531
|
+
font-family: 'Courier New', monospace;
|
|
1532
|
+
">
|
|
1533
|
+
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
|
|
1534
|
+
<path d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,7H13V13H11V7M11,15H13V17H11V15Z"/>
|
|
1535
|
+
</svg>
|
|
1536
|
+
${warning.position ? `Line ${warning.position}` : `Line ${warning.line}` + (warning.column ? `:${warning.column}` : '')}
|
|
1537
|
+
</div>
|
|
1538
|
+
`;
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
// Build line text preview if available
|
|
1542
|
+
let lineTextPreview = '';
|
|
1543
|
+
if (warning.lineText) {
|
|
1544
|
+
lineTextPreview = `
|
|
1545
|
+
<div style="margin-top: 8px; padding: 8px 12px; background: rgba(0, 0, 0, 0.4); border-left: 2px solid #ed8936; border-radius: 4px; font-family: 'Courier New', monospace; font-size: 12px; color: #ddd; white-space: normal; word-wrap: break-word; overflow-wrap: break-word;">
|
|
1546
|
+
${warning.lineText.replace(/</g, '<').replace(/>/g, '>')}
|
|
1547
|
+
</div>
|
|
1548
|
+
`;
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
// Handle examples array (for patterns with multiple matches)
|
|
1552
|
+
let examplesSection = '';
|
|
1553
|
+
if (warning.examples && warning.examples.length > 0) {
|
|
1554
|
+
examplesSection = `
|
|
1555
|
+
<div style="margin-top: 12px;">
|
|
1556
|
+
<div style="color: #999; font-size: 12px; margin-bottom: 6px; font-weight: 600;">
|
|
1557
|
+
Found ${warning.examples.length} occurrence${warning.examples.length > 1 ? 's' : ''}:
|
|
1558
|
+
</div>
|
|
1559
|
+
`;
|
|
1560
|
+
|
|
1561
|
+
warning.examples.slice(0, 5).forEach((example, exIdx) => {
|
|
1562
|
+
examplesSection += `
|
|
1563
|
+
<div style="margin-bottom: 8px; padding: 8px 12px; background: rgba(0, 0, 0, 0.3); border-radius: 4px;">
|
|
1564
|
+
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 4px;">
|
|
1565
|
+
<span style="color: #ed8936; font-size: 11px; font-weight: 600; font-family: 'Courier New', monospace;">
|
|
1566
|
+
${example.position || `Line ${example.line}`}
|
|
1567
|
+
</span>
|
|
1568
|
+
${example.text ? `
|
|
1569
|
+
<span style="color: #f9a825; font-size: 11px; font-family: 'Courier New', monospace;">
|
|
1570
|
+
"${example.text.replace(/</g, '<').replace(/>/g, '>')}"
|
|
1571
|
+
</span>
|
|
1572
|
+
` : ''}
|
|
1573
|
+
</div>
|
|
1574
|
+
${example.lineText ? `
|
|
1575
|
+
<div style="color: #999; font-size: 11px; font-family: 'Courier New', monospace; white-space: normal; word-wrap: break-word; overflow-wrap: break-word;">
|
|
1576
|
+
${example.lineText.replace(/</g, '<').replace(/>/g, '>')}
|
|
1577
|
+
</div>
|
|
1578
|
+
` : ''}
|
|
1579
|
+
</div>
|
|
1580
|
+
`;
|
|
1581
|
+
});
|
|
1582
|
+
|
|
1583
|
+
if (warning.examples.length > 5) {
|
|
1584
|
+
examplesSection += `
|
|
1585
|
+
<div style="color: #666; font-size: 11px; font-style: italic; margin-top: 4px;">
|
|
1586
|
+
... and ${warning.examples.length - 5} more occurrence${warning.examples.length - 5 > 1 ? 's' : ''}
|
|
1587
|
+
</div>
|
|
1588
|
+
`;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
examplesSection += `</div>`;
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
modalBodyContent += `
|
|
1595
|
+
<div style="margin-bottom: ${index < validatorData.warnings.length - 1 ? '12px' : '0'}; padding-bottom: ${index < validatorData.warnings.length - 1 ? '12px' : '0'}; border-bottom: ${index < validatorData.warnings.length - 1 ? '1px solid rgba(237, 137, 54, 0.2)' : 'none'};">
|
|
1596
|
+
<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px;">
|
|
1597
|
+
<div style="color: #ed8936; font-weight: 600; font-size: 13px;">
|
|
1598
|
+
${warning.code || 'WARNING'}
|
|
1599
|
+
</div>
|
|
1600
|
+
${locationInfo}
|
|
1601
|
+
</div>
|
|
1602
|
+
<div style="color: #ddd; font-size: 16px; line-height: 1.6; margin-bottom: 8px;">
|
|
1603
|
+
${warning.message || warning}
|
|
1604
|
+
</div>
|
|
1605
|
+
${lineTextPreview}
|
|
1606
|
+
${examplesSection}
|
|
1607
|
+
${warning.context && !warning.examples ? `
|
|
1608
|
+
<div style="margin-top: 8px; padding: 8px; background: rgba(0, 0, 0, 0.3); border-radius: 4px; font-family: 'Courier New', monospace; font-size: 12px; color: #999;">
|
|
1609
|
+
${JSON.stringify(warning.context, null, 2).replace(/\n/g, '<br>').replace(/ /g, ' ')}
|
|
1610
|
+
</div>
|
|
1611
|
+
` : ''}
|
|
1612
|
+
</div>
|
|
1613
|
+
`;
|
|
1614
|
+
});
|
|
1615
|
+
|
|
1616
|
+
modalBodyContent += `
|
|
1617
|
+
</div>
|
|
1618
|
+
</div>
|
|
1619
|
+
`;
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
// Add success/info section if everything passed
|
|
1623
|
+
if (!hasErrors && !hasWarnings && (hasInfo || passed)) {
|
|
1624
|
+
// Generate validator-specific success summary
|
|
1625
|
+
let successSummary = '';
|
|
1626
|
+
|
|
1627
|
+
switch(validatorKey) {
|
|
1628
|
+
case 'structural':
|
|
1629
|
+
successSummary = `
|
|
1630
|
+
<div style="color: #bbb; font-size: 14px; line-height: 1.6; margin-bottom: 12px;">
|
|
1631
|
+
This component has a valid structure with proper formatting:
|
|
1632
|
+
</div>
|
|
1633
|
+
<ul style="margin: 0; padding-left: 20px; color: #999; font-size: 13px; line-height: 1.8;">
|
|
1634
|
+
<li>YAML frontmatter is properly formatted and contains all required fields</li>
|
|
1635
|
+
<li>File size is within acceptable limits</li>
|
|
1636
|
+
<li>UTF-8 encoding is valid with no binary content</li>
|
|
1637
|
+
<li>Content structure follows markdown conventions</li>
|
|
1638
|
+
<li>Section count is optimal for readability</li>
|
|
1639
|
+
</ul>
|
|
1640
|
+
`;
|
|
1641
|
+
break;
|
|
1642
|
+
|
|
1643
|
+
case 'integrity':
|
|
1644
|
+
successSummary = `
|
|
1645
|
+
<div style="color: #bbb; font-size: 14px; line-height: 1.6; margin-bottom: 12px;">
|
|
1646
|
+
This component's integrity has been verified:
|
|
1647
|
+
</div>
|
|
1648
|
+
<ul style="margin: 0; padding-left: 20px; color: #999; font-size: 13px; line-height: 1.8;">
|
|
1649
|
+
<li>SHA256 hash matches expected value</li>
|
|
1650
|
+
<li>No tampering or unauthorized modifications detected</li>
|
|
1651
|
+
<li>Version tracking is consistent</li>
|
|
1652
|
+
<li>File has not been corrupted during transmission</li>
|
|
1653
|
+
</ul>
|
|
1654
|
+
`;
|
|
1655
|
+
break;
|
|
1656
|
+
|
|
1657
|
+
case 'semantic':
|
|
1658
|
+
successSummary = `
|
|
1659
|
+
<div style="color: #bbb; font-size: 14px; line-height: 1.6; margin-bottom: 12px;">
|
|
1660
|
+
This component is safe and contains no malicious content:
|
|
1661
|
+
</div>
|
|
1662
|
+
<ul style="margin: 0; padding-left: 20px; color: #999; font-size: 13px; line-height: 1.8;">
|
|
1663
|
+
<li>No prompt injection attempts detected</li>
|
|
1664
|
+
<li>No dangerous shell commands or system calls</li>
|
|
1665
|
+
<li>No obfuscated or suspicious code patterns</li>
|
|
1666
|
+
<li>No attempts to access sensitive file paths</li>
|
|
1667
|
+
<li>Content follows security best practices</li>
|
|
1668
|
+
</ul>
|
|
1669
|
+
`;
|
|
1670
|
+
break;
|
|
1671
|
+
|
|
1672
|
+
case 'references':
|
|
1673
|
+
successSummary = `
|
|
1674
|
+
<div style="color: #bbb; font-size: 14px; line-height: 1.6; margin-bottom: 12px;">
|
|
1675
|
+
All external references have been validated:
|
|
1676
|
+
</div>
|
|
1677
|
+
<ul style="margin: 0; padding-left: 20px; color: #999; font-size: 13px; line-height: 1.8;">
|
|
1678
|
+
<li>All URLs are properly formatted and accessible</li>
|
|
1679
|
+
<li>No SSRF (Server-Side Request Forgery) vulnerabilities</li>
|
|
1680
|
+
<li>External links point to trusted domains</li>
|
|
1681
|
+
<li>No private network or localhost references</li>
|
|
1682
|
+
<li>HTTP links have been upgraded to HTTPS where possible</li>
|
|
1683
|
+
</ul>
|
|
1684
|
+
`;
|
|
1685
|
+
break;
|
|
1686
|
+
|
|
1687
|
+
case 'provenance':
|
|
1688
|
+
successSummary = `
|
|
1689
|
+
<div style="color: #bbb; font-size: 14px; line-height: 1.6; margin-bottom: 12px;">
|
|
1690
|
+
Component origin and authorship have been confirmed:
|
|
1691
|
+
</div>
|
|
1692
|
+
<ul style="margin: 0; padding-left: 20px; color: #999; font-size: 13px; line-height: 1.8;">
|
|
1693
|
+
<li>Author metadata is present and valid</li>
|
|
1694
|
+
<li>Repository information is correct</li>
|
|
1695
|
+
<li>License information is specified</li>
|
|
1696
|
+
<li>Component source can be traced to original repository</li>
|
|
1697
|
+
<li>No signs of unauthorized redistribution</li>
|
|
1698
|
+
</ul>
|
|
1699
|
+
`;
|
|
1700
|
+
break;
|
|
1701
|
+
|
|
1702
|
+
default:
|
|
1703
|
+
successSummary = `
|
|
1704
|
+
<div style="color: #bbb; font-size: 14px; line-height: 1.6;">
|
|
1705
|
+
This component has been validated and meets all ${validatorLabel.toLowerCase()} requirements.
|
|
1706
|
+
</div>
|
|
1707
|
+
`;
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
modalBodyContent += `
|
|
1711
|
+
<div style="margin-bottom: 24px;">
|
|
1712
|
+
<h3 style="color: #48bb78; font-size: 16px; font-weight: 600; margin: 0 0 12px 0; display: flex; align-items: center; gap: 8px;">
|
|
1713
|
+
<span>✓</span>
|
|
1714
|
+
Validation Passed
|
|
1715
|
+
</h3>
|
|
1716
|
+
<div style="
|
|
1717
|
+
background: rgba(72, 187, 120, 0.1);
|
|
1718
|
+
border-left: 3px solid #48bb78;
|
|
1719
|
+
border-radius: 4px;
|
|
1720
|
+
padding: 16px;
|
|
1721
|
+
">
|
|
1722
|
+
<div style="color: #48bb78; font-weight: 600; font-size: 14px; margin-bottom: 12px;">
|
|
1723
|
+
All ${validatorLabel} checks passed successfully
|
|
1724
|
+
</div>
|
|
1725
|
+
${successSummary}
|
|
1726
|
+
`;
|
|
1727
|
+
|
|
1728
|
+
// Add info items if present
|
|
1729
|
+
if (hasInfo) {
|
|
1730
|
+
modalBodyContent += `
|
|
1731
|
+
<div style="margin-top: 16px; padding-top: 16px; border-top: 1px solid rgba(72, 187, 120, 0.2);">
|
|
1732
|
+
<div style="color: #48bb78; font-weight: 600; font-size: 13px; margin-bottom: 8px;">
|
|
1733
|
+
Additional Details:
|
|
1734
|
+
</div>
|
|
1735
|
+
`;
|
|
1736
|
+
validatorData.info.forEach((info, index) => {
|
|
1737
|
+
modalBodyContent += `
|
|
1738
|
+
<div style="margin-bottom: ${index < validatorData.info.length - 1 ? '8px' : '0'}; color: #999; font-size: 13px; padding-left: 12px;">
|
|
1739
|
+
• ${info.message || info}
|
|
1740
|
+
</div>
|
|
1741
|
+
`;
|
|
1742
|
+
});
|
|
1743
|
+
modalBodyContent += `
|
|
1744
|
+
</div>
|
|
1745
|
+
`;
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
modalBodyContent += `
|
|
1749
|
+
</div>
|
|
1750
|
+
</div>
|
|
1751
|
+
`;
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
// Build modal footer (fixed)
|
|
1755
|
+
let modalFooter = `
|
|
1756
|
+
<div style="display: flex; justify-content: flex-end; margin-top: 24px; padding-top: 24px; border-top: 1px solid #333;">
|
|
1757
|
+
<button id="closeValidationModalBtn" style="
|
|
1758
|
+
background: #2d2d2d;
|
|
1759
|
+
border: 1px solid #444;
|
|
1760
|
+
color: #fff;
|
|
1761
|
+
padding: 10px 24px;
|
|
1762
|
+
border-radius: 6px;
|
|
1763
|
+
font-size: 14px;
|
|
1764
|
+
font-weight: 600;
|
|
1765
|
+
cursor: pointer;
|
|
1766
|
+
transition: all 0.2s;
|
|
1767
|
+
" onmouseover="this.style.background='#3d3d3d'; this.style.borderColor='#555'" onmouseout="this.style.background='#2d2d2d'; this.style.borderColor='#444'">
|
|
1768
|
+
Close
|
|
1769
|
+
</button>
|
|
1770
|
+
</div>
|
|
1771
|
+
`;
|
|
1772
|
+
|
|
1773
|
+
// Assemble the complete modal with scrollable body
|
|
1774
|
+
modalContainer.innerHTML = `
|
|
1775
|
+
${modalHeader}
|
|
1776
|
+
<div style="flex: 1; overflow-y: auto; padding: 30px;">
|
|
1777
|
+
${modalBodyContent}
|
|
1778
|
+
</div>
|
|
1779
|
+
<div style="flex-shrink: 0; padding: 20px 30px; border-top: 1px solid #333;">
|
|
1780
|
+
${modalFooter}
|
|
1781
|
+
</div>
|
|
1782
|
+
`;
|
|
1783
|
+
modalOverlay.appendChild(modalContainer);
|
|
1784
|
+
document.body.appendChild(modalOverlay);
|
|
1785
|
+
|
|
1786
|
+
// Close modal handlers
|
|
1787
|
+
function closeModal() {
|
|
1788
|
+
document.body.removeChild(modalOverlay);
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
document.getElementById('closeValidationModal').addEventListener('click', closeModal);
|
|
1792
|
+
document.getElementById('closeValidationModalBtn').addEventListener('click', closeModal);
|
|
1793
|
+
|
|
1794
|
+
// Close on overlay click (but not on modal content click)
|
|
1795
|
+
modalOverlay.addEventListener('click', (e) => {
|
|
1796
|
+
if (e.target === modalOverlay) {
|
|
1797
|
+
closeModal();
|
|
1798
|
+
}
|
|
1799
|
+
});
|
|
1800
|
+
|
|
1801
|
+
// Close on Escape key
|
|
1802
|
+
function handleEscape(e) {
|
|
1803
|
+
if (e.key === 'Escape') {
|
|
1804
|
+
closeModal();
|
|
1805
|
+
document.removeEventListener('keydown', handleEscape);
|
|
1806
|
+
}
|
|
1807
|
+
}
|
|
1808
|
+
document.addEventListener('keydown', handleEscape);
|
|
1809
|
+
};
|