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
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Obsidian Memory
|
|
4
4
|
|
|
5
|
-
Obsidian (`C:\Users\hiz\Documents\
|
|
5
|
+
Obsidian (`C:\Users\hiz\Documents\Novahiz`) is the user's second memory.
|
|
6
6
|
|
|
7
7
|
### Rules
|
|
8
8
|
1. When the user asks to **save / memorize / update obsidian memory**, load the `memory-save` skill and follow its procedure without exception.
|
|
9
|
-
2. Determine the target folder **only** from the `
|
|
9
|
+
2. Determine the target folder **only** from the `Novahiz\_meta\routing.md` table (source of truth). Never guess. When ambiguous, ask the user.
|
|
10
10
|
3. Display the chosen path before writing.
|
|
11
11
|
4. Never write to `index.md`, `log.md`, `hot.md`, `.manifest.json`, `_meta/`, or `.obsidian/` **except through a dedicated maintenance skill** (wiki-ingest/wiki-lint/wiki-status for index/log/hot/manifest; graph-colorize for `.obsidian/graph.json`, with mandatory backup). The `memory-save` skill writes only to the targeted content page.
|
|
12
12
|
5. Never create a root folder on your own. Every new category requires user agreement and an update to `routing.md`.
|
|
@@ -28,26 +28,15 @@ Playwright uses a **persistent profile** that preserves data across sessions (co
|
|
|
28
28
|
|
|
29
29
|
## Behavioral & Quality Rules
|
|
30
30
|
|
|
31
|
-
1. **Mandatory humanizer on text and code** — On every code or text modification, load the `humanizer` skill and apply its rules (remove AI writing tics: not-X-but-Y contrasts, forced triads, excessive dashes, empty phrases, marketing jargon).
|
|
32
|
-
2. **
|
|
33
|
-
3. **Impeccable / /impeccable live — NEVER use sub-agents** — The `impeccable` skill, the `/impeccable live` command, and any use of impeccable skills must **never** start in sub-agent mode, **ever**, even if the task seems suitable (distributed analysis, multiple variants, multi-surface audit). **Single exception:** only when the user explicitly requests launching a sub-agent ("launch a sub-agent", "use a sub-agent", etc.). The main agent always retains the interactive session and browser context.
|
|
34
|
-
4. **Supabase** — On any Supabase task (database, auth, RLS, Edge Functions, migrations, Storage, Realtime, CLI/MCP), load the `supabase` and `supabase-postgres-best-practices` skills before acting.
|
|
31
|
+
1. **Mandatory humanizer on text and code** — On every code or text modification meant for a reader, load the `novahiz-humanizer` skill and apply its rules (remove AI writing tics: not-X-but-Y contrasts, forced triads, excessive dashes, empty phrases, marketing jargon). Browser tasks (navigation, search, extraction) proceed as direct actions without a roadmap.
|
|
32
|
+
2. **Supabase** — On any Supabase task (database, auth, RLS, Edge Functions, migrations, Storage, Realtime, CLI/MCP), load the `novahiz-supabase` and `novahiz-postgres` skills before acting.
|
|
35
33
|
5. **Honesty and critical thinking** — Always be honest. Avoid false good ideas. Maintain critical thinking. **Zero simulation objective:** never claim to have executed, tested, or verified what was not. Explicitly report uncertainties and assumptions.
|
|
36
34
|
6. **Propose next steps** — After completing a task, always honestly propose the relevant next step. Do not invent unnecessary work or mask failures.
|
|
37
35
|
7. **Challenge the request** — Take the initiative to question the user's request when it is inconsistent, ambiguous, risky, or suboptimal. Explain why and propose an alternative.
|
|
38
36
|
8. **Architecture quality** — Always adopt a modular, scalable, and maintainable approach. Never sacrifice quality for speed.
|
|
39
37
|
9. **Todo list in real time** — Keep the todo list updated throughout the task: move a step to `in_progress` before starting it, mark it `completed` once verified, and add steps discovered along the way. No frozen lists or batch completion at the end.
|
|
40
38
|
|
|
41
|
-
## Design Rules
|
|
42
|
-
|
|
43
|
-
### Workflow per operation type
|
|
44
|
-
|
|
45
|
-
| Operation | Mandatory command | When |
|
|
46
|
-
|-----------|------------------|------|
|
|
47
|
-
| **Create** a design | `/impeccable shape` | At the start, to establish the initial shape |
|
|
48
|
-
| **Fix / Repair** a design | `impeccable audit` + `/impeccable critique` | Before and after the fix |
|
|
49
|
-
| **Improve** a design | `/impeccable polish` | To refine and elevate |
|
|
50
|
-
| **Verify** after a major task | `/impeccable critique` (+ `impeccable audit` if needed) | At the end of any significant design task |
|
|
39
|
+
## Design Rules
|
|
51
40
|
|
|
52
41
|
### Absolute rule — AI patterns
|
|
53
42
|
|
|
@@ -1,9 +1,73 @@
|
|
|
1
1
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
2
|
import { spawnSync } from "node:child_process";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
|
|
7
|
+
// Inlined from src/prompt-rewriter.ts to avoid broken relative path in installed plugin
|
|
8
|
+
type RewriteResult = { original: string; rewritten: string; sourceLanguage: string; wasRewritten: boolean };
|
|
9
|
+
|
|
10
|
+
function detectLanguage(prompt: string): string {
|
|
11
|
+
if (/[\u0600-\u06FF]/.test(prompt)) return "ar";
|
|
12
|
+
return "en";
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const AR_EN: Array<[RegExp, string]> = [
|
|
16
|
+
[/اصلاح|اصلح/g, "fix"], [/انشاء|اصنع/g, "create"], [/اضافة|اضف/g, "add"],
|
|
17
|
+
[/حذف|احذف/g, "remove"], [/تعديل|عدّل/g, "modify"], [/هاكود|اكتشف/g, "debug"],
|
|
18
|
+
[/اختبار|اختبر/g, "test"], [/ترحيل|هجر/g, "migrate"], [/اضبط|ضبط/g, "configure"],
|
|
19
|
+
[/تحسين|حسّن/g, "optimize"], [/تبسيط|بسّط/g, "simplify"], [/تنظيف|نظّف/g, "clean up"],
|
|
20
|
+
[/تنفيذ|طبّق/g, "implement"], [/استخدام|استخدم/g, "use"], [/استبدال|بدّل/g, "replace"],
|
|
21
|
+
[/كتابة|اكتب/g, "write"], [/قراءة|اقرأ/g, "read"], [/حفظ|احفظ/g, "save"],
|
|
22
|
+
[/عرض|اعرض/g, "display"], [/اخفاء|اخفي/g, "hide"], [/تفعيل|فعّل/g, "enable"],
|
|
23
|
+
[/تعطيل|عطّل/g, "disable"], [/دالة/g, "function"], [/فئة/g, "class"],
|
|
24
|
+
[/طريقة/g, "method"], [/متغير/g, "variable"], [/ملف/g, "file"], [/شفرة/g, "code"],
|
|
25
|
+
[/مشكلة/g, "issue"], [/حل/g, "solution"], [/كيف/g, "how to"], [/لماذا/g, "why"],
|
|
26
|
+
[/أي/g, "which"], [/افعل/g, "do"], [/في/g, "in"], [/من/g, "from"], [/على/g, "on"],
|
|
27
|
+
[/صفحة/g, "page"], [/هبوط/g, "landing"], [/متجاوبة/g, "responsive"],
|
|
28
|
+
[/تصميم/g, "design"], [/واجهة/g, "interface"], [/زر/g, "button"], [/قائمة/g, "menu"],
|
|
29
|
+
[/شريط/g, "bar"], [/نافذة/g, "window"], [/شكل/g, "form"],
|
|
30
|
+
[/الخادم|السيرفر/g, "server"], [/قاعدة البيانات/g, "database"],
|
|
31
|
+
[/صفحة الهبوط/g, "landing page"], [/المصادقة/g, "auth"],
|
|
32
|
+
[/تسجيل الدخول/g, "login"], [/خطأ/g, "bug"], [/اداء/g, "performance"], [/امان/g, "security"],
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
function rewritePrompt(prompt: string): RewriteResult {
|
|
36
|
+
const sourceLanguage = detectLanguage(prompt);
|
|
37
|
+
if (sourceLanguage === "en") {
|
|
38
|
+
let r = prompt.trim().replace(/^I\s+want\s+to\s+/i, "").replace(/^I\s+need\s+to\s+/i, "")
|
|
39
|
+
.replace(/^Can\s+you\s+/i, "").replace(/^Could\s+you\s+/i, "").replace(/^Please\s+/i, "")
|
|
40
|
+
.replace(/^I\s+would\s+like\s+to\s+/i, "").replace(/^It\s+would\s+be\s+great\s+if\s+you\s+could\s+/i, "")
|
|
41
|
+
.replace(/[.!?]+$/, "").trim();
|
|
42
|
+
return { original: prompt, rewritten: r, sourceLanguage, wasRewritten: r !== prompt };
|
|
43
|
+
}
|
|
44
|
+
let result = prompt;
|
|
45
|
+
for (const [pattern, replacement] of AR_EN) result = result.replace(pattern, replacement);
|
|
46
|
+
let r = result.trim().replace(/^I\s+want\s+to\s+/i, "").replace(/^I\s+need\s+to\s+/i, "")
|
|
47
|
+
.replace(/^Can\s+you\s+/i, "").replace(/^Could\s+you\s+/i, "").replace(/^Please\s+/i, "")
|
|
48
|
+
.replace(/^I\s+would\s+like\s+to\s+/i, "").replace(/^It\s+would\s+be\s+great\s+if\s+you\s+could\s+/i, "")
|
|
49
|
+
.replace(/[.!?]+$/, "").trim();
|
|
50
|
+
return { original: prompt, rewritten: r, sourceLanguage, wasRewritten: true };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function ensureProjectMemory(cwd: string): boolean {
|
|
54
|
+
try {
|
|
55
|
+
const root = join(cwd, "project-memory");
|
|
56
|
+
const slots = join(root, "slots");
|
|
57
|
+
const index = join(root, "index.json");
|
|
58
|
+
if (!existsSync(root)) mkdirSync(root, { recursive: true });
|
|
59
|
+
if (!existsSync(slots)) mkdirSync(slots, { recursive: true });
|
|
60
|
+
if (!existsSync(index)) {
|
|
61
|
+
const empty = { version: 1, updated: new Date().toISOString(), slots: [] };
|
|
62
|
+
writeFileSync(index, `${JSON.stringify(empty, null, 2)}\n`, "utf8");
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
} catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
7
71
|
const HOME =
|
|
8
72
|
process.env.NOVAHIZ_HOME && process.env.NOVAHIZ_HOME.length > 0
|
|
9
73
|
? process.env.NOVAHIZ_HOME
|
|
@@ -28,8 +92,10 @@ function readConfig(): NovahizConfig {
|
|
|
28
92
|
|
|
29
93
|
const CONFIG = readConfig();
|
|
30
94
|
const GATE = CONFIG.gate ?? {};
|
|
31
|
-
|
|
32
|
-
|
|
95
|
+
// H1: envEscape is NOT configurable — a writable config must not be able to
|
|
96
|
+
// redirect the kill-switch to an unrelated variable (e.g. CI=false).
|
|
97
|
+
// Single escape hatch name after brand rename.
|
|
98
|
+
const ESCAPE = (process.env.NOVAHIZ_GATE ?? "").toLowerCase();
|
|
33
99
|
// gate.enabled=false disables the plugin the same way the CLI gate does (see src/commands/gate.ts).
|
|
34
100
|
// gate.mode (block/warn/audit) stays owned by the CLI: the plugin only forwards the gate exit code.
|
|
35
101
|
const DISABLED =
|
|
@@ -40,9 +106,30 @@ const GATE_TOOLS = new Set(
|
|
|
40
106
|
|
|
41
107
|
type RunResult = { status: number; stdout: string; stderr: string; spawnError?: string };
|
|
42
108
|
|
|
109
|
+
// C1: timeout prevents a hung CLI from freezing the whole OpenCode process.
|
|
110
|
+
// C2: maxBuffer caps output; oversized output is treated as a gate failure,
|
|
111
|
+
// never as truncated-then-allowed.
|
|
112
|
+
const RUN_TIMEOUT_MS = 10_000;
|
|
113
|
+
const RUN_MAX_BUFFER = 1_048_576;
|
|
114
|
+
|
|
43
115
|
function run(args: string[], input?: string): RunResult {
|
|
44
|
-
|
|
116
|
+
// C1: On Windows, SIGTERM is emulated via process.kill() which sends
|
|
117
|
+
//TerminateProcess + exit code 1, causing the CLI to report status 1 instead
|
|
118
|
+
//of being properly terminated. Use SIGKILL on Windows (unavoidable but at
|
|
119
|
+
//least doesn't pretend graceful shutdown is possible).
|
|
120
|
+
const isWin = process.platform === "win32";
|
|
121
|
+
const result = spawnSync(NODE, [CLI, ...args], {
|
|
122
|
+
encoding: "utf8",
|
|
123
|
+
input,
|
|
124
|
+
timeout: RUN_TIMEOUT_MS,
|
|
125
|
+
maxBuffer: RUN_MAX_BUFFER,
|
|
126
|
+
killSignal: isWin ? "SIGKILL" : "SIGTERM"
|
|
127
|
+
});
|
|
45
128
|
if (result.error) return { status: 1, stdout: "", stderr: "", spawnError: result.error.message };
|
|
129
|
+
// On Windows, timeout-killed processes always exit with status 1 (TerminateProcess).
|
|
130
|
+
// The `signal` property is set when the process was killed by a signal.
|
|
131
|
+
const timedOut = result.status === 1 && !result.stdout?.trim() && Boolean(result.signal);
|
|
132
|
+
if (timedOut) return { status: 1, stdout: "", stderr: "Novahiz timed out" };
|
|
46
133
|
return { status: result.status ?? 1, stdout: result.stdout ?? "", stderr: result.stderr ?? "" };
|
|
47
134
|
}
|
|
48
135
|
|
|
@@ -56,6 +143,12 @@ function textFromParts(parts: unknown): string {
|
|
|
56
143
|
return chunks.join("\n").trim();
|
|
57
144
|
}
|
|
58
145
|
|
|
146
|
+
// H2: Session IDs must be non-empty strings. This guards against undefined/null
|
|
147
|
+
// being passed to spawnSync env, which would throw on Windows.
|
|
148
|
+
function isValidSessionId(id: unknown): id is string {
|
|
149
|
+
return typeof id === "string" && id.trim().length > 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
59
152
|
export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
60
153
|
const loadedBySession = new Map<string, Set<string>>();
|
|
61
154
|
const categoriesBySession = new Map<string, string[]>();
|
|
@@ -65,7 +158,7 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
65
158
|
|
|
66
159
|
const log = async (level: "info" | "warn", message: string): Promise<void> => {
|
|
67
160
|
try {
|
|
68
|
-
await client.app.log({ body: { service: "
|
|
161
|
+
await client.app.log({ body: { service: "Novahiz", level, message } });
|
|
69
162
|
} catch {
|
|
70
163
|
return;
|
|
71
164
|
}
|
|
@@ -79,10 +172,9 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
79
172
|
};
|
|
80
173
|
|
|
81
174
|
// Sessions only vanish from memory on session.deleted, which may never arrive.
|
|
82
|
-
// Prune entries idle for longer than SESSION_TTL_MS
|
|
175
|
+
// Prune entries idle for longer than SESSION_TTL_MS on every access.
|
|
83
176
|
const touch = (sessionID: string): void => {
|
|
84
177
|
lastSeenBySession.set(sessionID, Date.now());
|
|
85
|
-
if (lastSeenBySession.size < 50) return;
|
|
86
178
|
const cutoff = Date.now() - SESSION_TTL_MS;
|
|
87
179
|
for (const [id, seen] of lastSeenBySession) {
|
|
88
180
|
if (seen < cutoff) forget(id);
|
|
@@ -94,6 +186,8 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
94
186
|
|
|
95
187
|
return {
|
|
96
188
|
config: async (input) => {
|
|
189
|
+
ensureProjectMemory(process.cwd());
|
|
190
|
+
if (DISABLED) return;
|
|
97
191
|
try {
|
|
98
192
|
const config = input as { mcp?: Record<string, unknown> };
|
|
99
193
|
if (!config.mcp) config.mcp = {};
|
|
@@ -132,11 +226,23 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
132
226
|
},
|
|
133
227
|
|
|
134
228
|
"chat.message": async (input, output) => {
|
|
229
|
+
ensureProjectMemory(process.cwd());
|
|
230
|
+
if (DISABLED) return;
|
|
135
231
|
try {
|
|
232
|
+
if (!isValidSessionId(input.sessionID)) return;
|
|
136
233
|
touch(input.sessionID);
|
|
137
234
|
const text = textFromParts(output.parts);
|
|
138
235
|
if (text.length === 0) return;
|
|
139
|
-
|
|
236
|
+
|
|
237
|
+
// Prompt rewriter: translate non-English prompts to optimized English
|
|
238
|
+
// before classification. Responses always match the user's language.
|
|
239
|
+
const rewrite = rewritePrompt(text);
|
|
240
|
+
const classifyText = rewrite.rewritten;
|
|
241
|
+
if (rewrite.wasRewritten) {
|
|
242
|
+
await log("info", `Prompt rewritten: ${rewrite.sourceLanguage} → English ("${classifyText.slice(0, 80)}")`);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const result = run(["classify", classifyText]);
|
|
140
246
|
if (result.status !== 0) {
|
|
141
247
|
await log("warn", `Classify failed (exit ${result.status}), no enforcement injected: ${result.stderr.trim().slice(0, 200)}`);
|
|
142
248
|
return;
|
|
@@ -155,6 +261,12 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
155
261
|
await log("warn", "Classify returned invalid JSON, no enforcement injected");
|
|
156
262
|
return;
|
|
157
263
|
}
|
|
264
|
+
// M5: the `as` cast is compile-time only — validate the shape at runtime
|
|
265
|
+
// so a malformed classify response cannot silently disable enforcement.
|
|
266
|
+
if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.categories)) {
|
|
267
|
+
await log("warn", "Classify returned unexpected structure, no enforcement injected");
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
158
270
|
const categories = (parsed.categories ?? []).map((entry) => entry.id);
|
|
159
271
|
categoriesBySession.set(input.sessionID, categories);
|
|
160
272
|
const primary = parsed.primary ?? categories[0] ?? null;
|
|
@@ -165,8 +277,11 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
165
277
|
const providers = parsed.providers ?? [];
|
|
166
278
|
const lines = [
|
|
167
279
|
"[Novahiz enforcement]",
|
|
168
|
-
`Categories
|
|
280
|
+
`Categories detected: ${categories.join(", ") || "none"}${primary ? ` (primary: ${primary})` : ""}`
|
|
169
281
|
];
|
|
282
|
+
if (rewrite.wasRewritten) {
|
|
283
|
+
lines.push(`User language: ${rewrite.sourceLanguage} — respond in this language, not English.`);
|
|
284
|
+
}
|
|
170
285
|
if (roadmap) {
|
|
171
286
|
lines.push(`Roadmap ${roadmap.id}:`);
|
|
172
287
|
roadmap.steps.forEach((step, index) => {
|
|
@@ -174,9 +289,9 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
174
289
|
lines.push(` ${index + 1}. [${step.kind}] ${step.label}${skills}`);
|
|
175
290
|
});
|
|
176
291
|
}
|
|
177
|
-
if (enforced.length > 0) lines.push(`
|
|
178
|
-
if (suggested.length > 0) lines.push(`
|
|
179
|
-
if (providers.length > 0) lines.push(`
|
|
292
|
+
if (enforced.length > 0) lines.push(`Required skills (roadmap): ${enforced.join(", ")}`);
|
|
293
|
+
if (suggested.length > 0) lines.push(`Suggested skills: ${suggested.join(", ")}`);
|
|
294
|
+
if (providers.length > 0) lines.push(`Tools for this task: ${providers.join(", ")}`);
|
|
180
295
|
const ledger = run(["task", "current", "--session", input.sessionID]);
|
|
181
296
|
if (ledger.status === 0 && ledger.stdout.trim().length > 0) {
|
|
182
297
|
try {
|
|
@@ -186,9 +301,10 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
186
301
|
await log("warn", "Ledger state is invalid JSON, enforcement injected without the task summary");
|
|
187
302
|
}
|
|
188
303
|
}
|
|
189
|
-
lines.push("
|
|
190
|
-
lines.push("
|
|
191
|
-
lines.push("Config
|
|
304
|
+
lines.push("The gate blocks edit/write/patch/apply_patch/bash/shell until the required skills are loaded via skill({name:\"...\"}).");
|
|
305
|
+
lines.push("The gate is content-aware: novahiz-humanizer for prose; design files take no style gate rule.");
|
|
306
|
+
lines.push("Config edited = opencode restart required (config read at import).");
|
|
307
|
+
lines.push("Memory lives in project-memory/ under the project root (cwd): index.json + fixed-size slots (8000 chars / 200 lines) with compact → archive → new-slot rotation. Use the MCP memory_* tools to read and append.");
|
|
192
308
|
enforcementBySession.set(input.sessionID, lines.join("\n"));
|
|
193
309
|
} catch (error) {
|
|
194
310
|
await log("warn", `chat.message hook failed, no enforcement injected: ${String(error).slice(0, 200)}`);
|
|
@@ -198,14 +314,21 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
198
314
|
|
|
199
315
|
"experimental.chat.system.transform": async (input, output) => {
|
|
200
316
|
if (DISABLED) return;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
317
|
+
try {
|
|
318
|
+
const sessionID = input.sessionID;
|
|
319
|
+
if (!sessionID) return;
|
|
320
|
+
const block = enforcementBySession.get(sessionID);
|
|
321
|
+
if (block) output.system.push(block);
|
|
322
|
+
} catch (error) {
|
|
323
|
+
await log("warn", `system.transform hook failed: ${String(error).slice(0, 200)}`);
|
|
324
|
+
}
|
|
205
325
|
},
|
|
206
326
|
|
|
207
327
|
"tool.execute.before": async (input, output) => {
|
|
208
328
|
try {
|
|
329
|
+
// H-Plugin: validate session ID before using it — prevents undefined/null
|
|
330
|
+
// from being passed to spawnSync env (throws on Windows).
|
|
331
|
+
if (!isValidSessionId(input.sessionID)) return;
|
|
209
332
|
touch(input.sessionID);
|
|
210
333
|
if (!loadedBySession.has(input.sessionID)) loadedBySession.set(input.sessionID, new Set());
|
|
211
334
|
const loaded = loadedBySession.get(input.sessionID)!;
|
|
@@ -215,7 +338,12 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
215
338
|
const name = args?.name ?? args?.skill;
|
|
216
339
|
if (name) {
|
|
217
340
|
loaded.add(String(name));
|
|
218
|
-
|
|
341
|
+
// H3: surface session-load failures — otherwise the gate blocks later
|
|
342
|
+
// with no trace of why the skill was never recorded.
|
|
343
|
+
const loadResult = run(["session-load", "--session", input.sessionID, "--skill", String(name)]);
|
|
344
|
+
if (loadResult.status !== 0) {
|
|
345
|
+
await log("warn", `session-load failed for skill ${name}: ${(loadResult.stderr || "").trim().slice(0, 200)}`);
|
|
346
|
+
}
|
|
219
347
|
}
|
|
220
348
|
return;
|
|
221
349
|
}
|
|
@@ -245,9 +373,13 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
245
373
|
})()
|
|
246
374
|
);
|
|
247
375
|
|
|
376
|
+
// H2: fail-closed — an unavailable gate denies the tool call instead of
|
|
377
|
+
// silently bypassing enforcement. NOVAHIZ_GATE=off remains the escape hatch.
|
|
248
378
|
if (result.spawnError) {
|
|
249
|
-
await log("warn", `Gate unavailable,
|
|
250
|
-
|
|
379
|
+
await log("warn", `Gate unavailable, denying the tool call: ${result.spawnError}`);
|
|
380
|
+
throw new Error(
|
|
381
|
+
`Novahiz gate blocked ${input.tool}: gate unavailable (${result.spawnError}). Fix the install (run sync, check catalog/) or set NOVAHIZ_GATE=off to disable.`
|
|
382
|
+
);
|
|
251
383
|
}
|
|
252
384
|
if (result.status === 2) {
|
|
253
385
|
throw new Error(`Novahiz gate blocked ${input.tool}.\n${result.stdout}`);
|
|
@@ -259,7 +391,9 @@ export const NovahizPlugin: Plugin = async ({ client }) => {
|
|
|
259
391
|
}
|
|
260
392
|
} catch (error) {
|
|
261
393
|
if (error instanceof Error && error.message.startsWith("Novahiz gate")) throw error;
|
|
262
|
-
|
|
394
|
+
// H2: fail-closed — unknown gate errors deny, they never bypass.
|
|
395
|
+
await log("warn", `Gate error, denying the tool call as precaution: ${String(error)}`);
|
|
396
|
+
throw new Error(`Novahiz gate blocked ${input.tool}: internal gate error. Set NOVAHIZ_GATE=off to disable.`);
|
|
263
397
|
}
|
|
264
398
|
}
|
|
265
399
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
Apache License
|
|
3
2
|
Version 2.0, January 2004
|
|
4
3
|
http://www.apache.org/licenses/
|
|
@@ -49,7 +48,7 @@
|
|
|
49
48
|
"Contribution" shall mean any work of authorship, including
|
|
50
49
|
the original version of the Work and any modifications or additions
|
|
51
50
|
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
-
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
51
|
+
submitted to the Licensor for inclusion in the Work by the copyright owner
|
|
53
52
|
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
53
|
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
54
|
means any form of electronic, verbal, or written communication sent
|
|
@@ -61,7 +60,7 @@
|
|
|
61
60
|
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
61
|
|
|
63
62
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
-
on behalf of whom a Contribution has been received by Licensor and
|
|
63
|
+
on behalf of whom a Contribution has been received by the Licensor and
|
|
65
64
|
subsequently incorporated within the Work.
|
|
66
65
|
|
|
67
66
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
@@ -107,7 +106,7 @@
|
|
|
107
106
|
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
107
|
distribution, then any Derivative Works that You distribute must
|
|
109
108
|
include a readable copy of the attribution notices contained
|
|
110
|
-
within such NOTICE file, excluding
|
|
109
|
+
within such NOTICE file, excluding any notices that do not
|
|
111
110
|
pertain to any part of the Derivative Works, in at least one
|
|
112
111
|
of the following places: within a NOTICE text file distributed
|
|
113
112
|
as part of the Derivative Works; within the Source form or
|
|
@@ -176,18 +175,7 @@
|
|
|
176
175
|
|
|
177
176
|
END OF TERMS AND CONDITIONS
|
|
178
177
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
To apply the Apache License to your work, attach the following
|
|
182
|
-
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
-
replaced with your own identifying information. (Don't include
|
|
184
|
-
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
-
comment syntax for the file format. We also recommend that a
|
|
186
|
-
file or class name and description of purpose be included on the
|
|
187
|
-
same "printed page" as the copyright notice for easier
|
|
188
|
-
identification within third-party archives.
|
|
189
|
-
|
|
190
|
-
Copyright [yyyy] [name of copyright owner]
|
|
178
|
+
Copyright 2025 Simone Avogadro
|
|
191
179
|
|
|
192
180
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
181
|
you may not use this file except in compliance with the License.
|
|
@@ -199,4 +187,4 @@
|
|
|
199
187
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
188
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
189
|
See the License for the specific language governing permissions and
|
|
202
|
-
limitations under the License.
|
|
190
|
+
limitations under the License.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# API Extraction Patterns
|
|
2
|
+
|
|
3
|
+
Patterns and grep commands for finding HTTP API calls in decompiled Android source code.
|
|
4
|
+
|
|
5
|
+
## Retrofit
|
|
6
|
+
|
|
7
|
+
Retrofit is the most common HTTP client in Android apps. API endpoints are declared as annotated interface methods.
|
|
8
|
+
|
|
9
|
+
### Annotations to search for
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# HTTP method annotations
|
|
13
|
+
grep -rn '@GET\|@POST\|@PUT\|@DELETE\|@PATCH\|@HEAD' sources/
|
|
14
|
+
|
|
15
|
+
# Parameter annotations
|
|
16
|
+
grep -rn '@Query\|@QueryMap\|@Path\|@Body\|@Field\|@FieldMap\|@Part\|@Header\|@HeaderMap' sources/
|
|
17
|
+
|
|
18
|
+
# Headers annotation (static headers)
|
|
19
|
+
grep -rn '@Headers' sources/
|
|
20
|
+
|
|
21
|
+
# Base URL configuration
|
|
22
|
+
grep -rn 'baseUrl\|\.baseUrl(' sources/
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Typical Retrofit interface
|
|
26
|
+
|
|
27
|
+
```java
|
|
28
|
+
public interface ApiService {
|
|
29
|
+
@GET("users/{id}")
|
|
30
|
+
Call<User> getUser(@Path("id") String userId);
|
|
31
|
+
|
|
32
|
+
@POST("auth/login")
|
|
33
|
+
@Headers({"Content-Type: application/json"})
|
|
34
|
+
Call<LoginResponse> login(@Body LoginRequest request);
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
When documenting, capture: HTTP method, path, path parameters, query parameters, request body type, response type, and any static headers.
|
|
39
|
+
|
|
40
|
+
## OkHttp
|
|
41
|
+
|
|
42
|
+
OkHttp is often used directly or as the transport layer for Retrofit.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Request building
|
|
46
|
+
grep -rn 'Request\.Builder\|Request.Builder\|\.url(\|\.post(\|\.put(\|\.delete(\|\.patch(' sources/
|
|
47
|
+
|
|
48
|
+
# URL construction
|
|
49
|
+
grep -rn 'HttpUrl\|\.addQueryParameter\|\.addPathSegment' sources/
|
|
50
|
+
|
|
51
|
+
# Interceptors (often add auth headers)
|
|
52
|
+
grep -rn 'Interceptor\|addInterceptor\|addNetworkInterceptor\|intercept(' sources/
|
|
53
|
+
|
|
54
|
+
# Response handling
|
|
55
|
+
grep -rn '\.execute()\|\.enqueue(' sources/
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Ktor (Kotlin)
|
|
59
|
+
|
|
60
|
+
Ktor is the dominant HTTP client in Kotlin Multiplatform and modern
|
|
61
|
+
Kotlin-only Android apps. Unlike Retrofit, Ktor does **not** use annotations
|
|
62
|
+
to declare endpoints — paths appear as plain string arguments to
|
|
63
|
+
`client.get(...)` / `client.post(...)`, often inside an extension function.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Calls
|
|
67
|
+
grep -rn '\b\(client\|httpClient\|HttpClient\)\.\(get\|post\|put\|delete\|patch\|head\|request\)\s*[<(]' sources/
|
|
68
|
+
|
|
69
|
+
# Default request / base URL configuration
|
|
70
|
+
grep -rn 'HttpRequestBuilder\|defaultRequest\s*{\|\burl\s*(\s*"\|URLBuilder' sources/
|
|
71
|
+
|
|
72
|
+
# Auth plugin (bearer / refresh)
|
|
73
|
+
grep -rn '\bbearer\s*{\|BearerTokens\s*(\|loadTokens\s*{\|refreshTokens\s*{' sources/
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Typical Ktor call (after decompile):
|
|
77
|
+
|
|
78
|
+
```java
|
|
79
|
+
client.get("api/v1/users/profile") {
|
|
80
|
+
parameter("locale", "en-US");
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The base URL is usually applied via `defaultRequest { url { host = "..." } }`
|
|
85
|
+
in the client builder. Search for `host =` and `URLProtocol.HTTPS` references
|
|
86
|
+
to pin it down.
|
|
87
|
+
|
|
88
|
+
**Note on obfuscation:** in heavily R8-shrunk apps the call site
|
|
89
|
+
`client.get("path")` is inlined to something like `aVar.a(dVar, "path")`
|
|
90
|
+
and the `client.<verb>(` regex misses it. The path string itself is **not**
|
|
91
|
+
obfuscated, however — fall back to the generic path-literal search
|
|
92
|
+
(`--paths`) for the endpoint inventory in those cases. Ktor library
|
|
93
|
+
internals (`BearerTokens`, `loadTokens`, `refreshTokens`, `URLProtocol`)
|
|
94
|
+
remain searchable because Ktor keeps these on its public API.
|
|
95
|
+
|
|
96
|
+
Ktor's authentication plugin uses the
|
|
97
|
+
[`Auth { bearer { loadTokens { ... }; refreshTokens { ... } } }`](https://ktor.io/docs/auth.html)
|
|
98
|
+
DSL — bearer access tokens with automatic refresh. After R8, the DSL
|
|
99
|
+
lambdas appear as `Function2`/`Function3` impls referencing
|
|
100
|
+
`BearerTokens(...)` calls.
|
|
101
|
+
|
|
102
|
+
## Apollo Kotlin (GraphQL)
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Client setup
|
|
106
|
+
grep -rn 'ApolloClient\|\.serverUrl(\|HttpNetworkTransport' sources/
|
|
107
|
+
|
|
108
|
+
# Operations (queries / mutations / subscriptions)
|
|
109
|
+
grep -rn '\.query(\s*[A-Z]\|\.mutation(\s*[A-Z]\|\.subscription(\s*[A-Z]' sources/
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Apollo generates one class per operation under a generated package; once you
|
|
113
|
+
find the GraphQL endpoint URL via `ApolloClient.serverUrl("...")`, use the
|
|
114
|
+
operation classes themselves as the API documentation — each carries its
|
|
115
|
+
GraphQL document text in `OPERATION_DOCUMENT`.
|
|
116
|
+
|
|
117
|
+
## Volley
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
grep -rn 'StringRequest\|JsonObjectRequest\|JsonArrayRequest\|Volley\.newRequestQueue\|RequestQueue' sources/
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Volley requests typically pass the URL as a constructor argument and override `getHeaders()` or `getParams()` for custom headers/parameters.
|
|
124
|
+
|
|
125
|
+
## HttpURLConnection (legacy)
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
grep -rn 'HttpURLConnection\|HttpsURLConnection\|openConnection\|setRequestMethod\|setRequestProperty' sources/
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## WebView
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
grep -rn 'loadUrl\|evaluateJavascript\|addJavascriptInterface\|WebViewClient\|shouldOverrideUrlLoading' sources/
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
WebView-based apps may load API endpoints via JavaScript bridges. Look for `@JavascriptInterface` annotated methods.
|
|
138
|
+
|
|
139
|
+
## Endpoint-Shaped Path Literals (obfuscation-resistant)
|
|
140
|
+
|
|
141
|
+
When the HTTP client cannot be identified (custom abstraction, heavy
|
|
142
|
+
inlining, KMP shared module), or the call sites are obfuscated to
|
|
143
|
+
`a.b(c, "path")`, fall back to extracting the path string literals
|
|
144
|
+
themselves. R8 does not obfuscate string contents, so paths leak through.
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# All quoted strings shaped like an API path, deduplicated
|
|
148
|
+
grep -rhoE '"(/[A-Za-z0-9_{}.\-]+(/[A-Za-z0-9_{}.\-]+)+/?|(api|v[0-9]+|graphql|users?|account|auth|sso|oauth|profile|cart|basket|order|product|inventory|search|category|address|location|delivery|payment|invoice|favo[u]?rites?)(/[A-Za-z0-9_{}.\-]+)+/?)"' sources/ \
|
|
149
|
+
| grep -Ev '^"(image|video|audio|text|application|content)/|^"/(proc|sys|dev|tmp|etc)/' \
|
|
150
|
+
| sort -u
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
The skill ships this as `find-api-calls.sh --paths`, which prints both a
|
|
154
|
+
deduplicated inventory and the full list of call sites. On real-world
|
|
155
|
+
Kotlin apps this single command typically produces 100–300 distinct
|
|
156
|
+
endpoint paths, which is the most useful first artifact for documentation.
|
|
157
|
+
|
|
158
|
+
## Hardcoded URLs and Secrets
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# HTTP/HTTPS URLs
|
|
162
|
+
grep -rn '"https\?://[^"]*"' sources/
|
|
163
|
+
|
|
164
|
+
# API keys and tokens
|
|
165
|
+
grep -rni 'api[_-]\?key\|api[_-]\?secret\|auth[_-]\?token\|bearer\|access[_-]\?token\|client[_-]\?secret' sources/
|
|
166
|
+
|
|
167
|
+
# Base URL constants
|
|
168
|
+
grep -rni 'BASE_URL\|API_URL\|SERVER_URL\|ENDPOINT\|API_BASE' sources/
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Documentation Template
|
|
172
|
+
|
|
173
|
+
For each discovered API endpoint, document it using this template:
|
|
174
|
+
|
|
175
|
+
```markdown
|
|
176
|
+
### `METHOD /path/to/endpoint`
|
|
177
|
+
|
|
178
|
+
- **Source**: `com.example.app.api.ApiService` (file:line)
|
|
179
|
+
- **Base URL**: `https://api.example.com/v1`
|
|
180
|
+
- **Full URL**: `https://api.example.com/v1/path/to/endpoint`
|
|
181
|
+
- **Path parameters**: `id` (String)
|
|
182
|
+
- **Query parameters**: `page` (int), `limit` (int)
|
|
183
|
+
- **Headers**:
|
|
184
|
+
- `Authorization: Bearer <token>`
|
|
185
|
+
- `Content-Type: application/json`
|
|
186
|
+
- **Request body**: `LoginRequest { email: String, password: String }`
|
|
187
|
+
- **Response type**: `ApiResponse<User>`
|
|
188
|
+
- **Notes**: Called from `LoginActivity.onLoginClicked()`
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Search Strategy
|
|
192
|
+
|
|
193
|
+
1. Start with **base URL constants** — find where the API root is configured
|
|
194
|
+
2. Search for **Retrofit interfaces** — they give the clearest picture of all endpoints
|
|
195
|
+
3. Check **interceptors** — they reveal auth schemes and common headers
|
|
196
|
+
4. Search for **hardcoded URLs** — catch any one-off API calls outside the main client
|
|
197
|
+
5. Look for **WebView URLs** — some apps use hybrid web/native approaches
|