novahiz 0.1.0 → 0.2.2
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 +355 -123
- 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/instructions.md +5 -16
- package/adapters/opencode/novahiz.ts +157 -23
- 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 +150 -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 +66 -53
- package/install/lib.mjs +15 -1
- package/install/uninstall.mjs +11 -11
- package/mcp/novahiz-tools/index.mjs +244 -40
- package/novahiz.config.example.json +0 -1
- package/package.json +12 -10
- 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-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/catalog.ts +18 -4
- package/src/classify.ts +42 -5
- package/src/cli.ts +129 -44
- package/src/commands/clean.ts +26 -20
- package/src/commands/context.ts +11 -5
- package/src/commands/doctor.ts +217 -191
- package/src/commands/gate.ts +98 -60
- package/src/commands/graft.ts +160 -0
- package/src/commands/inspect.ts +35 -9
- package/src/commands/report.ts +20 -12
- package/src/commands/task.ts +17 -9
- 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 +117 -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 +22 -1
- 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,1107 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Compliance Checker - Verify security compliance against SOC 2, PCI-DSS, HIPAA, GDPR.
|
|
4
|
-
|
|
5
|
-
Table of Contents:
|
|
6
|
-
ComplianceChecker - Main class for compliance verification
|
|
7
|
-
__init__ - Initialize with target path and framework
|
|
8
|
-
check() - Run compliance checks for selected framework
|
|
9
|
-
check_soc2() - Check SOC 2 Type II controls
|
|
10
|
-
check_pci_dss() - Check PCI-DSS v4.0 requirements
|
|
11
|
-
check_hipaa() - Check HIPAA security rule requirements
|
|
12
|
-
check_gdpr() - Check GDPR data protection requirements
|
|
13
|
-
_check_encryption_at_rest() - Verify data encryption
|
|
14
|
-
_check_access_controls() - Verify access control implementation
|
|
15
|
-
_check_logging() - Verify audit logging
|
|
16
|
-
_check_secrets_management() - Verify secrets handling
|
|
17
|
-
_calculate_compliance_score() - Calculate overall compliance score
|
|
18
|
-
main() - CLI entry point
|
|
19
|
-
|
|
20
|
-
Usage:
|
|
21
|
-
python compliance_checker.py /path/to/project
|
|
22
|
-
python compliance_checker.py /path/to/project --framework soc2
|
|
23
|
-
python compliance_checker.py /path/to/project --framework pci-dss --output report.json
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
import os
|
|
27
|
-
import sys
|
|
28
|
-
import json
|
|
29
|
-
import re
|
|
30
|
-
import argparse
|
|
31
|
-
from pathlib import Path
|
|
32
|
-
from typing import Dict, List, Optional, Tuple
|
|
33
|
-
from dataclasses import dataclass, asdict
|
|
34
|
-
from datetime import datetime
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@dataclass
|
|
38
|
-
class ComplianceControl:
|
|
39
|
-
"""Represents a compliance control check result."""
|
|
40
|
-
control_id: str
|
|
41
|
-
framework: str
|
|
42
|
-
category: str
|
|
43
|
-
title: str
|
|
44
|
-
description: str
|
|
45
|
-
status: str # passed, failed, warning, not_applicable
|
|
46
|
-
evidence: List[str]
|
|
47
|
-
recommendation: str
|
|
48
|
-
severity: str # critical, high, medium, low
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
class ComplianceChecker:
|
|
52
|
-
"""Verify security compliance against industry frameworks."""
|
|
53
|
-
|
|
54
|
-
FRAMEWORKS = ['soc2', 'pci-dss', 'hipaa', 'gdpr', 'all']
|
|
55
|
-
|
|
56
|
-
def __init__(
|
|
57
|
-
self,
|
|
58
|
-
target_path: str,
|
|
59
|
-
framework: str = "all",
|
|
60
|
-
verbose: bool = False
|
|
61
|
-
):
|
|
62
|
-
"""
|
|
63
|
-
Initialize the compliance checker.
|
|
64
|
-
|
|
65
|
-
Args:
|
|
66
|
-
target_path: Directory to scan
|
|
67
|
-
framework: Compliance framework to check (soc2, pci-dss, hipaa, gdpr, all)
|
|
68
|
-
verbose: Enable verbose output
|
|
69
|
-
"""
|
|
70
|
-
self.target_path = Path(target_path)
|
|
71
|
-
self.framework = framework.lower()
|
|
72
|
-
self.verbose = verbose
|
|
73
|
-
self.controls: List[ComplianceControl] = []
|
|
74
|
-
self.files_scanned = 0
|
|
75
|
-
|
|
76
|
-
def check(self) -> Dict:
|
|
77
|
-
"""
|
|
78
|
-
Run compliance checks for selected framework.
|
|
79
|
-
|
|
80
|
-
Returns:
|
|
81
|
-
Dict with compliance results
|
|
82
|
-
"""
|
|
83
|
-
print(f"Compliance Checker - Scanning: {self.target_path}")
|
|
84
|
-
print(f"Framework: {self.framework.upper()}")
|
|
85
|
-
print()
|
|
86
|
-
|
|
87
|
-
if not self.target_path.exists():
|
|
88
|
-
return {"status": "error", "message": f"Path not found: {self.target_path}"}
|
|
89
|
-
|
|
90
|
-
start_time = datetime.now()
|
|
91
|
-
|
|
92
|
-
# Run framework-specific checks
|
|
93
|
-
if self.framework in ('soc2', 'all'):
|
|
94
|
-
self.check_soc2()
|
|
95
|
-
if self.framework in ('pci-dss', 'all'):
|
|
96
|
-
self.check_pci_dss()
|
|
97
|
-
if self.framework in ('hipaa', 'all'):
|
|
98
|
-
self.check_hipaa()
|
|
99
|
-
if self.framework in ('gdpr', 'all'):
|
|
100
|
-
self.check_gdpr()
|
|
101
|
-
|
|
102
|
-
end_time = datetime.now()
|
|
103
|
-
scan_duration = (end_time - start_time).total_seconds()
|
|
104
|
-
|
|
105
|
-
# Calculate statistics
|
|
106
|
-
passed = len([c for c in self.controls if c.status == 'passed'])
|
|
107
|
-
failed = len([c for c in self.controls if c.status == 'failed'])
|
|
108
|
-
warnings = len([c for c in self.controls if c.status == 'warning'])
|
|
109
|
-
na = len([c for c in self.controls if c.status == 'not_applicable'])
|
|
110
|
-
|
|
111
|
-
compliance_score = self._calculate_compliance_score()
|
|
112
|
-
|
|
113
|
-
result = {
|
|
114
|
-
"status": "completed",
|
|
115
|
-
"target": str(self.target_path),
|
|
116
|
-
"framework": self.framework,
|
|
117
|
-
"scan_duration_seconds": round(scan_duration, 2),
|
|
118
|
-
"compliance_score": compliance_score,
|
|
119
|
-
"compliance_level": self._get_compliance_level(compliance_score),
|
|
120
|
-
"summary": {
|
|
121
|
-
"passed": passed,
|
|
122
|
-
"failed": failed,
|
|
123
|
-
"warnings": warnings,
|
|
124
|
-
"not_applicable": na,
|
|
125
|
-
"total": len(self.controls)
|
|
126
|
-
},
|
|
127
|
-
"controls": [asdict(c) for c in self.controls]
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
self._print_summary(result)
|
|
131
|
-
|
|
132
|
-
return result
|
|
133
|
-
|
|
134
|
-
def check_soc2(self):
|
|
135
|
-
"""Check SOC 2 Type II controls."""
|
|
136
|
-
if self.verbose:
|
|
137
|
-
print(" Checking SOC 2 Type II controls...")
|
|
138
|
-
|
|
139
|
-
# CC1: Control Environment - Access Controls
|
|
140
|
-
self._check_access_controls_soc2()
|
|
141
|
-
|
|
142
|
-
# CC2: Communication and Information
|
|
143
|
-
self._check_documentation()
|
|
144
|
-
|
|
145
|
-
# CC3: Risk Assessment
|
|
146
|
-
self._check_risk_assessment()
|
|
147
|
-
|
|
148
|
-
# CC6: Logical and Physical Access Controls
|
|
149
|
-
self._check_authentication()
|
|
150
|
-
|
|
151
|
-
# CC7: System Operations
|
|
152
|
-
self._check_logging()
|
|
153
|
-
|
|
154
|
-
# CC8: Change Management
|
|
155
|
-
self._check_change_management()
|
|
156
|
-
|
|
157
|
-
def check_pci_dss(self):
|
|
158
|
-
"""Check PCI-DSS v4.0 requirements."""
|
|
159
|
-
if self.verbose:
|
|
160
|
-
print(" Checking PCI-DSS v4.0 requirements...")
|
|
161
|
-
|
|
162
|
-
# Requirement 3: Protect stored cardholder data
|
|
163
|
-
self._check_data_encryption()
|
|
164
|
-
|
|
165
|
-
# Requirement 4: Encrypt transmission of cardholder data
|
|
166
|
-
self._check_transmission_encryption()
|
|
167
|
-
|
|
168
|
-
# Requirement 6: Develop and maintain secure systems
|
|
169
|
-
self._check_secure_development()
|
|
170
|
-
|
|
171
|
-
# Requirement 8: Identify users and authenticate access
|
|
172
|
-
self._check_strong_authentication()
|
|
173
|
-
|
|
174
|
-
# Requirement 10: Log and monitor all access
|
|
175
|
-
self._check_audit_logging()
|
|
176
|
-
|
|
177
|
-
# Requirement 11: Test security of systems regularly
|
|
178
|
-
self._check_security_testing()
|
|
179
|
-
|
|
180
|
-
def check_hipaa(self):
|
|
181
|
-
"""Check HIPAA security rule requirements."""
|
|
182
|
-
if self.verbose:
|
|
183
|
-
print(" Checking HIPAA Security Rule requirements...")
|
|
184
|
-
|
|
185
|
-
# 164.312(a)(1): Access Control
|
|
186
|
-
self._check_hipaa_access_control()
|
|
187
|
-
|
|
188
|
-
# 164.312(b): Audit Controls
|
|
189
|
-
self._check_hipaa_audit()
|
|
190
|
-
|
|
191
|
-
# 164.312(c)(1): Integrity Controls
|
|
192
|
-
self._check_hipaa_integrity()
|
|
193
|
-
|
|
194
|
-
# 164.312(d): Person or Entity Authentication
|
|
195
|
-
self._check_hipaa_authentication()
|
|
196
|
-
|
|
197
|
-
# 164.312(e)(1): Transmission Security
|
|
198
|
-
self._check_hipaa_transmission()
|
|
199
|
-
|
|
200
|
-
def check_gdpr(self):
|
|
201
|
-
"""Check GDPR data protection requirements."""
|
|
202
|
-
if self.verbose:
|
|
203
|
-
print(" Checking GDPR requirements...")
|
|
204
|
-
|
|
205
|
-
# Article 25: Data protection by design
|
|
206
|
-
self._check_privacy_by_design()
|
|
207
|
-
|
|
208
|
-
# Article 32: Security of processing
|
|
209
|
-
self._check_gdpr_security()
|
|
210
|
-
|
|
211
|
-
# Article 33/34: Breach notification
|
|
212
|
-
self._check_breach_notification()
|
|
213
|
-
|
|
214
|
-
# Article 17: Right to erasure
|
|
215
|
-
self._check_data_deletion()
|
|
216
|
-
|
|
217
|
-
# Article 20: Data portability
|
|
218
|
-
self._check_data_export()
|
|
219
|
-
|
|
220
|
-
def _check_access_controls_soc2(self):
|
|
221
|
-
"""SOC 2 CC1/CC6: Check access control implementation."""
|
|
222
|
-
evidence = []
|
|
223
|
-
status = 'failed'
|
|
224
|
-
|
|
225
|
-
# Look for authentication middleware
|
|
226
|
-
auth_patterns = [
|
|
227
|
-
r'authMiddleware',
|
|
228
|
-
r'requireAuth',
|
|
229
|
-
r'isAuthenticated',
|
|
230
|
-
r'@login_required',
|
|
231
|
-
r'@authenticated',
|
|
232
|
-
r'passport\.authenticate',
|
|
233
|
-
r'jwt\.verify',
|
|
234
|
-
r'verifyToken'
|
|
235
|
-
]
|
|
236
|
-
|
|
237
|
-
for pattern in auth_patterns:
|
|
238
|
-
files = self._search_files(pattern)
|
|
239
|
-
if files:
|
|
240
|
-
evidence.extend(files[:3])
|
|
241
|
-
status = 'passed'
|
|
242
|
-
break
|
|
243
|
-
|
|
244
|
-
# Check for RBAC implementation
|
|
245
|
-
rbac_patterns = [r'role', r'permission', r'authorize', r'can\(', r'hasRole']
|
|
246
|
-
for pattern in rbac_patterns:
|
|
247
|
-
files = self._search_files(pattern)
|
|
248
|
-
if files:
|
|
249
|
-
evidence.extend(files[:2])
|
|
250
|
-
if status == 'failed':
|
|
251
|
-
status = 'warning'
|
|
252
|
-
break
|
|
253
|
-
|
|
254
|
-
self.controls.append(ComplianceControl(
|
|
255
|
-
control_id='SOC2-CC6.1',
|
|
256
|
-
framework='SOC 2',
|
|
257
|
-
category='Logical Access Controls',
|
|
258
|
-
title='Access Control Implementation',
|
|
259
|
-
description='Verify authentication and authorization controls are implemented',
|
|
260
|
-
status=status,
|
|
261
|
-
evidence=evidence[:5],
|
|
262
|
-
recommendation='Implement authentication middleware and role-based access control (RBAC)',
|
|
263
|
-
severity='high' if status == 'failed' else 'low'
|
|
264
|
-
))
|
|
265
|
-
|
|
266
|
-
def _check_documentation(self):
|
|
267
|
-
"""SOC 2 CC2: Check security documentation."""
|
|
268
|
-
evidence = []
|
|
269
|
-
status = 'failed'
|
|
270
|
-
|
|
271
|
-
doc_files = [
|
|
272
|
-
'SECURITY.md',
|
|
273
|
-
'docs/security.md',
|
|
274
|
-
'CONTRIBUTING.md',
|
|
275
|
-
'docs/security-policy.md',
|
|
276
|
-
'.github/SECURITY.md'
|
|
277
|
-
]
|
|
278
|
-
|
|
279
|
-
for doc in doc_files:
|
|
280
|
-
doc_path = self.target_path / doc
|
|
281
|
-
if doc_path.exists():
|
|
282
|
-
evidence.append(str(doc))
|
|
283
|
-
status = 'passed' if 'security' in doc.lower() else 'warning'
|
|
284
|
-
break
|
|
285
|
-
|
|
286
|
-
self.controls.append(ComplianceControl(
|
|
287
|
-
control_id='SOC2-CC2.1',
|
|
288
|
-
framework='SOC 2',
|
|
289
|
-
category='Communication and Information',
|
|
290
|
-
title='Security Documentation',
|
|
291
|
-
description='Verify security policies and procedures are documented',
|
|
292
|
-
status=status,
|
|
293
|
-
evidence=evidence,
|
|
294
|
-
recommendation='Create SECURITY.md documenting security policies, incident response, and vulnerability reporting',
|
|
295
|
-
severity='medium' if status == 'failed' else 'low'
|
|
296
|
-
))
|
|
297
|
-
|
|
298
|
-
def _check_risk_assessment(self):
|
|
299
|
-
"""SOC 2 CC3: Check risk assessment artifacts."""
|
|
300
|
-
evidence = []
|
|
301
|
-
status = 'failed'
|
|
302
|
-
|
|
303
|
-
# Look for security scanning configuration
|
|
304
|
-
scan_configs = [
|
|
305
|
-
'.snyk',
|
|
306
|
-
'.github/workflows/security.yml',
|
|
307
|
-
'.github/workflows/codeql.yml',
|
|
308
|
-
'trivy.yaml',
|
|
309
|
-
'.semgrep.yml',
|
|
310
|
-
'sonar-project.properties'
|
|
311
|
-
]
|
|
312
|
-
|
|
313
|
-
for config in scan_configs:
|
|
314
|
-
config_path = self.target_path / config
|
|
315
|
-
if config_path.exists():
|
|
316
|
-
evidence.append(str(config))
|
|
317
|
-
status = 'passed'
|
|
318
|
-
break
|
|
319
|
-
|
|
320
|
-
# Check for dependabot/renovate
|
|
321
|
-
dep_configs = [
|
|
322
|
-
'.github/dependabot.yml',
|
|
323
|
-
'renovate.json',
|
|
324
|
-
'.github/renovate.json'
|
|
325
|
-
]
|
|
326
|
-
|
|
327
|
-
for config in dep_configs:
|
|
328
|
-
config_path = self.target_path / config
|
|
329
|
-
if config_path.exists():
|
|
330
|
-
evidence.append(str(config))
|
|
331
|
-
if status == 'failed':
|
|
332
|
-
status = 'warning'
|
|
333
|
-
break
|
|
334
|
-
|
|
335
|
-
self.controls.append(ComplianceControl(
|
|
336
|
-
control_id='SOC2-CC3.1',
|
|
337
|
-
framework='SOC 2',
|
|
338
|
-
category='Risk Assessment',
|
|
339
|
-
title='Automated Security Scanning',
|
|
340
|
-
description='Verify automated vulnerability scanning is configured',
|
|
341
|
-
status=status,
|
|
342
|
-
evidence=evidence,
|
|
343
|
-
recommendation='Configure automated security scanning (Snyk, CodeQL, Trivy) and dependency updates (Dependabot)',
|
|
344
|
-
severity='high' if status == 'failed' else 'low'
|
|
345
|
-
))
|
|
346
|
-
|
|
347
|
-
def _check_authentication(self):
|
|
348
|
-
"""SOC 2 CC6: Check authentication strength."""
|
|
349
|
-
evidence = []
|
|
350
|
-
status = 'failed'
|
|
351
|
-
|
|
352
|
-
# Check for MFA/2FA
|
|
353
|
-
mfa_patterns = [r'mfa', r'2fa', r'totp', r'authenticator', r'twoFactor']
|
|
354
|
-
for pattern in mfa_patterns:
|
|
355
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
356
|
-
if files:
|
|
357
|
-
evidence.extend(files[:2])
|
|
358
|
-
status = 'passed'
|
|
359
|
-
break
|
|
360
|
-
|
|
361
|
-
# Check for password hashing
|
|
362
|
-
hash_patterns = [r'bcrypt', r'argon2', r'scrypt', r'pbkdf2']
|
|
363
|
-
for pattern in hash_patterns:
|
|
364
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
365
|
-
if files:
|
|
366
|
-
evidence.extend(files[:2])
|
|
367
|
-
if status == 'failed':
|
|
368
|
-
status = 'warning'
|
|
369
|
-
break
|
|
370
|
-
|
|
371
|
-
self.controls.append(ComplianceControl(
|
|
372
|
-
control_id='SOC2-CC6.2',
|
|
373
|
-
framework='SOC 2',
|
|
374
|
-
category='Authentication',
|
|
375
|
-
title='Strong Authentication',
|
|
376
|
-
description='Verify multi-factor authentication and secure password storage',
|
|
377
|
-
status=status,
|
|
378
|
-
evidence=evidence[:5],
|
|
379
|
-
recommendation='Implement MFA/2FA and use bcrypt/argon2 for password hashing',
|
|
380
|
-
severity='critical' if status == 'failed' else 'low'
|
|
381
|
-
))
|
|
382
|
-
|
|
383
|
-
def _check_logging(self):
|
|
384
|
-
"""SOC 2 CC7: Check audit logging implementation."""
|
|
385
|
-
evidence = []
|
|
386
|
-
status = 'failed'
|
|
387
|
-
|
|
388
|
-
# Check for logging configuration
|
|
389
|
-
log_patterns = [
|
|
390
|
-
r'winston',
|
|
391
|
-
r'pino',
|
|
392
|
-
r'bunyan',
|
|
393
|
-
r'logging\.getLogger',
|
|
394
|
-
r'log\.info',
|
|
395
|
-
r'logger\.',
|
|
396
|
-
r'audit.*log'
|
|
397
|
-
]
|
|
398
|
-
|
|
399
|
-
for pattern in log_patterns:
|
|
400
|
-
files = self._search_files(pattern)
|
|
401
|
-
if files:
|
|
402
|
-
evidence.extend(files[:3])
|
|
403
|
-
status = 'passed'
|
|
404
|
-
break
|
|
405
|
-
|
|
406
|
-
# Check for structured logging
|
|
407
|
-
struct_patterns = [r'json.*log', r'structured.*log', r'log.*format']
|
|
408
|
-
for pattern in struct_patterns:
|
|
409
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
410
|
-
if files:
|
|
411
|
-
evidence.extend(files[:2])
|
|
412
|
-
break
|
|
413
|
-
|
|
414
|
-
self.controls.append(ComplianceControl(
|
|
415
|
-
control_id='SOC2-CC7.1',
|
|
416
|
-
framework='SOC 2',
|
|
417
|
-
category='System Operations',
|
|
418
|
-
title='Audit Logging',
|
|
419
|
-
description='Verify comprehensive audit logging is implemented',
|
|
420
|
-
status=status,
|
|
421
|
-
evidence=evidence[:5],
|
|
422
|
-
recommendation='Implement structured audit logging with security events (auth, access, changes)',
|
|
423
|
-
severity='high' if status == 'failed' else 'low'
|
|
424
|
-
))
|
|
425
|
-
|
|
426
|
-
def _check_change_management(self):
|
|
427
|
-
"""SOC 2 CC8: Check change management controls."""
|
|
428
|
-
evidence = []
|
|
429
|
-
status = 'failed'
|
|
430
|
-
|
|
431
|
-
# Check for CI/CD configuration
|
|
432
|
-
ci_configs = [
|
|
433
|
-
'.github/workflows',
|
|
434
|
-
'.gitlab-ci.yml',
|
|
435
|
-
'Jenkinsfile',
|
|
436
|
-
'.circleci/config.yml',
|
|
437
|
-
'azure-pipelines.yml'
|
|
438
|
-
]
|
|
439
|
-
|
|
440
|
-
for config in ci_configs:
|
|
441
|
-
config_path = self.target_path / config
|
|
442
|
-
if config_path.exists():
|
|
443
|
-
evidence.append(str(config))
|
|
444
|
-
status = 'passed'
|
|
445
|
-
break
|
|
446
|
-
|
|
447
|
-
# Check for branch protection indicators
|
|
448
|
-
branch_patterns = [r'protected.*branch', r'require.*review', r'pull.*request']
|
|
449
|
-
for pattern in branch_patterns:
|
|
450
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
451
|
-
if files:
|
|
452
|
-
evidence.extend(files[:2])
|
|
453
|
-
break
|
|
454
|
-
|
|
455
|
-
self.controls.append(ComplianceControl(
|
|
456
|
-
control_id='SOC2-CC8.1',
|
|
457
|
-
framework='SOC 2',
|
|
458
|
-
category='Change Management',
|
|
459
|
-
title='CI/CD and Code Review',
|
|
460
|
-
description='Verify automated deployment pipeline and code review process',
|
|
461
|
-
status=status,
|
|
462
|
-
evidence=evidence[:5],
|
|
463
|
-
recommendation='Implement CI/CD pipeline with required code reviews and branch protection',
|
|
464
|
-
severity='medium' if status == 'failed' else 'low'
|
|
465
|
-
))
|
|
466
|
-
|
|
467
|
-
def _check_data_encryption(self):
|
|
468
|
-
"""PCI-DSS Req 3: Check encryption at rest."""
|
|
469
|
-
evidence = []
|
|
470
|
-
status = 'failed'
|
|
471
|
-
|
|
472
|
-
encryption_patterns = [
|
|
473
|
-
r'AES',
|
|
474
|
-
r'encrypt',
|
|
475
|
-
r'crypto\.createCipher',
|
|
476
|
-
r'Fernet',
|
|
477
|
-
r'KMS',
|
|
478
|
-
r'encryptedField'
|
|
479
|
-
]
|
|
480
|
-
|
|
481
|
-
for pattern in encryption_patterns:
|
|
482
|
-
files = self._search_files(pattern)
|
|
483
|
-
if files:
|
|
484
|
-
evidence.extend(files[:3])
|
|
485
|
-
status = 'passed'
|
|
486
|
-
break
|
|
487
|
-
|
|
488
|
-
self.controls.append(ComplianceControl(
|
|
489
|
-
control_id='PCI-DSS-3.5',
|
|
490
|
-
framework='PCI-DSS',
|
|
491
|
-
category='Protect Stored Data',
|
|
492
|
-
title='Encryption at Rest',
|
|
493
|
-
description='Verify sensitive data is encrypted at rest',
|
|
494
|
-
status=status,
|
|
495
|
-
evidence=evidence[:5],
|
|
496
|
-
recommendation='Implement AES-256 encryption for sensitive data storage using approved libraries',
|
|
497
|
-
severity='critical' if status == 'failed' else 'low'
|
|
498
|
-
))
|
|
499
|
-
|
|
500
|
-
def _check_transmission_encryption(self):
|
|
501
|
-
"""PCI-DSS Req 4: Check encryption in transit."""
|
|
502
|
-
evidence = []
|
|
503
|
-
status = 'failed'
|
|
504
|
-
|
|
505
|
-
tls_patterns = [
|
|
506
|
-
r'https://',
|
|
507
|
-
r'TLS',
|
|
508
|
-
r'SSL',
|
|
509
|
-
r'secure.*cookie',
|
|
510
|
-
r'HSTS'
|
|
511
|
-
]
|
|
512
|
-
|
|
513
|
-
for pattern in tls_patterns:
|
|
514
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
515
|
-
if files:
|
|
516
|
-
evidence.extend(files[:3])
|
|
517
|
-
status = 'passed'
|
|
518
|
-
break
|
|
519
|
-
|
|
520
|
-
self.controls.append(ComplianceControl(
|
|
521
|
-
control_id='PCI-DSS-4.1',
|
|
522
|
-
framework='PCI-DSS',
|
|
523
|
-
category='Encrypt Transmissions',
|
|
524
|
-
title='TLS/HTTPS Enforcement',
|
|
525
|
-
description='Verify TLS 1.2+ is enforced for all transmissions',
|
|
526
|
-
status=status,
|
|
527
|
-
evidence=evidence[:5],
|
|
528
|
-
recommendation='Enforce HTTPS with TLS 1.2+, enable HSTS, use secure cookies',
|
|
529
|
-
severity='critical' if status == 'failed' else 'low'
|
|
530
|
-
))
|
|
531
|
-
|
|
532
|
-
def _check_secure_development(self):
|
|
533
|
-
"""PCI-DSS Req 6: Check secure development practices."""
|
|
534
|
-
evidence = []
|
|
535
|
-
status = 'failed'
|
|
536
|
-
|
|
537
|
-
# Check for input validation
|
|
538
|
-
validation_patterns = [
|
|
539
|
-
r'validator',
|
|
540
|
-
r'sanitize',
|
|
541
|
-
r'escape',
|
|
542
|
-
r'zod',
|
|
543
|
-
r'yup',
|
|
544
|
-
r'joi'
|
|
545
|
-
]
|
|
546
|
-
|
|
547
|
-
for pattern in validation_patterns:
|
|
548
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
549
|
-
if files:
|
|
550
|
-
evidence.extend(files[:3])
|
|
551
|
-
status = 'passed'
|
|
552
|
-
break
|
|
553
|
-
|
|
554
|
-
self.controls.append(ComplianceControl(
|
|
555
|
-
control_id='PCI-DSS-6.5',
|
|
556
|
-
framework='PCI-DSS',
|
|
557
|
-
category='Secure Development',
|
|
558
|
-
title='Input Validation',
|
|
559
|
-
description='Verify input validation and sanitization is implemented',
|
|
560
|
-
status=status,
|
|
561
|
-
evidence=evidence[:5],
|
|
562
|
-
recommendation='Use validation libraries (Joi, Zod, validator.js) for all user input',
|
|
563
|
-
severity='high' if status == 'failed' else 'low'
|
|
564
|
-
))
|
|
565
|
-
|
|
566
|
-
def _check_strong_authentication(self):
|
|
567
|
-
"""PCI-DSS Req 8: Check authentication requirements."""
|
|
568
|
-
evidence = []
|
|
569
|
-
status = 'failed'
|
|
570
|
-
|
|
571
|
-
# Check for session management
|
|
572
|
-
session_patterns = [
|
|
573
|
-
r'session.*timeout',
|
|
574
|
-
r'maxAge',
|
|
575
|
-
r'expiresIn',
|
|
576
|
-
r'session.*expire'
|
|
577
|
-
]
|
|
578
|
-
|
|
579
|
-
for pattern in session_patterns:
|
|
580
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
581
|
-
if files:
|
|
582
|
-
evidence.extend(files[:3])
|
|
583
|
-
status = 'passed'
|
|
584
|
-
break
|
|
585
|
-
|
|
586
|
-
self.controls.append(ComplianceControl(
|
|
587
|
-
control_id='PCI-DSS-8.6',
|
|
588
|
-
framework='PCI-DSS',
|
|
589
|
-
category='Authentication',
|
|
590
|
-
title='Session Management',
|
|
591
|
-
description='Verify session timeout and management controls',
|
|
592
|
-
status=status,
|
|
593
|
-
evidence=evidence[:5],
|
|
594
|
-
recommendation='Implement 15-minute session timeout, secure session tokens, and session invalidation on logout',
|
|
595
|
-
severity='high' if status == 'failed' else 'low'
|
|
596
|
-
))
|
|
597
|
-
|
|
598
|
-
def _check_audit_logging(self):
|
|
599
|
-
"""PCI-DSS Req 10: Check audit logging."""
|
|
600
|
-
# Reuse SOC 2 logging check logic
|
|
601
|
-
evidence = []
|
|
602
|
-
status = 'failed'
|
|
603
|
-
|
|
604
|
-
log_patterns = [r'audit', r'log.*event', r'security.*log']
|
|
605
|
-
for pattern in log_patterns:
|
|
606
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
607
|
-
if files:
|
|
608
|
-
evidence.extend(files[:3])
|
|
609
|
-
status = 'passed'
|
|
610
|
-
break
|
|
611
|
-
|
|
612
|
-
self.controls.append(ComplianceControl(
|
|
613
|
-
control_id='PCI-DSS-10.2',
|
|
614
|
-
framework='PCI-DSS',
|
|
615
|
-
category='Logging and Monitoring',
|
|
616
|
-
title='Security Event Logging',
|
|
617
|
-
description='Verify security events are logged with sufficient detail',
|
|
618
|
-
status=status,
|
|
619
|
-
evidence=evidence[:5],
|
|
620
|
-
recommendation='Log all authentication events, access to cardholder data, and administrative actions',
|
|
621
|
-
severity='high' if status == 'failed' else 'low'
|
|
622
|
-
))
|
|
623
|
-
|
|
624
|
-
def _check_security_testing(self):
|
|
625
|
-
"""PCI-DSS Req 11: Check security testing."""
|
|
626
|
-
evidence = []
|
|
627
|
-
status = 'failed'
|
|
628
|
-
|
|
629
|
-
# Check for test configuration
|
|
630
|
-
test_patterns = [
|
|
631
|
-
r'security.*test',
|
|
632
|
-
r'penetration.*test',
|
|
633
|
-
r'vulnerability.*scan'
|
|
634
|
-
]
|
|
635
|
-
|
|
636
|
-
for pattern in test_patterns:
|
|
637
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
638
|
-
if files:
|
|
639
|
-
evidence.extend(files[:3])
|
|
640
|
-
status = 'passed'
|
|
641
|
-
break
|
|
642
|
-
|
|
643
|
-
# Check for SAST/DAST configuration
|
|
644
|
-
sast_configs = ['.snyk', '.semgrep.yml', 'sonar-project.properties']
|
|
645
|
-
for config in sast_configs:
|
|
646
|
-
if (self.target_path / config).exists():
|
|
647
|
-
evidence.append(config)
|
|
648
|
-
if status == 'failed':
|
|
649
|
-
status = 'warning'
|
|
650
|
-
break
|
|
651
|
-
|
|
652
|
-
self.controls.append(ComplianceControl(
|
|
653
|
-
control_id='PCI-DSS-11.3',
|
|
654
|
-
framework='PCI-DSS',
|
|
655
|
-
category='Security Testing',
|
|
656
|
-
title='Vulnerability Assessment',
|
|
657
|
-
description='Verify regular security testing is performed',
|
|
658
|
-
status=status,
|
|
659
|
-
evidence=evidence[:5],
|
|
660
|
-
recommendation='Configure SAST/DAST scanning and schedule quarterly penetration tests',
|
|
661
|
-
severity='high' if status == 'failed' else 'low'
|
|
662
|
-
))
|
|
663
|
-
|
|
664
|
-
def _check_hipaa_access_control(self):
|
|
665
|
-
"""HIPAA 164.312(a)(1): Access Control."""
|
|
666
|
-
evidence = []
|
|
667
|
-
status = 'failed'
|
|
668
|
-
|
|
669
|
-
# Check for user identification
|
|
670
|
-
auth_patterns = [r'user.*id', r'authentication', r'identity']
|
|
671
|
-
for pattern in auth_patterns:
|
|
672
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
673
|
-
if files:
|
|
674
|
-
evidence.extend(files[:3])
|
|
675
|
-
status = 'passed'
|
|
676
|
-
break
|
|
677
|
-
|
|
678
|
-
self.controls.append(ComplianceControl(
|
|
679
|
-
control_id='HIPAA-164.312(a)(1)',
|
|
680
|
-
framework='HIPAA',
|
|
681
|
-
category='Access Control',
|
|
682
|
-
title='Unique User Identification',
|
|
683
|
-
description='Verify unique user identification for accessing PHI',
|
|
684
|
-
status=status,
|
|
685
|
-
evidence=evidence[:5],
|
|
686
|
-
recommendation='Implement unique user accounts with individual credentials for all PHI access',
|
|
687
|
-
severity='critical' if status == 'failed' else 'low'
|
|
688
|
-
))
|
|
689
|
-
|
|
690
|
-
def _check_hipaa_audit(self):
|
|
691
|
-
"""HIPAA 164.312(b): Audit Controls."""
|
|
692
|
-
evidence = []
|
|
693
|
-
status = 'failed'
|
|
694
|
-
|
|
695
|
-
audit_patterns = [r'audit.*trail', r'access.*log', r'phi.*log']
|
|
696
|
-
for pattern in audit_patterns:
|
|
697
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
698
|
-
if files:
|
|
699
|
-
evidence.extend(files[:3])
|
|
700
|
-
status = 'passed'
|
|
701
|
-
break
|
|
702
|
-
|
|
703
|
-
self.controls.append(ComplianceControl(
|
|
704
|
-
control_id='HIPAA-164.312(b)',
|
|
705
|
-
framework='HIPAA',
|
|
706
|
-
category='Audit Controls',
|
|
707
|
-
title='PHI Access Audit Trail',
|
|
708
|
-
description='Verify audit trails for PHI access are maintained',
|
|
709
|
-
status=status,
|
|
710
|
-
evidence=evidence[:5],
|
|
711
|
-
recommendation='Implement comprehensive audit logging for all PHI access with who/what/when/where',
|
|
712
|
-
severity='critical' if status == 'failed' else 'low'
|
|
713
|
-
))
|
|
714
|
-
|
|
715
|
-
def _check_hipaa_integrity(self):
|
|
716
|
-
"""HIPAA 164.312(c)(1): Integrity Controls."""
|
|
717
|
-
evidence = []
|
|
718
|
-
status = 'failed'
|
|
719
|
-
|
|
720
|
-
integrity_patterns = [r'checksum', r'hash', r'signature', r'integrity']
|
|
721
|
-
for pattern in integrity_patterns:
|
|
722
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
723
|
-
if files:
|
|
724
|
-
evidence.extend(files[:3])
|
|
725
|
-
status = 'passed'
|
|
726
|
-
break
|
|
727
|
-
|
|
728
|
-
self.controls.append(ComplianceControl(
|
|
729
|
-
control_id='HIPAA-164.312(c)(1)',
|
|
730
|
-
framework='HIPAA',
|
|
731
|
-
category='Integrity',
|
|
732
|
-
title='Data Integrity Controls',
|
|
733
|
-
description='Verify mechanisms to protect PHI from improper alteration',
|
|
734
|
-
status=status,
|
|
735
|
-
evidence=evidence[:5],
|
|
736
|
-
recommendation='Implement checksums, digital signatures, or hashing for PHI integrity verification',
|
|
737
|
-
severity='high' if status == 'failed' else 'low'
|
|
738
|
-
))
|
|
739
|
-
|
|
740
|
-
def _check_hipaa_authentication(self):
|
|
741
|
-
"""HIPAA 164.312(d): Authentication."""
|
|
742
|
-
evidence = []
|
|
743
|
-
status = 'failed'
|
|
744
|
-
|
|
745
|
-
auth_patterns = [r'mfa', r'two.*factor', r'biometric', r'token.*auth']
|
|
746
|
-
for pattern in auth_patterns:
|
|
747
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
748
|
-
if files:
|
|
749
|
-
evidence.extend(files[:3])
|
|
750
|
-
status = 'passed'
|
|
751
|
-
break
|
|
752
|
-
|
|
753
|
-
self.controls.append(ComplianceControl(
|
|
754
|
-
control_id='HIPAA-164.312(d)',
|
|
755
|
-
framework='HIPAA',
|
|
756
|
-
category='Authentication',
|
|
757
|
-
title='Person Authentication',
|
|
758
|
-
description='Verify mechanisms to authenticate person or entity accessing PHI',
|
|
759
|
-
status=status,
|
|
760
|
-
evidence=evidence[:5],
|
|
761
|
-
recommendation='Implement multi-factor authentication for all PHI access',
|
|
762
|
-
severity='critical' if status == 'failed' else 'low'
|
|
763
|
-
))
|
|
764
|
-
|
|
765
|
-
def _check_hipaa_transmission(self):
|
|
766
|
-
"""HIPAA 164.312(e)(1): Transmission Security."""
|
|
767
|
-
evidence = []
|
|
768
|
-
status = 'failed'
|
|
769
|
-
|
|
770
|
-
transmission_patterns = [r'tls', r'ssl', r'https', r'encrypt.*transit']
|
|
771
|
-
for pattern in transmission_patterns:
|
|
772
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
773
|
-
if files:
|
|
774
|
-
evidence.extend(files[:3])
|
|
775
|
-
status = 'passed'
|
|
776
|
-
break
|
|
777
|
-
|
|
778
|
-
self.controls.append(ComplianceControl(
|
|
779
|
-
control_id='HIPAA-164.312(e)(1)',
|
|
780
|
-
framework='HIPAA',
|
|
781
|
-
category='Transmission Security',
|
|
782
|
-
title='PHI Transmission Encryption',
|
|
783
|
-
description='Verify PHI is encrypted during transmission',
|
|
784
|
-
status=status,
|
|
785
|
-
evidence=evidence[:5],
|
|
786
|
-
recommendation='Enforce TLS 1.2+ for all PHI transmissions, implement end-to-end encryption',
|
|
787
|
-
severity='critical' if status == 'failed' else 'low'
|
|
788
|
-
))
|
|
789
|
-
|
|
790
|
-
def _check_privacy_by_design(self):
|
|
791
|
-
"""GDPR Article 25: Privacy by design."""
|
|
792
|
-
evidence = []
|
|
793
|
-
status = 'failed'
|
|
794
|
-
|
|
795
|
-
privacy_patterns = [
|
|
796
|
-
r'data.*minimization',
|
|
797
|
-
r'privacy.*config',
|
|
798
|
-
r'consent',
|
|
799
|
-
r'gdpr'
|
|
800
|
-
]
|
|
801
|
-
|
|
802
|
-
for pattern in privacy_patterns:
|
|
803
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
804
|
-
if files:
|
|
805
|
-
evidence.extend(files[:3])
|
|
806
|
-
status = 'passed'
|
|
807
|
-
break
|
|
808
|
-
|
|
809
|
-
self.controls.append(ComplianceControl(
|
|
810
|
-
control_id='GDPR-25',
|
|
811
|
-
framework='GDPR',
|
|
812
|
-
category='Privacy by Design',
|
|
813
|
-
title='Data Minimization',
|
|
814
|
-
description='Verify data collection is limited to necessary purposes',
|
|
815
|
-
status=status,
|
|
816
|
-
evidence=evidence[:5],
|
|
817
|
-
recommendation='Implement data minimization, purpose limitation, and privacy-by-default configurations',
|
|
818
|
-
severity='high' if status == 'failed' else 'low'
|
|
819
|
-
))
|
|
820
|
-
|
|
821
|
-
def _check_gdpr_security(self):
|
|
822
|
-
"""GDPR Article 32: Security of processing."""
|
|
823
|
-
evidence = []
|
|
824
|
-
status = 'failed'
|
|
825
|
-
|
|
826
|
-
security_patterns = [r'encrypt', r'pseudonymization', r'anonymization']
|
|
827
|
-
for pattern in security_patterns:
|
|
828
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
829
|
-
if files:
|
|
830
|
-
evidence.extend(files[:3])
|
|
831
|
-
status = 'passed'
|
|
832
|
-
break
|
|
833
|
-
|
|
834
|
-
self.controls.append(ComplianceControl(
|
|
835
|
-
control_id='GDPR-32',
|
|
836
|
-
framework='GDPR',
|
|
837
|
-
category='Security',
|
|
838
|
-
title='Pseudonymization and Encryption',
|
|
839
|
-
description='Verify appropriate security measures for personal data',
|
|
840
|
-
status=status,
|
|
841
|
-
evidence=evidence[:5],
|
|
842
|
-
recommendation='Implement encryption and pseudonymization for personal data processing',
|
|
843
|
-
severity='high' if status == 'failed' else 'low'
|
|
844
|
-
))
|
|
845
|
-
|
|
846
|
-
def _check_breach_notification(self):
|
|
847
|
-
"""GDPR Article 33/34: Breach notification."""
|
|
848
|
-
evidence = []
|
|
849
|
-
status = 'failed'
|
|
850
|
-
|
|
851
|
-
breach_patterns = [
|
|
852
|
-
r'breach.*notification',
|
|
853
|
-
r'incident.*response',
|
|
854
|
-
r'security.*incident'
|
|
855
|
-
]
|
|
856
|
-
|
|
857
|
-
for pattern in breach_patterns:
|
|
858
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
859
|
-
if files:
|
|
860
|
-
evidence.extend(files[:3])
|
|
861
|
-
status = 'passed'
|
|
862
|
-
break
|
|
863
|
-
|
|
864
|
-
# Check for incident response documentation
|
|
865
|
-
incident_docs = ['SECURITY.md', 'docs/incident-response.md', '.github/SECURITY.md']
|
|
866
|
-
for doc in incident_docs:
|
|
867
|
-
if (self.target_path / doc).exists():
|
|
868
|
-
evidence.append(doc)
|
|
869
|
-
if status == 'failed':
|
|
870
|
-
status = 'warning'
|
|
871
|
-
break
|
|
872
|
-
|
|
873
|
-
self.controls.append(ComplianceControl(
|
|
874
|
-
control_id='GDPR-33',
|
|
875
|
-
framework='GDPR',
|
|
876
|
-
category='Breach Notification',
|
|
877
|
-
title='Incident Response Procedure',
|
|
878
|
-
description='Verify breach notification procedures are documented',
|
|
879
|
-
status=status,
|
|
880
|
-
evidence=evidence[:5],
|
|
881
|
-
recommendation='Document incident response procedures with 72-hour notification capability',
|
|
882
|
-
severity='high' if status == 'failed' else 'low'
|
|
883
|
-
))
|
|
884
|
-
|
|
885
|
-
def _check_data_deletion(self):
|
|
886
|
-
"""GDPR Article 17: Right to erasure."""
|
|
887
|
-
evidence = []
|
|
888
|
-
status = 'failed'
|
|
889
|
-
|
|
890
|
-
deletion_patterns = [
|
|
891
|
-
r'delete.*user',
|
|
892
|
-
r'erasure',
|
|
893
|
-
r'right.*forgotten',
|
|
894
|
-
r'data.*deletion',
|
|
895
|
-
r'gdpr.*delete'
|
|
896
|
-
]
|
|
897
|
-
|
|
898
|
-
for pattern in deletion_patterns:
|
|
899
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
900
|
-
if files:
|
|
901
|
-
evidence.extend(files[:3])
|
|
902
|
-
status = 'passed'
|
|
903
|
-
break
|
|
904
|
-
|
|
905
|
-
self.controls.append(ComplianceControl(
|
|
906
|
-
control_id='GDPR-17',
|
|
907
|
-
framework='GDPR',
|
|
908
|
-
category='Data Subject Rights',
|
|
909
|
-
title='Right to Erasure',
|
|
910
|
-
description='Verify data deletion capability is implemented',
|
|
911
|
-
status=status,
|
|
912
|
-
evidence=evidence[:5],
|
|
913
|
-
recommendation='Implement complete user data deletion including all backups and third-party systems',
|
|
914
|
-
severity='high' if status == 'failed' else 'low'
|
|
915
|
-
))
|
|
916
|
-
|
|
917
|
-
def _check_data_export(self):
|
|
918
|
-
"""GDPR Article 20: Data portability."""
|
|
919
|
-
evidence = []
|
|
920
|
-
status = 'failed'
|
|
921
|
-
|
|
922
|
-
export_patterns = [
|
|
923
|
-
r'export.*data',
|
|
924
|
-
r'data.*portability',
|
|
925
|
-
r'download.*data',
|
|
926
|
-
r'gdpr.*export'
|
|
927
|
-
]
|
|
928
|
-
|
|
929
|
-
for pattern in export_patterns:
|
|
930
|
-
files = self._search_files(pattern, case_sensitive=False)
|
|
931
|
-
if files:
|
|
932
|
-
evidence.extend(files[:3])
|
|
933
|
-
status = 'passed'
|
|
934
|
-
break
|
|
935
|
-
|
|
936
|
-
self.controls.append(ComplianceControl(
|
|
937
|
-
control_id='GDPR-20',
|
|
938
|
-
framework='GDPR',
|
|
939
|
-
category='Data Subject Rights',
|
|
940
|
-
title='Data Portability',
|
|
941
|
-
description='Verify data export capability is implemented',
|
|
942
|
-
status=status,
|
|
943
|
-
evidence=evidence[:5],
|
|
944
|
-
recommendation='Implement data export in machine-readable format (JSON, CSV)',
|
|
945
|
-
severity='medium' if status == 'failed' else 'low'
|
|
946
|
-
))
|
|
947
|
-
|
|
948
|
-
def _search_files(self, pattern: str, case_sensitive: bool = True) -> List[str]:
|
|
949
|
-
"""Search files for pattern matches."""
|
|
950
|
-
matches = []
|
|
951
|
-
flags = 0 if case_sensitive else re.IGNORECASE
|
|
952
|
-
|
|
953
|
-
try:
|
|
954
|
-
for root, dirs, files in os.walk(self.target_path):
|
|
955
|
-
# Skip common non-relevant directories
|
|
956
|
-
dirs[:] = [d for d in dirs if d not in {
|
|
957
|
-
'node_modules', '.git', '__pycache__', 'venv', '.venv',
|
|
958
|
-
'dist', 'build', 'coverage', '.next'
|
|
959
|
-
}]
|
|
960
|
-
|
|
961
|
-
for filename in files:
|
|
962
|
-
if filename.endswith(('.js', '.ts', '.py', '.go', '.java', '.md', '.yml', '.yaml', '.json')):
|
|
963
|
-
file_path = Path(root) / filename
|
|
964
|
-
try:
|
|
965
|
-
content = file_path.read_text(encoding='utf-8', errors='ignore')
|
|
966
|
-
if re.search(pattern, content, flags):
|
|
967
|
-
rel_path = str(file_path.relative_to(self.target_path))
|
|
968
|
-
matches.append(rel_path)
|
|
969
|
-
self.files_scanned += 1
|
|
970
|
-
except Exception:
|
|
971
|
-
pass
|
|
972
|
-
except Exception:
|
|
973
|
-
pass
|
|
974
|
-
|
|
975
|
-
return matches[:10] # Limit results
|
|
976
|
-
|
|
977
|
-
def _calculate_compliance_score(self) -> float:
|
|
978
|
-
"""Calculate overall compliance score (0-100)."""
|
|
979
|
-
if not self.controls:
|
|
980
|
-
return 0.0
|
|
981
|
-
|
|
982
|
-
# Weight by severity
|
|
983
|
-
severity_weights = {'critical': 4.0, 'high': 3.0, 'medium': 2.0, 'low': 1.0}
|
|
984
|
-
status_scores = {'passed': 1.0, 'warning': 0.5, 'failed': 0.0, 'not_applicable': None}
|
|
985
|
-
|
|
986
|
-
total_weight = 0.0
|
|
987
|
-
total_score = 0.0
|
|
988
|
-
|
|
989
|
-
for control in self.controls:
|
|
990
|
-
score = status_scores.get(control.status)
|
|
991
|
-
if score is not None: # Skip N/A
|
|
992
|
-
weight = severity_weights.get(control.severity, 1.0)
|
|
993
|
-
total_weight += weight
|
|
994
|
-
total_score += score * weight
|
|
995
|
-
|
|
996
|
-
return round((total_score / total_weight) * 100, 1) if total_weight > 0 else 0.0
|
|
997
|
-
|
|
998
|
-
def _get_compliance_level(self, score: float) -> str:
|
|
999
|
-
"""Get compliance level from score."""
|
|
1000
|
-
if score >= 90:
|
|
1001
|
-
return "COMPLIANT"
|
|
1002
|
-
elif score >= 70:
|
|
1003
|
-
return "PARTIALLY_COMPLIANT"
|
|
1004
|
-
elif score >= 50:
|
|
1005
|
-
return "NON_COMPLIANT"
|
|
1006
|
-
return "CRITICAL_GAPS"
|
|
1007
|
-
|
|
1008
|
-
def _print_summary(self, result: Dict):
|
|
1009
|
-
"""Print compliance summary."""
|
|
1010
|
-
print("\n" + "=" * 60)
|
|
1011
|
-
print("COMPLIANCE CHECK SUMMARY")
|
|
1012
|
-
print("=" * 60)
|
|
1013
|
-
print(f"Target: {result['target']}")
|
|
1014
|
-
print(f"Framework: {result['framework'].upper()}")
|
|
1015
|
-
print(f"Scan duration: {result['scan_duration_seconds']}s")
|
|
1016
|
-
print(f"Compliance score: {result['compliance_score']}% ({result['compliance_level']})")
|
|
1017
|
-
print()
|
|
1018
|
-
|
|
1019
|
-
summary = result['summary']
|
|
1020
|
-
print(f"Controls checked: {summary['total']}")
|
|
1021
|
-
print(f" Passed: {summary['passed']}")
|
|
1022
|
-
print(f" Failed: {summary['failed']}")
|
|
1023
|
-
print(f" Warning: {summary['warnings']}")
|
|
1024
|
-
print(f" N/A: {summary['not_applicable']}")
|
|
1025
|
-
print("=" * 60)
|
|
1026
|
-
|
|
1027
|
-
# Show failed controls
|
|
1028
|
-
failed = [c for c in result['controls'] if c['status'] == 'failed']
|
|
1029
|
-
if failed:
|
|
1030
|
-
print("\nFailed controls requiring remediation:")
|
|
1031
|
-
for control in failed[:5]:
|
|
1032
|
-
print(f"\n [{control['severity'].upper()}] {control['control_id']}")
|
|
1033
|
-
print(f" {control['title']}")
|
|
1034
|
-
print(f" Recommendation: {control['recommendation']}")
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
def main():
|
|
1038
|
-
"""Main entry point for CLI."""
|
|
1039
|
-
parser = argparse.ArgumentParser(
|
|
1040
|
-
description="Check compliance against SOC 2, PCI-DSS, HIPAA, GDPR",
|
|
1041
|
-
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
1042
|
-
epilog="""
|
|
1043
|
-
Examples:
|
|
1044
|
-
%(prog)s /path/to/project
|
|
1045
|
-
%(prog)s /path/to/project --framework soc2
|
|
1046
|
-
%(prog)s /path/to/project --framework pci-dss --output report.json
|
|
1047
|
-
%(prog)s . --framework all --verbose
|
|
1048
|
-
"""
|
|
1049
|
-
)
|
|
1050
|
-
|
|
1051
|
-
parser.add_argument(
|
|
1052
|
-
"target",
|
|
1053
|
-
help="Directory to check for compliance"
|
|
1054
|
-
)
|
|
1055
|
-
parser.add_argument(
|
|
1056
|
-
"--framework", "-f",
|
|
1057
|
-
choices=["soc2", "pci-dss", "hipaa", "gdpr", "all"],
|
|
1058
|
-
default="all",
|
|
1059
|
-
help="Compliance framework to check (default: all)"
|
|
1060
|
-
)
|
|
1061
|
-
parser.add_argument(
|
|
1062
|
-
"--verbose", "-v",
|
|
1063
|
-
action="store_true",
|
|
1064
|
-
help="Enable verbose output"
|
|
1065
|
-
)
|
|
1066
|
-
parser.add_argument(
|
|
1067
|
-
"--json",
|
|
1068
|
-
action="store_true",
|
|
1069
|
-
help="Output results as JSON"
|
|
1070
|
-
)
|
|
1071
|
-
parser.add_argument(
|
|
1072
|
-
"--output", "-o",
|
|
1073
|
-
help="Output file path"
|
|
1074
|
-
)
|
|
1075
|
-
|
|
1076
|
-
args = parser.parse_args()
|
|
1077
|
-
|
|
1078
|
-
checker = ComplianceChecker(
|
|
1079
|
-
target_path=args.target,
|
|
1080
|
-
framework=args.framework,
|
|
1081
|
-
verbose=args.verbose
|
|
1082
|
-
)
|
|
1083
|
-
|
|
1084
|
-
result = checker.check()
|
|
1085
|
-
|
|
1086
|
-
if args.json:
|
|
1087
|
-
output = json.dumps(result, indent=2)
|
|
1088
|
-
if args.output:
|
|
1089
|
-
with open(args.output, 'w') as f:
|
|
1090
|
-
f.write(output)
|
|
1091
|
-
print(f"\nResults written to {args.output}")
|
|
1092
|
-
else:
|
|
1093
|
-
print(output)
|
|
1094
|
-
elif args.output:
|
|
1095
|
-
with open(args.output, 'w') as f:
|
|
1096
|
-
json.dump(result, f, indent=2)
|
|
1097
|
-
print(f"\nResults written to {args.output}")
|
|
1098
|
-
|
|
1099
|
-
# Exit with error code based on compliance level
|
|
1100
|
-
if result.get('compliance_level') == 'CRITICAL_GAPS':
|
|
1101
|
-
sys.exit(2)
|
|
1102
|
-
if result.get('compliance_level') == 'NON_COMPLIANT':
|
|
1103
|
-
sys.exit(1)
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
if __name__ == "__main__":
|
|
1107
|
-
main()
|