novahiz 0.1.1 → 0.2.3
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/NOTICE.md +10 -17
- package/README.md +311 -83
- package/adapters/README.md +3 -3
- package/adapters/opencode/agent/{novahiz-agent.md → novahiz.md} +6 -4
- package/adapters/opencode/commands/novahiz-doctor.md +1 -1
- package/adapters/opencode/commands/novahiz-init.md +10 -0
- package/adapters/opencode/instructions.md +5 -16
- package/adapters/opencode/novahiz.ts +337 -25
- package/bundled-skills/{skill-creator/LICENSE.txt → android-reverse-engineering/LICENSE} +5 -17
- package/bundled-skills/android-reverse-engineering/references/api-extraction-patterns.md +197 -0
- package/bundled-skills/android-reverse-engineering/references/call-flow-analysis.md +210 -0
- package/bundled-skills/android-reverse-engineering/references/fernflower-usage.md +115 -0
- package/bundled-skills/android-reverse-engineering/references/jadx-usage.md +116 -0
- package/bundled-skills/android-reverse-engineering/references/kotlin-name-recovery.md +108 -0
- package/bundled-skills/android-reverse-engineering/references/setup-guide.md +221 -0
- package/bundled-skills/android-reverse-engineering/references/third_party_hosts.txt +122 -0
- package/bundled-skills/android-reverse-engineering/scripts/check-deps.ps1 +165 -0
- package/bundled-skills/android-reverse-engineering/scripts/check-deps.sh +129 -0
- package/bundled-skills/android-reverse-engineering/scripts/decompile.ps1 +400 -0
- package/bundled-skills/android-reverse-engineering/scripts/decompile.sh +578 -0
- package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.ps1 +121 -0
- package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.sh +339 -0
- package/bundled-skills/android-reverse-engineering/scripts/fingerprint.sh +241 -0
- package/bundled-skills/android-reverse-engineering/scripts/install-dep.ps1 +345 -0
- package/bundled-skills/android-reverse-engineering/scripts/install-dep.sh +448 -0
- package/bundled-skills/android-reverse-engineering/scripts/lookup-name.sh +85 -0
- package/bundled-skills/android-reverse-engineering/scripts/recover-kotlin-names.sh +140 -0
- package/bundled-skills/memory-save/SKILL.md +2 -2
- package/catalog/categories.json +1093 -1030
- package/catalog/overrides.json +33 -201
- package/catalog/providers.json +29 -102
- package/catalog/rules.json +84 -80
- package/docs/ARCHITECTURE.md +69 -19
- package/docs/CATALOG.md +129 -0
- package/docs/CLASSIFICATION.md +129 -0
- package/docs/CLI.md +202 -0
- package/docs/CONFIGURATION.md +97 -0
- package/docs/CONSTITUTION.md +3 -3
- package/docs/EXECUTION.md +100 -53
- package/docs/GATE.md +177 -0
- package/docs/HARNESSES.md +2 -2
- package/docs/INSTALL.md +3 -3
- package/docs/PLUGIN.md +168 -0
- package/docs/PROVIDERS.md +10 -12
- package/docs/ROADMAPS.md +8 -8
- package/docs/RULES.md +21 -16
- package/docs/TOKENS.md +2 -2
- package/install/bootstrap.mjs +9 -12
- package/install/install.mjs +68 -53
- package/install/lib.mjs +15 -1
- package/install/uninstall.mjs +11 -11
- package/mcp/novahiz-tools/index.mjs +278 -45
- package/novahiz.config.example.json +0 -1
- package/package.json +17 -15
- package/skills/ai-security/SKILL.md +91 -323
- package/skills/ai-security/references/atlas-coverage.md +38 -128
- package/skills/ai-security/scripts/ai_threat_scanner.py +341 -532
- package/skills/anti-AI-design/SKILL.md +48 -165
- package/skills/apple-hig-audit/SKILL.md +64 -0
- package/skills/apple-hig-audit/references/accessibility.md +78 -0
- package/skills/apple-hig-audit/references/platform-specifics.md +57 -0
- package/skills/apple-hig-audit/references/visual-design.md +68 -0
- package/skills/apple-hig-audit/scripts/hig_checker.py +115 -0
- package/skills/apple-hig-audit/templates/hig-audit-template.md +114 -0
- package/skills/dependency-auditor/README.md +58 -484
- package/skills/dependency-auditor/SKILL.md +82 -53
- package/skills/dependency-auditor/references/dependency_management_best_practices.md +32 -629
- package/skills/dependency-auditor/references/license_compatibility_matrix.md +57 -238
- package/skills/dependency-auditor/references/vulnerability_assessment_guide.md +42 -441
- package/skills/dependency-auditor/scripts/dep_scanner.py +569 -768
- package/skills/dependency-auditor/scripts/license_checker.py +425 -979
- package/skills/dependency-auditor/scripts/upgrade_planner.py +463 -1002
- package/skills/design-system-tokens/SKILL.md +90 -0
- package/skills/design-system-tokens/assets/design_system_doc_template.md +129 -0
- package/skills/design-system-tokens/references/component-architecture.md +88 -0
- package/skills/design-system-tokens/references/developer-handoff.md +61 -0
- package/skills/design-system-tokens/references/responsive-calculations.md +72 -0
- package/skills/design-system-tokens/references/token-generation.md +62 -0
- package/skills/design-system-tokens/scripts/design_token_generator.py +315 -0
- package/skills/engineering-code-standards/SKILL.md +174 -0
- package/skills/env-secrets-manager/SKILL.md +67 -225
- package/skills/env-secrets-manager/references/secret-patterns.md +43 -28
- package/skills/env-secrets-manager/references/validation-detection-rotation.md +50 -332
- package/skills/env-secrets-manager/scripts/env_auditor.py +305 -110
- package/skills/frontend-design-taste/SKILL.md +62 -0
- package/skills/gate/SKILL.md +12 -2
- package/skills/mcp-server-builder/README.md +6 -14
- package/skills/mcp-server-builder/SKILL.md +93 -49
- package/skills/mcp-server-builder/references/production-hardening-guide.md +5 -3
- package/skills/mcp-server-builder/references/python-server-template.md +1 -1
- package/skills/mcp-server-builder/references/spec-compatibility.md +129 -0
- package/skills/mcp-server-builder/references/typescript-server-template.md +1 -1
- package/skills/mcp-server-builder/scripts/mcp_validator.py +3 -9
- package/skills/mcp-server-builder/scripts/openapi_to_mcp.py +3 -8
- package/skills/memory/SKILL.md +11 -3
- package/skills/novahiz-analyse/SKILL.md +19 -15
- package/skills/novahiz-assess-decide/SKILL.md +81 -0
- package/skills/novahiz-assess-define/SKILL.md +78 -0
- package/skills/novahiz-assess-intake/SKILL.md +90 -0
- package/skills/novahiz-assess-research/SKILL.md +79 -0
- package/skills/novahiz-assess-shape/SKILL.md +79 -0
- package/skills/novahiz-audit/SKILL.md +52 -54
- package/skills/novahiz-browser/SKILL.md +56 -0
- package/skills/novahiz-clarify/SKILL.md +38 -35
- package/skills/novahiz-code-review/SKILL.md +86 -0
- package/skills/novahiz-converge/SKILL.md +30 -26
- package/skills/novahiz-delta-review/SKILL.md +87 -0
- package/skills/novahiz-docs/SKILL.md +79 -0
- package/skills/novahiz-docs/templates/ARCHITECTURE.md +49 -0
- package/skills/novahiz-docs/templates/CONVENTIONS.md +50 -0
- package/skills/novahiz-docs/templates/DECISIONS.md +28 -0
- package/skills/novahiz-docs/templates/STANDARDS.md +48 -0
- package/skills/novahiz-gate/SKILL.md +27 -31
- package/skills/novahiz-humanizer/SKILL.md +617 -0
- package/skills/novahiz-implement/SKILL.md +27 -23
- package/skills/novahiz-init/SKILL.md +112 -0
- package/skills/novahiz-memory/SKILL.md +29 -27
- package/skills/novahiz-plan/SKILL.md +42 -38
- package/skills/novahiz-planner/SKILL.md +21 -16
- package/skills/novahiz-postgres/SKILL.md +100 -0
- package/skills/novahiz-security/SKILL.md +228 -0
- package/skills/novahiz-supabase/SKILL.md +177 -0
- package/skills/novahiz-task/SKILL.md +34 -30
- package/skills/novahiz-wcag-audit/SKILL.md +79 -0
- package/skills/novahiz-wcag-audit/references/findings.example.json +36 -0
- package/skills/novahiz-wcag-audit/references/report-template.md +55 -0
- package/skills/novahiz-wcag-audit/references/wcag22-aa.md +153 -0
- package/skills/novahiz-wcag-audit/scripts/contrast.mjs +140 -0
- package/skills/novahiz-wcag-audit/scripts/report.mjs +141 -0
- package/skills/novahiz-web-extract/SKILL.md +175 -0
- package/skills/playwright-agent/SKILL.md +39 -34
- package/skills/prompt-rewriter/SKILL.md +85 -0
- package/skills/skill-creator/LICENSE.txt +11 -199
- package/skills/skill-creator/SKILL.md +166 -180
- package/skills/skill-creator/agents/analyzer.md +1 -1
- package/skills/skill-creator/agents/grader.md +8 -8
- package/skills/skill-creator/assets/eval_review.html +20 -23
- package/skills/skill-creator/eval-viewer/generate_review.py +2 -2
- package/skills/skill-creator/eval-viewer/viewer.html +34 -38
- package/skills/skill-creator/references/schemas.md +2 -2
- package/skills/skill-creator/scripts/aggregate_benchmark.py +6 -6
- package/skills/skill-creator/scripts/generate_report.py +27 -31
- package/skills/skill-creator/scripts/improve_description.py +10 -10
- package/skills/skill-creator/scripts/package_skill.py +8 -8
- package/skills/skill-creator/scripts/run_eval.py +6 -6
- package/skills/write-a-skill/SKILL.md +48 -78
- package/skills/write-a-skill/references/companion_tooling.md +18 -24
- package/skills/write-a-skill/references/description_design_patterns.md +36 -39
- package/skills/write-a-skill/references/progressive_disclosure_principles.md +31 -33
- package/skills/write-a-skill/references/quality_gates_for_skills.md +27 -27
- package/skills/write-a-skill/scripts/skill_description_validator.py +12 -26
- package/skills/write-a-skill/scripts/skill_review_checklist_runner.py +10 -21
- package/skills/write-a-skill/scripts/skill_structure_validator.py +13 -25
- package/src/autodocs.ts +192 -0
- package/src/catalog.ts +18 -4
- package/src/classify.ts +42 -5
- package/src/cli.ts +43 -11
- package/src/commands/autodocs.ts +250 -0
- package/src/commands/clean.ts +26 -20
- package/src/commands/context.ts +11 -5
- package/src/commands/doctor.ts +70 -35
- package/src/commands/gate.ts +98 -60
- package/src/commands/graft.ts +160 -0
- package/src/commands/init.ts +356 -0
- package/src/commands/inspect.ts +35 -9
- package/src/commands/report.ts +20 -12
- package/src/commands/task.ts +35 -14
- package/src/commands/tokens.ts +5 -5
- package/src/complexity.ts +305 -0
- package/src/content.ts +28 -3
- package/src/db.ts +44 -7
- package/src/gate.ts +401 -261
- package/src/graft.ts +221 -0
- package/src/ledger.ts +140 -48
- package/src/memory.ts +502 -0
- package/src/prompt-rewriter.ts +170 -0
- package/src/providers.ts +7 -0
- package/src/render.ts +1 -1
- package/src/spec.ts +18 -7
- package/src/targets.ts +61 -4
- package/bundled-skills/AGENTS.md +0 -50
- package/bundled-skills/LICENSE +0 -21
- package/bundled-skills/README.md +0 -202
- package/bundled-skills/a11y-audit/SKILL.md +0 -211
- package/bundled-skills/a11y-audit/assets/sample-component.tsx +0 -51
- package/bundled-skills/a11y-audit/expected_outputs/sample-contrast-output.txt +0 -39
- package/bundled-skills/a11y-audit/expected_outputs/sample-scan-output.json +0 -34
- package/bundled-skills/a11y-audit/expected_outputs/sample-scan-report.md +0 -63
- package/bundled-skills/a11y-audit/references/aria-patterns.md +0 -223
- package/bundled-skills/a11y-audit/references/audit-report-template.md +0 -46
- package/bundled-skills/a11y-audit/references/ci-cd-integration.md +0 -127
- package/bundled-skills/a11y-audit/references/color-contrast-guide.md +0 -83
- package/bundled-skills/a11y-audit/references/examples-by-framework.md +0 -312
- package/bundled-skills/a11y-audit/references/framework-a11y-patterns.md +0 -661
- package/bundled-skills/a11y-audit/references/testing-checklist.md +0 -41
- package/bundled-skills/a11y-audit/references/wcag-22-new-criteria.md +0 -79
- package/bundled-skills/a11y-audit/references/wcag-quick-ref.md +0 -113
- package/bundled-skills/a11y-audit/scripts/a11y_scanner.py +0 -684
- package/bundled-skills/a11y-audit/scripts/contrast_checker.py +0 -504
- package/bundled-skills/adversarial-reviewer/SKILL.md +0 -247
- package/bundled-skills/anti-AI-design/SKILL.md +0 -189
- package/bundled-skills/anti-pattern-detector/SKILL.md +0 -185
- package/bundled-skills/anti-pattern-detector/references/async-network-patterns.md +0 -581
- package/bundled-skills/anti-pattern-detector/references/build-deploy-patterns.md +0 -554
- package/bundled-skills/anti-pattern-detector/references/cache-patterns.md +0 -446
- package/bundled-skills/anti-pattern-detector/references/cloud-infra-patterns.md +0 -538
- package/bundled-skills/anti-pattern-detector/references/concurrency-patterns.md +0 -558
- package/bundled-skills/anti-pattern-detector/references/language-specific-patterns.md +0 -740
- package/bundled-skills/anti-pattern-detector/references/monitoring-patterns.md +0 -456
- package/bundled-skills/api-design-reviewer/SKILL.md +0 -433
- package/bundled-skills/api-design-reviewer/references/api_antipatterns.md +0 -680
- package/bundled-skills/api-design-reviewer/references/rest_design_rules.md +0 -487
- package/bundled-skills/api-design-reviewer/scripts/api_linter.py +0 -956
- package/bundled-skills/api-design-reviewer/scripts/api_scorecard.py +0 -1661
- package/bundled-skills/api-design-reviewer/scripts/breaking_change_detector.py +0 -1102
- package/bundled-skills/apple-hig-expert/SKILL.md +0 -108
- package/bundled-skills/apple-hig-expert/references/accessibility.md +0 -55
- package/bundled-skills/apple-hig-expert/references/platform-specifics.md +0 -48
- package/bundled-skills/apple-hig-expert/references/visual-design.md +0 -69
- package/bundled-skills/apple-hig-expert/scripts/hig_checker.py +0 -97
- package/bundled-skills/apple-hig-expert/templates/hig-audit-template.md +0 -83
- package/bundled-skills/clean-code/SKILL.md +0 -99
- package/bundled-skills/code-reviewer/README.md +0 -92
- package/bundled-skills/code-reviewer/SKILL.md +0 -183
- package/bundled-skills/code-reviewer/assets/sample_c_clean.c +0 -71
- package/bundled-skills/code-reviewer/assets/sample_c_smells.c +0 -66
- package/bundled-skills/code-reviewer/assets/sample_csharp_clean.cs +0 -100
- package/bundled-skills/code-reviewer/assets/sample_csharp_smells.cs +0 -78
- package/bundled-skills/code-reviewer/assets/sample_java_clean.java +0 -55
- package/bundled-skills/code-reviewer/assets/sample_java_smells.java +0 -56
- package/bundled-skills/code-reviewer/expected_outputs/sample_c_clean_quality.json +0 -65
- package/bundled-skills/code-reviewer/expected_outputs/sample_c_smells_quality.json +0 -155
- package/bundled-skills/code-reviewer/expected_outputs/sample_csharp_clean_quality.json +0 -135
- package/bundled-skills/code-reviewer/expected_outputs/sample_csharp_smells_quality.json +0 -143
- package/bundled-skills/code-reviewer/expected_outputs/sample_java_clean_quality.json +0 -53
- package/bundled-skills/code-reviewer/expected_outputs/sample_java_smells_quality.json +0 -83
- package/bundled-skills/code-reviewer/languages/c.md +0 -103
- package/bundled-skills/code-reviewer/languages/cpp.md +0 -103
- package/bundled-skills/code-reviewer/languages/csharp.md +0 -97
- package/bundled-skills/code-reviewer/languages/dart.md +0 -108
- package/bundled-skills/code-reviewer/languages/go.md +0 -92
- package/bundled-skills/code-reviewer/languages/java.md +0 -103
- package/bundled-skills/code-reviewer/languages/kotlin.md +0 -88
- package/bundled-skills/code-reviewer/languages/php.md +0 -109
- package/bundled-skills/code-reviewer/languages/python.md +0 -94
- package/bundled-skills/code-reviewer/languages/ruby.md +0 -105
- package/bundled-skills/code-reviewer/languages/rust.md +0 -99
- package/bundled-skills/code-reviewer/languages/swift.md +0 -88
- package/bundled-skills/code-reviewer/languages/typescript.md +0 -97
- package/bundled-skills/code-reviewer/rules/universal.md +0 -49
- package/bundled-skills/code-reviewer/scripts/code_quality_checker.py +0 -1020
- package/bundled-skills/code-reviewer/scripts/pr_analyzer.py +0 -535
- package/bundled-skills/code-reviewer/scripts/review_report_generator.py +0 -505
- package/bundled-skills/code-understand/SKILL.md +0 -90
- package/bundled-skills/database-designer/README.md +0 -388
- package/bundled-skills/database-designer/SKILL.md +0 -314
- package/bundled-skills/database-designer/assets/sample_query_patterns.json +0 -375
- package/bundled-skills/database-designer/assets/sample_schema.json +0 -372
- package/bundled-skills/database-designer/assets/sample_schema.sql +0 -207
- package/bundled-skills/database-designer/expected_outputs/index_optimization_sample.txt +0 -60
- package/bundled-skills/database-designer/expected_outputs/migration_sample.txt +0 -124
- package/bundled-skills/database-designer/expected_outputs/schema_analysis_sample.txt +0 -222
- package/bundled-skills/database-designer/index_optimizer.py +0 -926
- package/bundled-skills/database-designer/migration_generator.py +0 -1199
- package/bundled-skills/database-designer/references/database-design-reference.md +0 -476
- package/bundled-skills/database-designer/references/database_selection_decision_tree.md +0 -373
- package/bundled-skills/database-designer/references/index_strategy_patterns.md +0 -424
- package/bundled-skills/database-designer/references/normalization_guide.md +0 -354
- package/bundled-skills/database-designer/schema_analyzer.py +0 -982
- package/bundled-skills/defuddle/SKILL.md +0 -41
- package/bundled-skills/dependency-auditor/README.md +0 -524
- package/bundled-skills/dependency-auditor/SKILL.md +0 -85
- package/bundled-skills/dependency-auditor/assets/sample_go.mod +0 -53
- package/bundled-skills/dependency-auditor/assets/sample_package.json +0 -72
- package/bundled-skills/dependency-auditor/assets/sample_requirements.txt +0 -71
- package/bundled-skills/dependency-auditor/expected_outputs/sample_license_report.txt +0 -37
- package/bundled-skills/dependency-auditor/expected_outputs/sample_upgrade_plan.txt +0 -59
- package/bundled-skills/dependency-auditor/expected_outputs/sample_vulnerability_report.json +0 -71
- package/bundled-skills/dependency-auditor/references/dependency_management_best_practices.md +0 -643
- package/bundled-skills/dependency-auditor/references/license_compatibility_matrix.md +0 -238
- package/bundled-skills/dependency-auditor/references/vulnerability_assessment_guide.md +0 -461
- package/bundled-skills/dependency-auditor/scripts/dep_scanner.py +0 -794
- package/bundled-skills/dependency-auditor/scripts/license_checker.py +0 -996
- package/bundled-skills/dependency-auditor/scripts/upgrade_planner.py +0 -1029
- package/bundled-skills/dependency-auditor/test-inventory.json +0 -421
- package/bundled-skills/dependency-auditor/test-project/package.json +0 -72
- package/bundled-skills/design-taste-frontend/SKILL.md +0 -247
- package/bundled-skills/engineering-standards/SKILL.md +0 -736
- package/bundled-skills/env-secrets-manager/SKILL.md +0 -260
- package/bundled-skills/env-secrets-manager/references/secret-patterns.md +0 -41
- package/bundled-skills/env-secrets-manager/references/validation-detection-rotation.md +0 -358
- package/bundled-skills/env-secrets-manager/scripts/env_auditor.py +0 -145
- package/bundled-skills/fix/SKILL.md +0 -113
- package/bundled-skills/fix/flaky-taxonomy.md +0 -134
- package/bundled-skills/gate/SKILL.md +0 -13
- package/bundled-skills/humanizer/SKILL.md +0 -374
- package/bundled-skills/impeccable/SKILL.md +0 -89
- package/bundled-skills/impeccable/reference/adapt.md +0 -312
- package/bundled-skills/impeccable/reference/adapt.native.md +0 -58
- package/bundled-skills/impeccable/reference/android.md +0 -46
- package/bundled-skills/impeccable/reference/animate.md +0 -89
- package/bundled-skills/impeccable/reference/audit.md +0 -136
- package/bundled-skills/impeccable/reference/audit.native.md +0 -139
- package/bundled-skills/impeccable/reference/bolder.md +0 -33
- package/bundled-skills/impeccable/reference/clarify.md +0 -94
- package/bundled-skills/impeccable/reference/colorize.md +0 -86
- package/bundled-skills/impeccable/reference/craft-floor.md +0 -44
- package/bundled-skills/impeccable/reference/craft.md +0 -5
- package/bundled-skills/impeccable/reference/critique.md +0 -806
- package/bundled-skills/impeccable/reference/degraded/asset-producer.md +0 -37
- package/bundled-skills/impeccable/reference/degraded/documenter.md +0 -24
- package/bundled-skills/impeccable/reference/degraded/finish-reviewer.md +0 -38
- package/bundled-skills/impeccable/reference/degraded/manual-edit-applier.md +0 -92
- package/bundled-skills/impeccable/reference/delight.md +0 -70
- package/bundled-skills/impeccable/reference/distill.md +0 -111
- package/bundled-skills/impeccable/reference/doctor.md +0 -54
- package/bundled-skills/impeccable/reference/document.md +0 -416
- package/bundled-skills/impeccable/reference/extract.md +0 -69
- package/bundled-skills/impeccable/reference/harden.md +0 -336
- package/bundled-skills/impeccable/reference/hooks.md +0 -111
- package/bundled-skills/impeccable/reference/init.md +0 -131
- package/bundled-skills/impeccable/reference/ios.md +0 -51
- package/bundled-skills/impeccable/reference/layout.md +0 -84
- package/bundled-skills/impeccable/reference/live-setup.md +0 -104
- package/bundled-skills/impeccable/reference/live.md +0 -325
- package/bundled-skills/impeccable/reference/new-work.md +0 -145
- package/bundled-skills/impeccable/reference/onboard.md +0 -234
- package/bundled-skills/impeccable/reference/operate.md +0 -61
- package/bundled-skills/impeccable/reference/optimize.md +0 -258
- package/bundled-skills/impeccable/reference/overdrive.md +0 -127
- package/bundled-skills/impeccable/reference/polish.md +0 -105
- package/bundled-skills/impeccable/reference/quieter.md +0 -99
- package/bundled-skills/impeccable/reference/routing.md +0 -24
- package/bundled-skills/impeccable/reference/shape.md +0 -59
- package/bundled-skills/impeccable/reference/typeset.md +0 -80
- package/bundled-skills/impeccable/reference/visualize.md +0 -46
- package/bundled-skills/impeccable/scripts/VERSION +0 -1
- package/bundled-skills/impeccable/scripts/bin/windows-x64/impeccable.exe +0 -0
- package/bundled-skills/impeccable/scripts/command-metadata.json +0 -94
- package/bundled-skills/impeccable/scripts/data/font-index-failures.json +0 -121
- package/bundled-skills/impeccable/scripts/data/font-index.json +0 -1
- package/bundled-skills/impeccable/scripts/impeccable +0 -206
- package/bundled-skills/impeccable/scripts/impeccable.cmd +0 -214
- package/bundled-skills/impeccable/scripts/live-browser-dom.js +0 -167
- package/bundled-skills/impeccable/scripts/live-browser-ignores.js +0 -242
- package/bundled-skills/impeccable/scripts/live-browser-session.js +0 -144
- package/bundled-skills/impeccable/scripts/live-browser.js +0 -12990
- package/bundled-skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
- package/bundled-skills/mcp-server-builder/README.md +0 -50
- package/bundled-skills/mcp-server-builder/SKILL.md +0 -100
- package/bundled-skills/mcp-server-builder/references/openapi-extraction-guide.md +0 -34
- package/bundled-skills/mcp-server-builder/references/production-hardening-guide.md +0 -78
- package/bundled-skills/mcp-server-builder/references/python-server-template.md +0 -22
- package/bundled-skills/mcp-server-builder/references/typescript-server-template.md +0 -19
- package/bundled-skills/mcp-server-builder/references/validation-checklist.md +0 -30
- package/bundled-skills/mcp-server-builder/scripts/mcp_validator.py +0 -186
- package/bundled-skills/mcp-server-builder/scripts/openapi_to_mcp.py +0 -284
- package/bundled-skills/memory/SKILL.md +0 -10
- package/bundled-skills/migrate/SKILL.md +0 -135
- package/bundled-skills/migrate/cypress-mapping.md +0 -79
- package/bundled-skills/migrate/selenium-mapping.md +0 -94
- package/bundled-skills/novahiz-analyse/SKILL.md +0 -74
- package/bundled-skills/novahiz-audit/SKILL.md +0 -75
- package/bundled-skills/novahiz-clarify/SKILL.md +0 -94
- package/bundled-skills/novahiz-converge/SKILL.md +0 -76
- package/bundled-skills/novahiz-gate/SKILL.md +0 -82
- package/bundled-skills/novahiz-implement/SKILL.md +0 -80
- package/bundled-skills/novahiz-memory/SKILL.md +0 -58
- package/bundled-skills/novahiz-plan/SKILL.md +0 -100
- package/bundled-skills/novahiz-planner/SKILL.md +0 -104
- package/bundled-skills/novahiz-task/SKILL.md +0 -105
- package/bundled-skills/playwright-agent/SKILL.md +0 -142
- package/bundled-skills/postgresql-optimization/SKILL.md +0 -179
- package/bundled-skills/review-changes/SKILL.md +0 -30
- package/bundled-skills/security-guidance/SKILL.md +0 -161
- package/bundled-skills/security-guidance/references/pretooluse_hook_canon.md +0 -141
- package/bundled-skills/senior-architect/SKILL.md +0 -343
- package/bundled-skills/senior-architect/references/architecture_patterns.md +0 -470
- package/bundled-skills/senior-architect/references/system_design_workflows.md +0 -536
- package/bundled-skills/senior-architect/references/tech_decision_guide.md +0 -412
- package/bundled-skills/senior-architect/scripts/architecture_diagram_generator.py +0 -660
- package/bundled-skills/senior-architect/scripts/dependency_analyzer.py +0 -615
- package/bundled-skills/senior-architect/scripts/project_architect.py +0 -749
- package/bundled-skills/senior-backend/SKILL.md +0 -467
- package/bundled-skills/senior-backend/profiles/django-monolith.json +0 -57
- package/bundled-skills/senior-backend/profiles/fastapi-python.json +0 -58
- package/bundled-skills/senior-backend/profiles/go-or-rust-microservice.json +0 -62
- package/bundled-skills/senior-backend/profiles/node-express.json +0 -57
- package/bundled-skills/senior-backend/references/api_design_patterns.md +0 -530
- package/bundled-skills/senior-backend/references/backend_security_practices.md +0 -1075
- package/bundled-skills/senior-backend/references/composition_map.md +0 -58
- package/bundled-skills/senior-backend/references/database_optimization_guide.md +0 -593
- package/bundled-skills/senior-backend/references/forcing_questions.md +0 -100
- package/bundled-skills/senior-backend/scripts/api_load_tester.py +0 -607
- package/bundled-skills/senior-backend/scripts/api_scaffolder.py +0 -645
- package/bundled-skills/senior-backend/scripts/backend_decision_engine.py +0 -397
- package/bundled-skills/senior-backend/scripts/database_migration_tool.py +0 -858
- package/bundled-skills/skill-creator/SKILL.md +0 -485
- package/bundled-skills/skill-creator/agents/analyzer.md +0 -274
- package/bundled-skills/skill-creator/agents/comparator.md +0 -202
- package/bundled-skills/skill-creator/agents/grader.md +0 -223
- package/bundled-skills/skill-creator/assets/eval_review.html +0 -146
- package/bundled-skills/skill-creator/eval-viewer/generate_review.py +0 -471
- package/bundled-skills/skill-creator/eval-viewer/viewer.html +0 -1325
- package/bundled-skills/skill-creator/references/schemas.md +0 -430
- package/bundled-skills/skill-creator/scripts/__init__.py +0 -0
- package/bundled-skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/bundled-skills/skill-creator/scripts/generate_report.py +0 -326
- package/bundled-skills/skill-creator/scripts/improve_description.py +0 -247
- package/bundled-skills/skill-creator/scripts/package_skill.py +0 -136
- package/bundled-skills/skill-creator/scripts/quick_validate.py +0 -103
- package/bundled-skills/skill-creator/scripts/run_eval.py +0 -310
- package/bundled-skills/skill-creator/scripts/run_loop.py +0 -328
- package/bundled-skills/skill-creator/scripts/utils.py +0 -47
- package/bundled-skills/spec-driven-workflow/SKILL.md +0 -333
- package/bundled-skills/spec-driven-workflow/references/acceptance_criteria_patterns.md +0 -497
- package/bundled-skills/spec-driven-workflow/references/bounded_autonomy_rules.md +0 -273
- package/bundled-skills/spec-driven-workflow/references/spec_format_guide.md +0 -531
- package/bundled-skills/spec-driven-workflow/scripts/spec_generator.py +0 -338
- package/bundled-skills/spec-driven-workflow/scripts/spec_validator.py +0 -461
- package/bundled-skills/spec-driven-workflow/scripts/test_extractor.py +0 -431
- package/bundled-skills/supabase/CHANGELOG.md +0 -78
- package/bundled-skills/supabase/SKILL.md +0 -149
- package/bundled-skills/supabase/assets/feedback-issue-template.md +0 -17
- package/bundled-skills/supabase/references/skill-feedback.md +0 -17
- package/bundled-skills/supabase-postgres-best-practices/CHANGELOG.md +0 -73
- package/bundled-skills/supabase-postgres-best-practices/SKILL.md +0 -64
- package/bundled-skills/supabase-postgres-best-practices/references/_contributing.md +0 -170
- package/bundled-skills/supabase-postgres-best-practices/references/_sections.md +0 -39
- package/bundled-skills/supabase-postgres-best-practices/references/_template.md +0 -34
- package/bundled-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +0 -55
- package/bundled-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +0 -49
- package/bundled-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +0 -46
- package/bundled-skills/supabase-postgres-best-practices/references/conn-limits.md +0 -44
- package/bundled-skills/supabase-postgres-best-practices/references/conn-pooling.md +0 -41
- package/bundled-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +0 -46
- package/bundled-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +0 -54
- package/bundled-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +0 -53
- package/bundled-skills/supabase-postgres-best-practices/references/data-pagination.md +0 -50
- package/bundled-skills/supabase-postgres-best-practices/references/data-upsert.md +0 -50
- package/bundled-skills/supabase-postgres-best-practices/references/lock-advisory.md +0 -56
- package/bundled-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +0 -68
- package/bundled-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +0 -50
- package/bundled-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +0 -54
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +0 -45
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +0 -55
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +0 -55
- package/bundled-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +0 -44
- package/bundled-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +0 -40
- package/bundled-skills/supabase-postgres-best-practices/references/query-index-types.md +0 -48
- package/bundled-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +0 -43
- package/bundled-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +0 -45
- package/bundled-skills/supabase-postgres-best-practices/references/schema-constraints.md +0 -80
- package/bundled-skills/supabase-postgres-best-practices/references/schema-data-types.md +0 -46
- package/bundled-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +0 -59
- package/bundled-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +0 -55
- package/bundled-skills/supabase-postgres-best-practices/references/schema-partitioning.md +0 -55
- package/bundled-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +0 -61
- package/bundled-skills/supabase-postgres-best-practices/references/security-privileges.md +0 -54
- package/bundled-skills/supabase-postgres-best-practices/references/security-rls-basics.md +0 -50
- package/bundled-skills/supabase-postgres-best-practices/references/security-rls-performance.md +0 -63
- package/bundled-skills/typescript-expert/SKILL.md +0 -431
- package/bundled-skills/typescript-expert/references/tsconfig-strict.json +0 -45
- package/bundled-skills/typescript-expert/references/typescript-cheatsheet.md +0 -383
- package/bundled-skills/typescript-expert/references/utility-types.ts +0 -335
- package/bundled-skills/typescript-expert/scripts/ts_diagnostic.py +0 -203
- package/bundled-skills/ui-design-system/SKILL.md +0 -379
- package/bundled-skills/ui-design-system/assets/design_system_doc_template.md +0 -180
- package/bundled-skills/ui-design-system/references/component-architecture.md +0 -396
- package/bundled-skills/ui-design-system/references/developer-handoff.md +0 -509
- package/bundled-skills/ui-design-system/references/responsive-calculations.md +0 -390
- package/bundled-skills/ui-design-system/references/token-generation.md +0 -324
- package/bundled-skills/ui-design-system/scripts/design_token_generator.py +0 -590
- package/bundled-skills/write-a-skill/SKILL.md +0 -141
- package/bundled-skills/write-a-skill/references/companion_tooling.md +0 -67
- package/bundled-skills/write-a-skill/references/description_design_patterns.md +0 -139
- package/bundled-skills/write-a-skill/references/progressive_disclosure_principles.md +0 -89
- package/bundled-skills/write-a-skill/references/quality_gates_for_skills.md +0 -158
- package/bundled-skills/write-a-skill/scripts/skill_description_validator.py +0 -255
- package/bundled-skills/write-a-skill/scripts/skill_review_checklist_runner.py +0 -268
- package/bundled-skills/write-a-skill/scripts/skill_structure_validator.py +0 -277
- package/bundled-skills/zero-hallucination-coder/SKILL.md +0 -271
- package/skills/a11y-audit/SKILL.md +0 -211
- package/skills/a11y-audit/assets/sample-component.tsx +0 -51
- package/skills/a11y-audit/expected_outputs/sample-contrast-output.txt +0 -39
- package/skills/a11y-audit/expected_outputs/sample-scan-output.json +0 -34
- package/skills/a11y-audit/expected_outputs/sample-scan-report.md +0 -63
- package/skills/a11y-audit/references/aria-patterns.md +0 -223
- package/skills/a11y-audit/references/audit-report-template.md +0 -46
- package/skills/a11y-audit/references/ci-cd-integration.md +0 -127
- package/skills/a11y-audit/references/color-contrast-guide.md +0 -83
- package/skills/a11y-audit/references/examples-by-framework.md +0 -312
- package/skills/a11y-audit/references/framework-a11y-patterns.md +0 -661
- package/skills/a11y-audit/references/testing-checklist.md +0 -41
- package/skills/a11y-audit/references/wcag-22-new-criteria.md +0 -79
- package/skills/a11y-audit/references/wcag-quick-ref.md +0 -113
- package/skills/a11y-audit/scripts/a11y_scanner.py +0 -684
- package/skills/a11y-audit/scripts/contrast_checker.py +0 -504
- package/skills/adversarial-reviewer/SKILL.md +0 -247
- package/skills/anti-pattern-detector/SKILL.md +0 -185
- package/skills/anti-pattern-detector/references/async-network-patterns.md +0 -581
- package/skills/anti-pattern-detector/references/build-deploy-patterns.md +0 -554
- package/skills/anti-pattern-detector/references/cache-patterns.md +0 -446
- package/skills/anti-pattern-detector/references/cloud-infra-patterns.md +0 -538
- package/skills/anti-pattern-detector/references/concurrency-patterns.md +0 -558
- package/skills/anti-pattern-detector/references/language-specific-patterns.md +0 -740
- package/skills/anti-pattern-detector/references/monitoring-patterns.md +0 -456
- package/skills/api-design-reviewer/SKILL.md +0 -433
- package/skills/api-design-reviewer/references/api_antipatterns.md +0 -680
- package/skills/api-design-reviewer/references/rest_design_rules.md +0 -487
- package/skills/api-design-reviewer/scripts/api_linter.py +0 -956
- package/skills/api-design-reviewer/scripts/api_scorecard.py +0 -1661
- package/skills/api-design-reviewer/scripts/breaking_change_detector.py +0 -1102
- package/skills/apple-hig-expert/SKILL.md +0 -108
- package/skills/apple-hig-expert/references/accessibility.md +0 -55
- package/skills/apple-hig-expert/references/platform-specifics.md +0 -48
- package/skills/apple-hig-expert/references/visual-design.md +0 -69
- package/skills/apple-hig-expert/scripts/hig_checker.py +0 -97
- package/skills/apple-hig-expert/templates/hig-audit-template.md +0 -83
- package/skills/clean-code/SKILL.md +0 -99
- package/skills/code-reviewer/README.md +0 -92
- package/skills/code-reviewer/SKILL.md +0 -183
- package/skills/code-reviewer/assets/sample_c_clean.c +0 -71
- package/skills/code-reviewer/assets/sample_c_smells.c +0 -66
- package/skills/code-reviewer/assets/sample_csharp_clean.cs +0 -100
- package/skills/code-reviewer/assets/sample_csharp_smells.cs +0 -78
- package/skills/code-reviewer/assets/sample_java_clean.java +0 -55
- package/skills/code-reviewer/assets/sample_java_smells.java +0 -56
- package/skills/code-reviewer/expected_outputs/sample_c_clean_quality.json +0 -65
- package/skills/code-reviewer/expected_outputs/sample_c_smells_quality.json +0 -155
- package/skills/code-reviewer/expected_outputs/sample_csharp_clean_quality.json +0 -135
- package/skills/code-reviewer/expected_outputs/sample_csharp_smells_quality.json +0 -143
- package/skills/code-reviewer/expected_outputs/sample_java_clean_quality.json +0 -53
- package/skills/code-reviewer/expected_outputs/sample_java_smells_quality.json +0 -83
- package/skills/code-reviewer/languages/c.md +0 -103
- package/skills/code-reviewer/languages/cpp.md +0 -103
- package/skills/code-reviewer/languages/csharp.md +0 -97
- package/skills/code-reviewer/languages/dart.md +0 -108
- package/skills/code-reviewer/languages/go.md +0 -92
- package/skills/code-reviewer/languages/java.md +0 -103
- package/skills/code-reviewer/languages/kotlin.md +0 -88
- package/skills/code-reviewer/languages/php.md +0 -109
- package/skills/code-reviewer/languages/python.md +0 -94
- package/skills/code-reviewer/languages/ruby.md +0 -105
- package/skills/code-reviewer/languages/rust.md +0 -99
- package/skills/code-reviewer/languages/swift.md +0 -88
- package/skills/code-reviewer/languages/typescript.md +0 -97
- package/skills/code-reviewer/rules/universal.md +0 -49
- package/skills/code-reviewer/scripts/code_quality_checker.py +0 -1020
- package/skills/code-reviewer/scripts/pr_analyzer.py +0 -535
- package/skills/code-reviewer/scripts/review_report_generator.py +0 -505
- package/skills/code-understand/SKILL.md +0 -90
- package/skills/database-designer/README.md +0 -388
- package/skills/database-designer/SKILL.md +0 -314
- package/skills/database-designer/assets/sample_query_patterns.json +0 -375
- package/skills/database-designer/assets/sample_schema.json +0 -372
- package/skills/database-designer/assets/sample_schema.sql +0 -207
- package/skills/database-designer/expected_outputs/index_optimization_sample.txt +0 -60
- package/skills/database-designer/expected_outputs/migration_sample.txt +0 -124
- package/skills/database-designer/expected_outputs/schema_analysis_sample.txt +0 -222
- package/skills/database-designer/index_optimizer.py +0 -926
- package/skills/database-designer/migration_generator.py +0 -1199
- package/skills/database-designer/references/database-design-reference.md +0 -476
- package/skills/database-designer/references/database_selection_decision_tree.md +0 -373
- package/skills/database-designer/references/index_strategy_patterns.md +0 -424
- package/skills/database-designer/references/normalization_guide.md +0 -354
- package/skills/database-designer/schema_analyzer.py +0 -982
- package/skills/defuddle/SKILL.md +0 -41
- package/skills/design-taste-frontend/SKILL.md +0 -247
- package/skills/engineering-standards/SKILL.md +0 -736
- package/skills/fix/SKILL.md +0 -113
- package/skills/fix/flaky-taxonomy.md +0 -134
- package/skills/humanizer/SKILL.md +0 -374
- package/skills/migrate/SKILL.md +0 -135
- package/skills/migrate/cypress-mapping.md +0 -79
- package/skills/migrate/selenium-mapping.md +0 -94
- package/skills/postgresql-optimization/SKILL.md +0 -179
- package/skills/review-changes/SKILL.md +0 -30
- package/skills/security-guidance/SKILL.md +0 -160
- package/skills/security-guidance/references/pretooluse_hook_canon.md +0 -141
- package/skills/senior-architect/SKILL.md +0 -343
- package/skills/senior-architect/references/architecture_patterns.md +0 -470
- package/skills/senior-architect/references/system_design_workflows.md +0 -536
- package/skills/senior-architect/references/tech_decision_guide.md +0 -412
- package/skills/senior-architect/scripts/architecture_diagram_generator.py +0 -660
- package/skills/senior-architect/scripts/dependency_analyzer.py +0 -615
- package/skills/senior-architect/scripts/project_architect.py +0 -749
- package/skills/senior-backend/SKILL.md +0 -467
- package/skills/senior-backend/profiles/django-monolith.json +0 -57
- package/skills/senior-backend/profiles/fastapi-python.json +0 -58
- package/skills/senior-backend/profiles/go-or-rust-microservice.json +0 -62
- package/skills/senior-backend/profiles/node-express.json +0 -57
- package/skills/senior-backend/references/api_design_patterns.md +0 -530
- package/skills/senior-backend/references/backend_security_practices.md +0 -1075
- package/skills/senior-backend/references/composition_map.md +0 -58
- package/skills/senior-backend/references/database_optimization_guide.md +0 -593
- package/skills/senior-backend/references/forcing_questions.md +0 -100
- package/skills/senior-backend/scripts/api_load_tester.py +0 -607
- package/skills/senior-backend/scripts/api_scaffolder.py +0 -645
- package/skills/senior-backend/scripts/backend_decision_engine.py +0 -397
- package/skills/senior-backend/scripts/database_migration_tool.py +0 -858
- package/skills/senior-secops/SKILL.md +0 -505
- package/skills/senior-secops/references/compliance_requirements.md +0 -792
- package/skills/senior-secops/references/security_standards.md +0 -718
- package/skills/senior-secops/references/vulnerability_management_guide.md +0 -487
- package/skills/senior-secops/scripts/compliance_checker.py +0 -1107
- package/skills/senior-secops/scripts/security_scanner.py +0 -471
- package/skills/senior-secops/scripts/vulnerability_assessor.py +0 -563
- package/skills/spec-driven-workflow/SKILL.md +0 -333
- package/skills/spec-driven-workflow/references/acceptance_criteria_patterns.md +0 -497
- package/skills/spec-driven-workflow/references/bounded_autonomy_rules.md +0 -273
- package/skills/spec-driven-workflow/references/spec_format_guide.md +0 -531
- package/skills/spec-driven-workflow/scripts/spec_generator.py +0 -338
- package/skills/spec-driven-workflow/scripts/spec_validator.py +0 -461
- package/skills/spec-driven-workflow/scripts/test_extractor.py +0 -431
- package/skills/supabase/CHANGELOG.md +0 -78
- package/skills/supabase/SKILL.md +0 -149
- package/skills/supabase/assets/feedback-issue-template.md +0 -17
- package/skills/supabase/references/skill-feedback.md +0 -17
- package/skills/supabase-postgres-best-practices/CHANGELOG.md +0 -73
- package/skills/supabase-postgres-best-practices/SKILL.md +0 -64
- package/skills/supabase-postgres-best-practices/references/_contributing.md +0 -170
- package/skills/supabase-postgres-best-practices/references/_sections.md +0 -39
- package/skills/supabase-postgres-best-practices/references/_template.md +0 -34
- package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +0 -55
- package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +0 -49
- package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +0 -46
- package/skills/supabase-postgres-best-practices/references/conn-limits.md +0 -44
- package/skills/supabase-postgres-best-practices/references/conn-pooling.md +0 -41
- package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +0 -46
- package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +0 -54
- package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +0 -53
- package/skills/supabase-postgres-best-practices/references/data-pagination.md +0 -50
- package/skills/supabase-postgres-best-practices/references/data-upsert.md +0 -50
- package/skills/supabase-postgres-best-practices/references/lock-advisory.md +0 -56
- package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +0 -68
- package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +0 -50
- package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +0 -54
- package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +0 -45
- package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +0 -55
- package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +0 -55
- package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +0 -44
- package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +0 -40
- package/skills/supabase-postgres-best-practices/references/query-index-types.md +0 -48
- package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +0 -43
- package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +0 -45
- package/skills/supabase-postgres-best-practices/references/schema-constraints.md +0 -80
- package/skills/supabase-postgres-best-practices/references/schema-data-types.md +0 -46
- package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +0 -59
- package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +0 -55
- package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +0 -55
- package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +0 -61
- package/skills/supabase-postgres-best-practices/references/security-privileges.md +0 -54
- package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +0 -50
- package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +0 -63
- package/skills/typescript-expert/SKILL.md +0 -431
- package/skills/typescript-expert/references/tsconfig-strict.json +0 -45
- package/skills/typescript-expert/references/typescript-cheatsheet.md +0 -383
- package/skills/typescript-expert/references/utility-types.ts +0 -335
- package/skills/typescript-expert/scripts/ts_diagnostic.py +0 -203
- package/skills/ui-design-system/SKILL.md +0 -379
- package/skills/ui-design-system/assets/design_system_doc_template.md +0 -180
- package/skills/ui-design-system/references/component-architecture.md +0 -396
- package/skills/ui-design-system/references/developer-handoff.md +0 -509
- package/skills/ui-design-system/references/responsive-calculations.md +0 -390
- package/skills/ui-design-system/references/token-generation.md +0 -324
- package/skills/ui-design-system/scripts/design_token_generator.py +0 -590
- package/skills/zero-hallucination-coder/SKILL.md +0 -271
- /package/bundled-skills/{SKILL.md → android-reverse-engineering/SKILL.md} +0 -0
|
@@ -1,504 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""WCAG 2.2 Color Contrast Checker.
|
|
3
|
-
|
|
4
|
-
Checks foreground/background color pairs against WCAG 2.2 contrast ratio
|
|
5
|
-
thresholds for normal text, large text, and UI components. Supports hex,
|
|
6
|
-
rgb(), and named CSS colors.
|
|
7
|
-
|
|
8
|
-
Usage:
|
|
9
|
-
python contrast_checker.py "#ffffff" "#000000"
|
|
10
|
-
python contrast_checker.py --suggest "#336699"
|
|
11
|
-
python contrast_checker.py --batch styles.css
|
|
12
|
-
python contrast_checker.py --demo
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
import argparse
|
|
16
|
-
import json
|
|
17
|
-
import re
|
|
18
|
-
import sys
|
|
19
|
-
|
|
20
|
-
# ---------------------------------------------------------------------------
|
|
21
|
-
# Named CSS colors (25 common ones)
|
|
22
|
-
# ---------------------------------------------------------------------------
|
|
23
|
-
NAMED_COLORS = {
|
|
24
|
-
"black": (0, 0, 0),
|
|
25
|
-
"white": (255, 255, 255),
|
|
26
|
-
"red": (255, 0, 0),
|
|
27
|
-
"green": (0, 128, 0),
|
|
28
|
-
"blue": (0, 0, 255),
|
|
29
|
-
"yellow": (255, 255, 0),
|
|
30
|
-
"cyan": (0, 255, 255),
|
|
31
|
-
"magenta": (255, 0, 255),
|
|
32
|
-
"gray": (128, 128, 128),
|
|
33
|
-
"grey": (128, 128, 128),
|
|
34
|
-
"orange": (255, 165, 0),
|
|
35
|
-
"purple": (128, 0, 128),
|
|
36
|
-
"pink": (255, 192, 203),
|
|
37
|
-
"brown": (165, 42, 42),
|
|
38
|
-
"navy": (0, 0, 128),
|
|
39
|
-
"teal": (0, 128, 128),
|
|
40
|
-
"olive": (128, 128, 0),
|
|
41
|
-
"maroon": (128, 0, 0),
|
|
42
|
-
"lime": (0, 255, 0),
|
|
43
|
-
"aqua": (0, 255, 255),
|
|
44
|
-
"silver": (192, 192, 192),
|
|
45
|
-
"gold": (255, 215, 0),
|
|
46
|
-
"coral": (255, 127, 80),
|
|
47
|
-
"salmon": (250, 128, 114),
|
|
48
|
-
"tomato": (255, 99, 71),
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
# WCAG thresholds: (label, required_ratio)
|
|
52
|
-
WCAG_THRESHOLDS = [
|
|
53
|
-
("AA Normal Text", 4.5),
|
|
54
|
-
("AA Large Text", 3.0),
|
|
55
|
-
("AA UI Components", 3.0),
|
|
56
|
-
("AAA Normal Text", 7.0),
|
|
57
|
-
("AAA Large Text", 4.5),
|
|
58
|
-
]
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# ---------------------------------------------------------------------------
|
|
62
|
-
# Color parsing
|
|
63
|
-
# ---------------------------------------------------------------------------
|
|
64
|
-
def parse_color(color_str: str) -> tuple:
|
|
65
|
-
"""Parse a color string into an (R, G, B) tuple.
|
|
66
|
-
|
|
67
|
-
Accepts:
|
|
68
|
-
- #RRGGBB or #RGB hex
|
|
69
|
-
- rgb(r, g, b) with values 0-255
|
|
70
|
-
- Named CSS colors
|
|
71
|
-
"""
|
|
72
|
-
s = color_str.strip().lower()
|
|
73
|
-
|
|
74
|
-
# Named color
|
|
75
|
-
if s in NAMED_COLORS:
|
|
76
|
-
return NAMED_COLORS[s]
|
|
77
|
-
|
|
78
|
-
# Hex: #RGB or #RRGGBB
|
|
79
|
-
hex_match = re.match(r"^#([0-9a-f]{3}|[0-9a-f]{6})$", s)
|
|
80
|
-
if hex_match:
|
|
81
|
-
h = hex_match.group(1)
|
|
82
|
-
if len(h) == 3:
|
|
83
|
-
r, g, b = int(h[0] * 2, 16), int(h[1] * 2, 16), int(h[2] * 2, 16)
|
|
84
|
-
else:
|
|
85
|
-
r, g, b = int(h[0:2], 16), int(h[2:4], 16), int(h[4:6], 16)
|
|
86
|
-
return (r, g, b)
|
|
87
|
-
|
|
88
|
-
# rgb(r, g, b)
|
|
89
|
-
rgb_match = re.match(r"^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$", s)
|
|
90
|
-
if rgb_match:
|
|
91
|
-
r, g, b = int(rgb_match.group(1)), int(rgb_match.group(2)), int(rgb_match.group(3))
|
|
92
|
-
if not all(0 <= c <= 255 for c in (r, g, b)):
|
|
93
|
-
raise ValueError(f"RGB values must be 0-255, got rgb({r},{g},{b})")
|
|
94
|
-
return (r, g, b)
|
|
95
|
-
|
|
96
|
-
raise ValueError(
|
|
97
|
-
f"Invalid color format: '{color_str}'. "
|
|
98
|
-
"Use #RRGGBB, #RGB, rgb(r,g,b), or a named color."
|
|
99
|
-
)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def color_to_hex(rgb: tuple) -> str:
|
|
103
|
-
"""Convert an (R, G, B) tuple to #RRGGBB."""
|
|
104
|
-
return f"#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}"
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
# ---------------------------------------------------------------------------
|
|
108
|
-
# WCAG luminance and contrast
|
|
109
|
-
# ---------------------------------------------------------------------------
|
|
110
|
-
def relative_luminance(rgb: tuple) -> float:
|
|
111
|
-
"""Calculate relative luminance per WCAG 2.2 (sRGB).
|
|
112
|
-
|
|
113
|
-
https://www.w3.org/TR/WCAG22/#dfn-relative-luminance
|
|
114
|
-
"""
|
|
115
|
-
channels = []
|
|
116
|
-
for c in rgb:
|
|
117
|
-
s = c / 255.0
|
|
118
|
-
channels.append(s / 12.92 if s <= 0.04045 else ((s + 0.055) / 1.055) ** 2.4)
|
|
119
|
-
return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2]
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def contrast_ratio(rgb1: tuple, rgb2: tuple) -> float:
|
|
123
|
-
"""Return the WCAG contrast ratio between two colors (>= 1.0)."""
|
|
124
|
-
l1 = relative_luminance(rgb1)
|
|
125
|
-
l2 = relative_luminance(rgb2)
|
|
126
|
-
lighter = max(l1, l2)
|
|
127
|
-
darker = min(l1, l2)
|
|
128
|
-
return (lighter + 0.05) / (darker + 0.05)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def evaluate_contrast(ratio: float) -> list:
|
|
132
|
-
"""Return pass/fail results for each WCAG threshold."""
|
|
133
|
-
results = []
|
|
134
|
-
for label, threshold in WCAG_THRESHOLDS:
|
|
135
|
-
results.append({
|
|
136
|
-
"level": label,
|
|
137
|
-
"required": threshold,
|
|
138
|
-
"ratio": round(ratio, 2),
|
|
139
|
-
"pass": ratio >= threshold,
|
|
140
|
-
})
|
|
141
|
-
return results
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
# ---------------------------------------------------------------------------
|
|
145
|
-
# Suggest accessible backgrounds
|
|
146
|
-
# ---------------------------------------------------------------------------
|
|
147
|
-
def suggest_backgrounds(fg_rgb: tuple, target_ratio: float = 4.5, count: int = 8) -> list:
|
|
148
|
-
"""Given a foreground color, suggest background colors passing AA normal text.
|
|
149
|
-
|
|
150
|
-
Strategy: walk luminance in both directions (lighter / darker) from the
|
|
151
|
-
foreground and collect the first colors that meet the target ratio.
|
|
152
|
-
"""
|
|
153
|
-
suggestions = []
|
|
154
|
-
|
|
155
|
-
# Try a spread of grays and tinted variants
|
|
156
|
-
candidates = []
|
|
157
|
-
for v in range(0, 256, 1):
|
|
158
|
-
candidates.append((v, v, v)) # grays
|
|
159
|
-
|
|
160
|
-
# Also try tinted versions toward the complement
|
|
161
|
-
fr, fg, fb = fg_rgb
|
|
162
|
-
for v in range(0, 256, 2):
|
|
163
|
-
candidates.append((v, min(255, v + 20), min(255, v + 40)))
|
|
164
|
-
candidates.append((min(255, v + 40), v, min(255, v + 20)))
|
|
165
|
-
candidates.append((min(255, v + 20), min(255, v + 40), v))
|
|
166
|
-
|
|
167
|
-
seen = set()
|
|
168
|
-
scored = []
|
|
169
|
-
for c in candidates:
|
|
170
|
-
cr = contrast_ratio(fg_rgb, c)
|
|
171
|
-
if cr >= target_ratio and c not in seen:
|
|
172
|
-
seen.add(c)
|
|
173
|
-
scored.append((cr, c))
|
|
174
|
-
|
|
175
|
-
# Sort by ratio closest to target (prefer minimal-change backgrounds)
|
|
176
|
-
scored.sort(key=lambda x: x[0])
|
|
177
|
-
for cr, c in scored[:count]:
|
|
178
|
-
suggestions.append({"hex": color_to_hex(c), "rgb": list(c), "ratio": round(cr, 2)})
|
|
179
|
-
return suggestions
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
# ---------------------------------------------------------------------------
|
|
183
|
-
# Batch CSS parsing
|
|
184
|
-
# ---------------------------------------------------------------------------
|
|
185
|
-
_COLOR_RE = re.compile(
|
|
186
|
-
r"(#[0-9a-fA-F]{3,6}|rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\))"
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
def extract_css_pairs(css_text: str) -> list:
|
|
191
|
-
"""Extract color / background-color pairs from CSS declarations.
|
|
192
|
-
|
|
193
|
-
Returns a list of dicts with selector, foreground, and background strings.
|
|
194
|
-
"""
|
|
195
|
-
pairs = []
|
|
196
|
-
# Split into rule blocks
|
|
197
|
-
block_re = re.compile(r"([^{}]+)\{([^}]+)\}", re.DOTALL)
|
|
198
|
-
for m in block_re.finditer(css_text):
|
|
199
|
-
selector = m.group(1).strip()
|
|
200
|
-
body = m.group(2)
|
|
201
|
-
|
|
202
|
-
fg = bg = None
|
|
203
|
-
# Match color: ... (but not background-color)
|
|
204
|
-
fg_match = re.search(
|
|
205
|
-
r"(?<![-])color\s*:\s*([^;]+);", body, re.IGNORECASE
|
|
206
|
-
)
|
|
207
|
-
bg_match = re.search(
|
|
208
|
-
r"background(?:-color)?\s*:\s*([^;]+);", body, re.IGNORECASE
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
if fg_match:
|
|
212
|
-
val = fg_match.group(1).strip()
|
|
213
|
-
c = _COLOR_RE.search(val)
|
|
214
|
-
if c:
|
|
215
|
-
fg = c.group(1)
|
|
216
|
-
elif val.lower() in NAMED_COLORS:
|
|
217
|
-
fg = val.lower()
|
|
218
|
-
|
|
219
|
-
if bg_match:
|
|
220
|
-
val = bg_match.group(1).strip()
|
|
221
|
-
c = _COLOR_RE.search(val)
|
|
222
|
-
if c:
|
|
223
|
-
bg = c.group(1)
|
|
224
|
-
elif val.lower() in NAMED_COLORS:
|
|
225
|
-
bg = val.lower()
|
|
226
|
-
|
|
227
|
-
if fg and bg:
|
|
228
|
-
pairs.append({"selector": selector, "foreground": fg, "background": bg})
|
|
229
|
-
|
|
230
|
-
return pairs
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
# ---------------------------------------------------------------------------
|
|
234
|
-
# Output formatting
|
|
235
|
-
# ---------------------------------------------------------------------------
|
|
236
|
-
def format_result_human(fg_str: str, bg_str: str, ratio: float, results: list) -> str:
|
|
237
|
-
"""Format a contrast check result for the terminal."""
|
|
238
|
-
lines = [
|
|
239
|
-
f"Foreground : {fg_str}",
|
|
240
|
-
f"Background : {bg_str}",
|
|
241
|
-
f"Contrast : {ratio:.2f}:1",
|
|
242
|
-
"",
|
|
243
|
-
]
|
|
244
|
-
for r in results:
|
|
245
|
-
status = "PASS" if r["pass"] else "FAIL"
|
|
246
|
-
lines.append(f" [{status}] {r['level']:20s} (requires {r['required']}:1)")
|
|
247
|
-
return "\n".join(lines)
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
def format_suggestions_human(fg_str: str, suggestions: list) -> str:
|
|
251
|
-
"""Format suggested backgrounds for the terminal."""
|
|
252
|
-
lines = [f"Foreground: {fg_str}", "Suggested accessible backgrounds (AA Normal Text):"]
|
|
253
|
-
if not suggestions:
|
|
254
|
-
lines.append(" No suggestions found.")
|
|
255
|
-
for s in suggestions:
|
|
256
|
-
lines.append(f" {s['hex']} ratio={s['ratio']}:1")
|
|
257
|
-
return "\n".join(lines)
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
# ---------------------------------------------------------------------------
|
|
261
|
-
# Demo
|
|
262
|
-
# ---------------------------------------------------------------------------
|
|
263
|
-
DEMO_PAIRS = [
|
|
264
|
-
("#ffffff", "#000000"),
|
|
265
|
-
("#336699", "#ffffff"),
|
|
266
|
-
("#ff6600", "#ffffff"),
|
|
267
|
-
("navy", "white"),
|
|
268
|
-
("rgb(100,100,100)", "#eeeeee"),
|
|
269
|
-
]
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
def run_demo(as_json: bool) -> None:
|
|
273
|
-
"""Run demo checks and print results."""
|
|
274
|
-
all_results = []
|
|
275
|
-
for fg_str, bg_str in DEMO_PAIRS:
|
|
276
|
-
fg_rgb = parse_color(fg_str)
|
|
277
|
-
bg_rgb = parse_color(bg_str)
|
|
278
|
-
ratio = contrast_ratio(fg_rgb, bg_rgb)
|
|
279
|
-
results = evaluate_contrast(ratio)
|
|
280
|
-
entry = {
|
|
281
|
-
"foreground": fg_str,
|
|
282
|
-
"background": bg_str,
|
|
283
|
-
"foreground_hex": color_to_hex(fg_rgb),
|
|
284
|
-
"background_hex": color_to_hex(bg_rgb),
|
|
285
|
-
"ratio": round(ratio, 2),
|
|
286
|
-
"results": results,
|
|
287
|
-
}
|
|
288
|
-
all_results.append(entry)
|
|
289
|
-
|
|
290
|
-
if as_json:
|
|
291
|
-
print(json.dumps({"demo": True, "checks": all_results}, indent=2))
|
|
292
|
-
else:
|
|
293
|
-
print("=" * 60)
|
|
294
|
-
print("WCAG 2.2 Contrast Checker - Demo")
|
|
295
|
-
print("=" * 60)
|
|
296
|
-
for entry in all_results:
|
|
297
|
-
print()
|
|
298
|
-
print(
|
|
299
|
-
format_result_human(
|
|
300
|
-
entry["foreground"], entry["background"],
|
|
301
|
-
entry["ratio"], entry["results"],
|
|
302
|
-
)
|
|
303
|
-
)
|
|
304
|
-
print()
|
|
305
|
-
print("-" * 60)
|
|
306
|
-
print("Suggestion demo for foreground #336699:")
|
|
307
|
-
suggestions = suggest_backgrounds(parse_color("#336699"))
|
|
308
|
-
print(format_suggestions_human("#336699", suggestions))
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
# ---------------------------------------------------------------------------
|
|
312
|
-
# CLI
|
|
313
|
-
# ---------------------------------------------------------------------------
|
|
314
|
-
def build_parser() -> argparse.ArgumentParser:
|
|
315
|
-
parser = argparse.ArgumentParser(
|
|
316
|
-
description="WCAG 2.2 Color Contrast Checker. "
|
|
317
|
-
"Checks foreground/background pairs against AA and AAA thresholds.",
|
|
318
|
-
epilog="Examples:\n"
|
|
319
|
-
" %(prog)s '#ffffff' '#000000'\n"
|
|
320
|
-
" %(prog)s --suggest '#336699'\n"
|
|
321
|
-
" %(prog)s --batch styles.css\n"
|
|
322
|
-
" %(prog)s --demo\n",
|
|
323
|
-
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
324
|
-
)
|
|
325
|
-
parser.add_argument(
|
|
326
|
-
"foreground",
|
|
327
|
-
nargs="?",
|
|
328
|
-
help="Foreground (text) color: #RRGGBB, #RGB, rgb(r,g,b), or named color",
|
|
329
|
-
)
|
|
330
|
-
parser.add_argument(
|
|
331
|
-
"background",
|
|
332
|
-
nargs="?",
|
|
333
|
-
help="Background color: #RRGGBB, #RGB, rgb(r,g,b), or named color",
|
|
334
|
-
)
|
|
335
|
-
parser.add_argument(
|
|
336
|
-
"--suggest",
|
|
337
|
-
metavar="COLOR",
|
|
338
|
-
help="Suggest accessible background colors for the given foreground color",
|
|
339
|
-
)
|
|
340
|
-
parser.add_argument(
|
|
341
|
-
"--batch",
|
|
342
|
-
metavar="CSS_FILE",
|
|
343
|
-
help="Extract color pairs from a CSS file and check each",
|
|
344
|
-
)
|
|
345
|
-
parser.add_argument(
|
|
346
|
-
"--json",
|
|
347
|
-
action="store_true",
|
|
348
|
-
dest="json_output",
|
|
349
|
-
help="Output results as JSON",
|
|
350
|
-
)
|
|
351
|
-
parser.add_argument(
|
|
352
|
-
"--demo",
|
|
353
|
-
action="store_true",
|
|
354
|
-
help="Show example output with sample color pairs",
|
|
355
|
-
)
|
|
356
|
-
parser.add_argument(
|
|
357
|
-
"--sample",
|
|
358
|
-
action="store_true",
|
|
359
|
-
help="Run with embedded sample color pairs (alias for --demo)",
|
|
360
|
-
)
|
|
361
|
-
return parser
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
def main() -> int:
|
|
365
|
-
parser = build_parser()
|
|
366
|
-
args = parser.parse_args()
|
|
367
|
-
|
|
368
|
-
# --demo / --sample mode
|
|
369
|
-
if args.demo or args.sample:
|
|
370
|
-
run_demo(args.json_output)
|
|
371
|
-
return 0
|
|
372
|
-
|
|
373
|
-
# --suggest mode
|
|
374
|
-
if args.suggest:
|
|
375
|
-
try:
|
|
376
|
-
fg_rgb = parse_color(args.suggest)
|
|
377
|
-
except ValueError as exc:
|
|
378
|
-
print(f"Error: {exc}", file=sys.stderr)
|
|
379
|
-
return 1
|
|
380
|
-
|
|
381
|
-
suggestions = suggest_backgrounds(fg_rgb)
|
|
382
|
-
if args.json_output:
|
|
383
|
-
print(json.dumps({
|
|
384
|
-
"foreground": args.suggest,
|
|
385
|
-
"foreground_hex": color_to_hex(fg_rgb),
|
|
386
|
-
"suggestions": suggestions,
|
|
387
|
-
}, indent=2))
|
|
388
|
-
else:
|
|
389
|
-
print(format_suggestions_human(args.suggest, suggestions))
|
|
390
|
-
return 0
|
|
391
|
-
|
|
392
|
-
# --batch mode
|
|
393
|
-
if args.batch:
|
|
394
|
-
try:
|
|
395
|
-
with open(args.batch, "r", encoding="utf-8") as fh:
|
|
396
|
-
css_text = fh.read()
|
|
397
|
-
except FileNotFoundError:
|
|
398
|
-
print(f"Error: file not found: {args.batch}", file=sys.stderr)
|
|
399
|
-
return 1
|
|
400
|
-
except OSError as exc:
|
|
401
|
-
print(f"Error reading file: {exc}", file=sys.stderr)
|
|
402
|
-
return 1
|
|
403
|
-
|
|
404
|
-
pairs = extract_css_pairs(css_text)
|
|
405
|
-
if not pairs:
|
|
406
|
-
msg = "No color/background-color pairs found in the CSS file."
|
|
407
|
-
if args.json_output:
|
|
408
|
-
print(json.dumps({"batch": args.batch, "pairs": [], "message": msg}, indent=2))
|
|
409
|
-
else:
|
|
410
|
-
print(msg)
|
|
411
|
-
return 0
|
|
412
|
-
|
|
413
|
-
all_results = []
|
|
414
|
-
has_failure = False
|
|
415
|
-
for pair in pairs:
|
|
416
|
-
try:
|
|
417
|
-
fg_rgb = parse_color(pair["foreground"])
|
|
418
|
-
bg_rgb = parse_color(pair["background"])
|
|
419
|
-
except ValueError as exc:
|
|
420
|
-
entry = {
|
|
421
|
-
"selector": pair["selector"],
|
|
422
|
-
"foreground": pair["foreground"],
|
|
423
|
-
"background": pair["background"],
|
|
424
|
-
"error": str(exc),
|
|
425
|
-
}
|
|
426
|
-
all_results.append(entry)
|
|
427
|
-
continue
|
|
428
|
-
|
|
429
|
-
ratio = contrast_ratio(fg_rgb, bg_rgb)
|
|
430
|
-
results = evaluate_contrast(ratio)
|
|
431
|
-
if not results[0]["pass"]: # AA Normal Text
|
|
432
|
-
has_failure = True
|
|
433
|
-
entry = {
|
|
434
|
-
"selector": pair["selector"],
|
|
435
|
-
"foreground": pair["foreground"],
|
|
436
|
-
"background": pair["background"],
|
|
437
|
-
"foreground_hex": color_to_hex(fg_rgb),
|
|
438
|
-
"background_hex": color_to_hex(bg_rgb),
|
|
439
|
-
"ratio": round(ratio, 2),
|
|
440
|
-
"results": results,
|
|
441
|
-
}
|
|
442
|
-
all_results.append(entry)
|
|
443
|
-
|
|
444
|
-
if args.json_output:
|
|
445
|
-
print(json.dumps({"batch": args.batch, "pairs": all_results}, indent=2))
|
|
446
|
-
else:
|
|
447
|
-
print(f"Batch check: {args.batch}")
|
|
448
|
-
print("=" * 60)
|
|
449
|
-
for entry in all_results:
|
|
450
|
-
print(f"\nSelector: {entry['selector']}")
|
|
451
|
-
if "error" in entry:
|
|
452
|
-
print(f" Error: {entry['error']}")
|
|
453
|
-
else:
|
|
454
|
-
print(
|
|
455
|
-
format_result_human(
|
|
456
|
-
entry["foreground"], entry["background"],
|
|
457
|
-
entry["ratio"], entry["results"],
|
|
458
|
-
)
|
|
459
|
-
)
|
|
460
|
-
print()
|
|
461
|
-
summary_pass = sum(1 for e in all_results if "ratio" in e and e["results"][0]["pass"])
|
|
462
|
-
summary_total = sum(1 for e in all_results if "ratio" in e)
|
|
463
|
-
print(f"Summary: {summary_pass}/{summary_total} pairs pass AA Normal Text")
|
|
464
|
-
|
|
465
|
-
return 1 if has_failure else 0
|
|
466
|
-
|
|
467
|
-
# Default: check a single pair
|
|
468
|
-
if not args.foreground or not args.background:
|
|
469
|
-
parser.error(
|
|
470
|
-
"Provide foreground and background colors, or use --suggest, --batch, or --demo."
|
|
471
|
-
)
|
|
472
|
-
|
|
473
|
-
try:
|
|
474
|
-
fg_rgb = parse_color(args.foreground)
|
|
475
|
-
except ValueError as exc:
|
|
476
|
-
print(f"Error (foreground): {exc}", file=sys.stderr)
|
|
477
|
-
return 1
|
|
478
|
-
|
|
479
|
-
try:
|
|
480
|
-
bg_rgb = parse_color(args.background)
|
|
481
|
-
except ValueError as exc:
|
|
482
|
-
print(f"Error (background): {exc}", file=sys.stderr)
|
|
483
|
-
return 1
|
|
484
|
-
|
|
485
|
-
ratio = contrast_ratio(fg_rgb, bg_rgb)
|
|
486
|
-
results = evaluate_contrast(ratio)
|
|
487
|
-
|
|
488
|
-
if args.json_output:
|
|
489
|
-
print(json.dumps({
|
|
490
|
-
"foreground": args.foreground,
|
|
491
|
-
"background": args.background,
|
|
492
|
-
"foreground_hex": color_to_hex(fg_rgb),
|
|
493
|
-
"background_hex": color_to_hex(bg_rgb),
|
|
494
|
-
"ratio": round(ratio, 2),
|
|
495
|
-
"results": results,
|
|
496
|
-
}, indent=2))
|
|
497
|
-
else:
|
|
498
|
-
print(format_result_human(args.foreground, args.background, ratio, results))
|
|
499
|
-
|
|
500
|
-
return 0 if results[0]["pass"] else 1
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
if __name__ == "__main__":
|
|
504
|
-
sys.exit(main())
|