ctxora 6.2.2 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +11 -0
- package/README.md +102 -16
- package/README.vi.md +93 -7
- package/THIRD_PARTY_NOTICES.md +12 -0
- package/agents/ctxora-context-engineer.md +6 -0
- package/agents/ctxora-maintainer.md +6 -0
- package/agents/ctxora-reviewer.md +6 -0
- package/bin/ctxora.mjs +1 -1
- package/commands/context.md +15 -0
- package/commands/guide.md +8 -0
- package/commands/handoff.md +8 -0
- package/commands/health.md +14 -0
- package/commands/learn.md +8 -0
- package/commands/plan.md +15 -0
- package/commands/review.md +8 -0
- package/commands/route.md +6 -0
- package/docs/COMMAND-SKILL-MAP.md +25 -0
- package/docs/third-party/ECC-LICENSE +21 -0
- package/package.json +14 -1
- package/pyproject.toml +6 -1
- package/schemas/README.md +3 -0
- package/schemas/mcp-v2/context_stats.request.schema.json +10 -0
- package/schemas/mcp-v2/context_stats.response.schema.json +5 -0
- package/schemas/mcp-v2/delete_conversation_handoff.request.schema.json +17 -0
- package/schemas/mcp-v2/delete_conversation_handoff.response.schema.json +5 -0
- package/schemas/mcp-v2/ecc_search.request.schema.json +16 -0
- package/schemas/mcp-v2/ecc_search.response.schema.json +5 -0
- package/schemas/mcp-v2/ecc_status.request.schema.json +6 -0
- package/schemas/mcp-v2/ecc_status.response.schema.json +5 -0
- package/schemas/mcp-v2/error.response.schema.json +40 -0
- package/schemas/mcp-v2/handoff_conversation.request.schema.json +29 -0
- package/schemas/mcp-v2/handoff_conversation.response.schema.json +5 -0
- package/schemas/mcp-v2/invalidate_context.request.schema.json +17 -0
- package/schemas/mcp-v2/invalidate_context.response.schema.json +5 -0
- package/schemas/mcp-v2/list_conversation_handoffs.request.schema.json +16 -0
- package/schemas/mcp-v2/list_conversation_handoffs.response.schema.json +8 -0
- package/schemas/mcp-v2/memory_delete.request.schema.json +20 -0
- package/schemas/mcp-v2/memory_delete.response.schema.json +5 -0
- package/schemas/mcp-v2/memory_list.request.schema.json +19 -0
- package/schemas/mcp-v2/memory_list.response.schema.json +7 -0
- package/schemas/mcp-v2/memory_save.request.schema.json +42 -0
- package/schemas/mcp-v2/memory_save.response.schema.json +5 -0
- package/schemas/mcp-v2/memory_search.request.schema.json +26 -0
- package/schemas/mcp-v2/memory_search.response.schema.json +8 -0
- package/schemas/mcp-v2/plan_context.request.schema.json +24 -0
- package/schemas/mcp-v2/plan_context.response.schema.json +5 -0
- package/schemas/mcp-v2/prepare_context.request.schema.json +42 -0
- package/schemas/mcp-v2/prepare_context.response.schema.json +72 -0
- package/schemas/mcp-v2/purge_expired_handoffs.request.schema.json +6 -0
- package/schemas/mcp-v2/purge_expired_handoffs.response.schema.json +5 -0
- package/schemas/mcp-v2/refresh_workspace.request.schema.json +19 -0
- package/schemas/mcp-v2/refresh_workspace.response.schema.json +5 -0
- package/schemas/mcp-v2/register_workspace.request.schema.json +23 -0
- package/schemas/mcp-v2/register_workspace.response.schema.json +5 -0
- package/schemas/mcp-v2/restore_conversation_handoff.request.schema.json +17 -0
- package/schemas/mcp-v2/restore_conversation_handoff.response.schema.json +5 -0
- package/schemas/mcp-v2/retrieve_context.request.schema.json +26 -0
- package/schemas/mcp-v2/retrieve_context.response.schema.json +5 -0
- package/schemas/mcp-v2/route_skills.request.schema.json +29 -0
- package/schemas/mcp-v2/route_skills.response.schema.json +5 -0
- package/schemas/mcp-v2/skill_feedback.request.schema.json +33 -0
- package/schemas/mcp-v2/skill_feedback.response.schema.json +5 -0
- package/schemas/mcp-v2/skill_learning_status.request.schema.json +16 -0
- package/schemas/mcp-v2/skill_learning_status.response.schema.json +5 -0
- package/skills/ctxora-context-health/SKILL.md +29 -0
- package/skills/ctxora-continuous-learning/SKILL.md +26 -0
- package/skills/ctxora-navigation/SKILL.md +20 -0
- package/skills/ctxora-repository-context/SKILL.md +33 -0
- package/skills/ctxora-setup/SKILL.md +26 -0
- package/skills/ctxora-workflow-profiles/SKILL.md +30 -0
- package/src/harness_context/api/v2/contracts.py +9 -0
- package/src/harness_context/application/container.py +2 -0
- package/src/harness_context/application/context_service.py +11 -2
- package/src/harness_context/application/protocols.py +5 -0
- package/src/harness_context/bootstrap.py +4 -1
- package/src/harness_context/cli/app.py +112 -0
- package/src/harness_context/mcp/capabilities.py +1 -0
- package/src/harness_context/mcp/tool_handlers/__init__.py +5 -1
- package/src/harness_context/mcp/tool_handlers/skills.py +29 -0
- package/src/harness_context/mcp/tools.py +2 -0
- package/src/harness_context/skills/__init__.py +4 -0
- package/src/harness_context/skills/catalog.py +245 -0
- package/src/harness_context/skills/ecc/accessibility/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/accessibility/SKILL.md +147 -0
- package/src/harness_context/skills/ecc/agent-architecture-audit/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agent-architecture-audit/SKILL.md +257 -0
- package/src/harness_context/skills/ecc/agent-eval/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agent-eval/SKILL.md +147 -0
- package/src/harness_context/skills/ecc/agent-harness-construction/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agent-harness-construction/SKILL.md +74 -0
- package/src/harness_context/skills/ecc/agent-introspection-debugging/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agent-introspection-debugging/SKILL.md +154 -0
- package/src/harness_context/skills/ecc/agent-payment-x402/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agent-payment-x402/SKILL.md +225 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/SKILL.md +182 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/examples/high-score-example.md +87 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/examples/low-score-example.md +86 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/references/evaluation-criteria.md +71 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/references/hook-integration.md +64 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/scripts/evaluate.py +408 -0
- package/src/harness_context/skills/ecc/agent-self-evaluation/templates/evaluation-report.md +86 -0
- package/src/harness_context/skills/ecc/agent-sort/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agent-sort/SKILL.md +216 -0
- package/src/harness_context/skills/ecc/agentic-engineering/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agentic-engineering/SKILL.md +64 -0
- package/src/harness_context/skills/ecc/agentic-os/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/agentic-os/SKILL.md +388 -0
- package/src/harness_context/skills/ecc/ai-first-engineering/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ai-first-engineering/SKILL.md +52 -0
- package/src/harness_context/skills/ecc/ai-regression-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ai-regression-testing/SKILL.md +386 -0
- package/src/harness_context/skills/ecc/android-clean-architecture/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/android-clean-architecture/SKILL.md +340 -0
- package/src/harness_context/skills/ecc/angular-developer/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/angular-developer/SKILL.md +155 -0
- package/src/harness_context/skills/ecc/angular-developer/references/angular-animations.md +160 -0
- package/src/harness_context/skills/ecc/angular-developer/references/angular-aria.md +410 -0
- package/src/harness_context/skills/ecc/angular-developer/references/cli.md +86 -0
- package/src/harness_context/skills/ecc/angular-developer/references/component-harnesses.md +59 -0
- package/src/harness_context/skills/ecc/angular-developer/references/component-styling.md +91 -0
- package/src/harness_context/skills/ecc/angular-developer/references/components.md +117 -0
- package/src/harness_context/skills/ecc/angular-developer/references/creating-services.md +97 -0
- package/src/harness_context/skills/ecc/angular-developer/references/data-resolvers.md +69 -0
- package/src/harness_context/skills/ecc/angular-developer/references/define-routes.md +67 -0
- package/src/harness_context/skills/ecc/angular-developer/references/defining-providers.md +72 -0
- package/src/harness_context/skills/ecc/angular-developer/references/di-fundamentals.md +120 -0
- package/src/harness_context/skills/ecc/angular-developer/references/e2e-testing.md +56 -0
- package/src/harness_context/skills/ecc/angular-developer/references/effects.md +83 -0
- package/src/harness_context/skills/ecc/angular-developer/references/hierarchical-injectors.md +43 -0
- package/src/harness_context/skills/ecc/angular-developer/references/host-elements.md +80 -0
- package/src/harness_context/skills/ecc/angular-developer/references/injection-context.md +63 -0
- package/src/harness_context/skills/ecc/angular-developer/references/inputs.md +101 -0
- package/src/harness_context/skills/ecc/angular-developer/references/linked-signal.md +59 -0
- package/src/harness_context/skills/ecc/angular-developer/references/loading-strategies.md +61 -0
- package/src/harness_context/skills/ecc/angular-developer/references/mcp.md +108 -0
- package/src/harness_context/skills/ecc/angular-developer/references/navigate-to-routes.md +69 -0
- package/src/harness_context/skills/ecc/angular-developer/references/outputs.md +86 -0
- package/src/harness_context/skills/ecc/angular-developer/references/reactive-forms.md +122 -0
- package/src/harness_context/skills/ecc/angular-developer/references/rendering-strategies.md +44 -0
- package/src/harness_context/skills/ecc/angular-developer/references/resource.md +77 -0
- package/src/harness_context/skills/ecc/angular-developer/references/route-animations.md +56 -0
- package/src/harness_context/skills/ecc/angular-developer/references/route-guards.md +52 -0
- package/src/harness_context/skills/ecc/angular-developer/references/router-lifecycle.md +45 -0
- package/src/harness_context/skills/ecc/angular-developer/references/router-testing.md +87 -0
- package/src/harness_context/skills/ecc/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/src/harness_context/skills/ecc/angular-developer/references/signal-forms.md +795 -0
- package/src/harness_context/skills/ecc/angular-developer/references/signals-overview.md +94 -0
- package/src/harness_context/skills/ecc/angular-developer/references/tailwind-css.md +69 -0
- package/src/harness_context/skills/ecc/angular-developer/references/template-driven-forms.md +114 -0
- package/src/harness_context/skills/ecc/angular-developer/references/testing-fundamentals.md +65 -0
- package/src/harness_context/skills/ecc/api-connector-builder/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/api-connector-builder/SKILL.md +121 -0
- package/src/harness_context/skills/ecc/api-design/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/api-design/SKILL.md +524 -0
- package/src/harness_context/skills/ecc/architecture-decision-records/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/architecture-decision-records/SKILL.md +180 -0
- package/src/harness_context/skills/ecc/article-writing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/article-writing/SKILL.md +80 -0
- package/src/harness_context/skills/ecc/automation-audit-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/automation-audit-ops/SKILL.md +143 -0
- package/src/harness_context/skills/ecc/autonomous-agent-harness/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/autonomous-agent-harness/SKILL.md +274 -0
- package/src/harness_context/skills/ecc/autonomous-loops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/autonomous-loops/SKILL.md +611 -0
- package/src/harness_context/skills/ecc/backend-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/backend-patterns/SKILL.md +562 -0
- package/src/harness_context/skills/ecc/benchmark/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/benchmark/SKILL.md +95 -0
- package/src/harness_context/skills/ecc/benchmark-methodology/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/benchmark-methodology/SKILL.md +191 -0
- package/src/harness_context/skills/ecc/benchmark-optimization-loop/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/benchmark-optimization-loop/SKILL.md +71 -0
- package/src/harness_context/skills/ecc/blender-motion-state-inspection/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/blender-motion-state-inspection/SKILL.md +165 -0
- package/src/harness_context/skills/ecc/blueprint/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/blueprint/SKILL.md +106 -0
- package/src/harness_context/skills/ecc/brand-discovery/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/brand-discovery/SKILL.md +145 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/10_purpose-why.md +40 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/20_positioning.md +44 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/30_audience-niche.md +52 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/40_personality-archetype.md +57 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/50_voice-tone.md +59 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/60_narrative-story.md +50 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/70_founder-tension.md +49 -0
- package/src/harness_context/skills/ecc/brand-discovery/references/90_SYNTHESIS.md +133 -0
- package/src/harness_context/skills/ecc/brand-voice/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/brand-voice/SKILL.md +98 -0
- package/src/harness_context/skills/ecc/brand-voice/references/voice-profile-schema.md +55 -0
- package/src/harness_context/skills/ecc/browser-qa/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/browser-qa/SKILL.md +105 -0
- package/src/harness_context/skills/ecc/bun-runtime/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/bun-runtime/SKILL.md +85 -0
- package/src/harness_context/skills/ecc/canary-watch/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/canary-watch/SKILL.md +108 -0
- package/src/harness_context/skills/ecc/carrier-relationship-management/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/carrier-relationship-management/SKILL.md +212 -0
- package/src/harness_context/skills/ecc/cisco-ios-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/cisco-ios-patterns/SKILL.md +164 -0
- package/src/harness_context/skills/ecc/ck/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ck/SKILL.md +148 -0
- package/src/harness_context/skills/ecc/ck/commands/forget.mjs +44 -0
- package/src/harness_context/skills/ecc/ck/commands/info.mjs +24 -0
- package/src/harness_context/skills/ecc/ck/commands/init.mjs +143 -0
- package/src/harness_context/skills/ecc/ck/commands/list.mjs +40 -0
- package/src/harness_context/skills/ecc/ck/commands/migrate.mjs +202 -0
- package/src/harness_context/skills/ecc/ck/commands/resume.mjs +36 -0
- package/src/harness_context/skills/ecc/ck/commands/save.mjs +210 -0
- package/src/harness_context/skills/ecc/ck/commands/shared.mjs +387 -0
- package/src/harness_context/skills/ecc/ck/hooks/session-start.mjs +224 -0
- package/src/harness_context/skills/ecc/claude-devfleet/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/claude-devfleet/SKILL.md +112 -0
- package/src/harness_context/skills/ecc/click-path-audit/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/click-path-audit/SKILL.md +245 -0
- package/src/harness_context/skills/ecc/clickhouse-io/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/clickhouse-io/SKILL.md +445 -0
- package/src/harness_context/skills/ecc/code-tour/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/code-tour/SKILL.md +254 -0
- package/src/harness_context/skills/ecc/codebase-onboarding/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/codebase-onboarding/SKILL.md +234 -0
- package/src/harness_context/skills/ecc/codehealth-mcp/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/codehealth-mcp/SKILL.md +167 -0
- package/src/harness_context/skills/ecc/coding-standards/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/coding-standards/SKILL.md +551 -0
- package/src/harness_context/skills/ecc/competitive-platform-analysis/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/competitive-platform-analysis/SKILL.md +214 -0
- package/src/harness_context/skills/ecc/competitive-report-structure/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/competitive-report-structure/SKILL.md +162 -0
- package/src/harness_context/skills/ecc/compose-multiplatform-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/compose-multiplatform-patterns/SKILL.md +300 -0
- package/src/harness_context/skills/ecc/config-gc/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/config-gc/SKILL.md +120 -0
- package/src/harness_context/skills/ecc/configure-ecc/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/configure-ecc/SKILL.md +206 -0
- package/src/harness_context/skills/ecc/connections-optimizer/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/connections-optimizer/SKILL.md +190 -0
- package/src/harness_context/skills/ecc/content-engine/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/content-engine/SKILL.md +132 -0
- package/src/harness_context/skills/ecc/content-hash-cache-pattern/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/content-hash-cache-pattern/SKILL.md +162 -0
- package/src/harness_context/skills/ecc/context-budget/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/context-budget/SKILL.md +136 -0
- package/src/harness_context/skills/ecc/continuous-agent-loop/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/continuous-agent-loop/SKILL.md +46 -0
- package/src/harness_context/skills/ecc/continuous-learning/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/continuous-learning/SKILL.md +132 -0
- package/src/harness_context/skills/ecc/continuous-learning/config.json +18 -0
- package/src/harness_context/skills/ecc/continuous-learning/evaluate-session.sh +69 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/SKILL.md +377 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/agents/observer-loop.sh +372 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/agents/observer.md +189 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/agents/start-observer.sh +252 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/config.json +8 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/hooks/observe.sh +675 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/scripts/detect-project.sh +334 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/scripts/instinct-cli.py +2290 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/scripts/migrate-homunculus.sh +68 -0
- package/src/harness_context/skills/ecc/continuous-learning-v2/scripts/test_parse_instinct.py +1420 -0
- package/src/harness_context/skills/ecc/contract-first/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/contract-first/SKILL.md +287 -0
- package/src/harness_context/skills/ecc/cost-aware-llm-pipeline/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/cost-aware-llm-pipeline/SKILL.md +188 -0
- package/src/harness_context/skills/ecc/cost-tracking/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/cost-tracking/SKILL.md +97 -0
- package/src/harness_context/skills/ecc/council/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/council/SKILL.md +204 -0
- package/src/harness_context/skills/ecc/council-multi-model/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/council-multi-model/SKILL.md +167 -0
- package/src/harness_context/skills/ecc/council-multi-model/scripts/review-with-codex.js +305 -0
- package/src/harness_context/skills/ecc/cpp-coding-standards/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/cpp-coding-standards/SKILL.md +724 -0
- package/src/harness_context/skills/ecc/cpp-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/cpp-testing/SKILL.md +325 -0
- package/src/harness_context/skills/ecc/crosspost/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/crosspost/SKILL.md +123 -0
- package/src/harness_context/skills/ecc/csharp-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/csharp-testing/SKILL.md +322 -0
- package/src/harness_context/skills/ecc/customer-billing-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/customer-billing-ops/SKILL.md +141 -0
- package/src/harness_context/skills/ecc/customs-trade-compliance/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/customs-trade-compliance/SKILL.md +263 -0
- package/src/harness_context/skills/ecc/dart-flutter-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/dart-flutter-patterns/SKILL.md +564 -0
- package/src/harness_context/skills/ecc/dashboard-builder/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/dashboard-builder/SKILL.md +109 -0
- package/src/harness_context/skills/ecc/data-scraper-agent/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/data-scraper-agent/SKILL.md +776 -0
- package/src/harness_context/skills/ecc/data-throughput-accelerator/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/data-throughput-accelerator/SKILL.md +74 -0
- package/src/harness_context/skills/ecc/database-migrations/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/database-migrations/SKILL.md +430 -0
- package/src/harness_context/skills/ecc/deep-research/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/deep-research/SKILL.md +170 -0
- package/src/harness_context/skills/ecc/defi-amm-security/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/defi-amm-security/SKILL.md +167 -0
- package/src/harness_context/skills/ecc/delivery-gate/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/delivery-gate/SKILL.md +126 -0
- package/src/harness_context/skills/ecc/delivery-gate/hooks/quality-gate.py +220 -0
- package/src/harness_context/skills/ecc/deployment-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/deployment-patterns/SKILL.md +428 -0
- package/src/harness_context/skills/ecc/design-system/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/design-system/SKILL.md +83 -0
- package/src/harness_context/skills/ecc/dev-team/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/dev-team/SKILL.md +203 -0
- package/src/harness_context/skills/ecc/django-celery/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/django-celery/SKILL.md +458 -0
- package/src/harness_context/skills/ecc/django-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/django-patterns/SKILL.md +735 -0
- package/src/harness_context/skills/ecc/django-security/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/django-security/SKILL.md +644 -0
- package/src/harness_context/skills/ecc/django-tdd/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/django-tdd/SKILL.md +730 -0
- package/src/harness_context/skills/ecc/django-verification/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/django-verification/SKILL.md +470 -0
- package/src/harness_context/skills/ecc/dmux-workflows/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/dmux-workflows/SKILL.md +192 -0
- package/src/harness_context/skills/ecc/docker-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/docker-patterns/SKILL.md +520 -0
- package/src/harness_context/skills/ecc/documentation-lookup/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/documentation-lookup/SKILL.md +91 -0
- package/src/harness_context/skills/ecc/dotnet-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/dotnet-patterns/SKILL.md +322 -0
- package/src/harness_context/skills/ecc/dynamic-workflow-mode/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/dynamic-workflow-mode/SKILL.md +124 -0
- package/src/harness_context/skills/ecc/e2e-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/e2e-testing/SKILL.md +327 -0
- package/src/harness_context/skills/ecc/ecc-guide/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ecc-guide/SKILL.md +190 -0
- package/src/harness_context/skills/ecc/ecc-recipes/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ecc-recipes/SKILL.md +150 -0
- package/src/harness_context/skills/ecc/ecc-tools-cost-audit/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ecc-tools-cost-audit/SKILL.md +161 -0
- package/src/harness_context/skills/ecc/email-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/email-ops/SKILL.md +133 -0
- package/src/harness_context/skills/ecc/energy-procurement/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/energy-procurement/SKILL.md +228 -0
- package/src/harness_context/skills/ecc/enterprise-agent-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/enterprise-agent-ops/SKILL.md +51 -0
- package/src/harness_context/skills/ecc/error-handling/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/error-handling/SKILL.md +377 -0
- package/src/harness_context/skills/ecc/eval-harness/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/eval-harness/SKILL.md +271 -0
- package/src/harness_context/skills/ecc/evm-token-decimals/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/evm-token-decimals/SKILL.md +131 -0
- package/src/harness_context/skills/ecc/exa-search/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/exa-search/SKILL.md +117 -0
- package/src/harness_context/skills/ecc/fal-ai-media/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/fal-ai-media/SKILL.md +289 -0
- package/src/harness_context/skills/ecc/fastapi-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/fastapi-patterns/SKILL.md +514 -0
- package/src/harness_context/skills/ecc/finance-billing-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/finance-billing-ops/SKILL.md +128 -0
- package/src/harness_context/skills/ecc/flox-environments/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/flox-environments/SKILL.md +497 -0
- package/src/harness_context/skills/ecc/flutter-dart-code-review/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/flutter-dart-code-review/SKILL.md +436 -0
- package/src/harness_context/skills/ecc/foundation-models-on-device/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/foundation-models-on-device/SKILL.md +243 -0
- package/src/harness_context/skills/ecc/frontend-a11y/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/frontend-a11y/SKILL.md +446 -0
- package/src/harness_context/skills/ecc/frontend-design-direction/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/frontend-design-direction/SKILL.md +93 -0
- package/src/harness_context/skills/ecc/frontend-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/frontend-patterns/SKILL.md +657 -0
- package/src/harness_context/skills/ecc/frontend-slides/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/frontend-slides/SKILL.md +185 -0
- package/src/harness_context/skills/ecc/frontend-slides/STYLE_PRESETS.md +330 -0
- package/src/harness_context/skills/ecc/frontend-slides/animation-patterns.md +122 -0
- package/src/harness_context/skills/ecc/frontend-slides/html-template.md +419 -0
- package/src/harness_context/skills/ecc/frontend-slides/scripts/export-pdf.sh +418 -0
- package/src/harness_context/skills/ecc/frontend-slides/scripts/extract-pptx.py +96 -0
- package/src/harness_context/skills/ecc/frontend-slides/viewport-base.css +153 -0
- package/src/harness_context/skills/ecc/fsharp-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/fsharp-testing/SKILL.md +281 -0
- package/src/harness_context/skills/ecc/gan-style-harness/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/gan-style-harness/SKILL.md +279 -0
- package/src/harness_context/skills/ecc/gateguard/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/gateguard/SKILL.md +182 -0
- package/src/harness_context/skills/ecc/generating-python-installer/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/generating-python-installer/SKILL.md +820 -0
- package/src/harness_context/skills/ecc/git-workflow/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/git-workflow/SKILL.md +716 -0
- package/src/harness_context/skills/ecc/github-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/github-ops/SKILL.md +162 -0
- package/src/harness_context/skills/ecc/github-ops/references/ecc-release-checklist.md +211 -0
- package/src/harness_context/skills/ecc/golang-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/golang-patterns/SKILL.md +676 -0
- package/src/harness_context/skills/ecc/golang-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/golang-testing/SKILL.md +721 -0
- package/src/harness_context/skills/ecc/google-workspace-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/google-workspace-ops/SKILL.md +96 -0
- package/src/harness_context/skills/ecc/growth-log/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/growth-log/SKILL.md +128 -0
- package/src/harness_context/skills/ecc/healthcare-cdss-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/healthcare-cdss-patterns/SKILL.md +246 -0
- package/src/harness_context/skills/ecc/healthcare-emr-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/healthcare-emr-patterns/SKILL.md +160 -0
- package/src/harness_context/skills/ecc/healthcare-eval-harness/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/healthcare-eval-harness/SKILL.md +208 -0
- package/src/harness_context/skills/ecc/healthcare-phi-compliance/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/healthcare-phi-compliance/SKILL.md +146 -0
- package/src/harness_context/skills/ecc/hermes-imports/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/hermes-imports/SKILL.md +89 -0
- package/src/harness_context/skills/ecc/hexagonal-architecture/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/hexagonal-architecture/SKILL.md +277 -0
- package/src/harness_context/skills/ecc/hipaa-compliance/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/hipaa-compliance/SKILL.md +79 -0
- package/src/harness_context/skills/ecc/homelab-network-readiness/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/homelab-network-readiness/SKILL.md +170 -0
- package/src/harness_context/skills/ecc/homelab-network-setup/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/homelab-network-setup/SKILL.md +130 -0
- package/src/harness_context/skills/ecc/homelab-pihole-dns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/homelab-pihole-dns/SKILL.md +275 -0
- package/src/harness_context/skills/ecc/homelab-vlan-segmentation/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/homelab-vlan-segmentation/SKILL.md +312 -0
- package/src/harness_context/skills/ecc/homelab-wireguard-vpn/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/homelab-wireguard-vpn/SKILL.md +306 -0
- package/src/harness_context/skills/ecc/hookify-rules/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/hookify-rules/SKILL.md +128 -0
- package/src/harness_context/skills/ecc/inherit-legacy-style/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/inherit-legacy-style/SKILL.md +157 -0
- package/src/harness_context/skills/ecc/intent-driven-development/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/intent-driven-development/SKILL.md +360 -0
- package/src/harness_context/skills/ecc/inventory-demand-planning/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/inventory-demand-planning/SKILL.md +247 -0
- package/src/harness_context/skills/ecc/investor-materials/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/investor-materials/SKILL.md +97 -0
- package/src/harness_context/skills/ecc/investor-outreach/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/investor-outreach/SKILL.md +92 -0
- package/src/harness_context/skills/ecc/ios-icon-gen/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ios-icon-gen/SKILL.md +158 -0
- package/src/harness_context/skills/ecc/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/src/harness_context/skills/ecc/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/src/harness_context/skills/ecc/iterative-retrieval/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/iterative-retrieval/SKILL.md +212 -0
- package/src/harness_context/skills/ecc/ito-baskets/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ito-baskets/SKILL.md +263 -0
- package/src/harness_context/skills/ecc/ito-baskets/agents/openai.yaml +4 -0
- package/src/harness_context/skills/ecc/ito-baskets/scripts/ito-baskets.js +195 -0
- package/src/harness_context/skills/ecc/ito-compute/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ito-compute/SKILL.md +165 -0
- package/src/harness_context/skills/ecc/ito-compute/agents/openai.yaml +4 -0
- package/src/harness_context/skills/ecc/ito-inference/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ito-inference/SKILL.md +119 -0
- package/src/harness_context/skills/ecc/ito-training/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ito-training/SKILL.md +123 -0
- package/src/harness_context/skills/ecc/java-coding-standards/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/java-coding-standards/SKILL.md +384 -0
- package/src/harness_context/skills/ecc/jira-integration/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/jira-integration/SKILL.md +312 -0
- package/src/harness_context/skills/ecc/jpa-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/jpa-patterns/SKILL.md +152 -0
- package/src/harness_context/skills/ecc/knowledge-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/knowledge-ops/SKILL.md +155 -0
- package/src/harness_context/skills/ecc/kotlin-coroutines-flows/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/kotlin-coroutines-flows/SKILL.md +285 -0
- package/src/harness_context/skills/ecc/kotlin-exposed-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/kotlin-exposed-patterns/SKILL.md +720 -0
- package/src/harness_context/skills/ecc/kotlin-ktor-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/kotlin-ktor-patterns/SKILL.md +690 -0
- package/src/harness_context/skills/ecc/kotlin-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/kotlin-patterns/SKILL.md +712 -0
- package/src/harness_context/skills/ecc/kotlin-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/kotlin-testing/SKILL.md +825 -0
- package/src/harness_context/skills/ecc/kubernetes-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/kubernetes-patterns/SKILL.md +756 -0
- package/src/harness_context/skills/ecc/laravel-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/laravel-patterns/SKILL.md +416 -0
- package/src/harness_context/skills/ecc/laravel-plugin-discovery/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/laravel-plugin-discovery/SKILL.md +230 -0
- package/src/harness_context/skills/ecc/laravel-security/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/laravel-security/SKILL.md +948 -0
- package/src/harness_context/skills/ecc/laravel-tdd/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/laravel-tdd/SKILL.md +675 -0
- package/src/harness_context/skills/ecc/laravel-verification/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/laravel-verification/SKILL.md +180 -0
- package/src/harness_context/skills/ecc/latency-critical-systems/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/latency-critical-systems/SKILL.md +75 -0
- package/src/harness_context/skills/ecc/lead-intelligence/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/lead-intelligence/SKILL.md +333 -0
- package/src/harness_context/skills/ecc/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/src/harness_context/skills/ecc/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/src/harness_context/skills/ecc/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/src/harness_context/skills/ecc/lead-intelligence/agents/signal-scorer.md +60 -0
- package/src/harness_context/skills/ecc/liquid-glass-design/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/liquid-glass-design/SKILL.md +279 -0
- package/src/harness_context/skills/ecc/living-docs-governance/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/living-docs-governance/SKILL.md +137 -0
- package/src/harness_context/skills/ecc/llm-trading-agent-security/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/llm-trading-agent-security/SKILL.md +147 -0
- package/src/harness_context/skills/ecc/logistics-exception-management/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/logistics-exception-management/SKILL.md +222 -0
- package/src/harness_context/skills/ecc/loop-design-check/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/loop-design-check/SKILL.md +143 -0
- package/src/harness_context/skills/ecc/mailtrap-email-integration/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/mailtrap-email-integration/SKILL.md +77 -0
- package/src/harness_context/skills/ecc/make-interfaces-feel-better/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/make-interfaces-feel-better/SKILL.md +152 -0
- package/src/harness_context/skills/ecc/manim-video/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/manim-video/SKILL.md +90 -0
- package/src/harness_context/skills/ecc/manim-video/assets/network_graph_scene.py +52 -0
- package/src/harness_context/skills/ecc/market-research/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/market-research/SKILL.md +87 -0
- package/src/harness_context/skills/ecc/marketing-campaign/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/marketing-campaign/SKILL.md +114 -0
- package/src/harness_context/skills/ecc/mcp-server-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/mcp-server-patterns/SKILL.md +70 -0
- package/src/harness_context/skills/ecc/messages-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/messages-ops/SKILL.md +105 -0
- package/src/harness_context/skills/ecc/ml-adoption-playbook/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ml-adoption-playbook/SKILL.md +57 -0
- package/src/harness_context/skills/ecc/mle-workflow/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/mle-workflow/SKILL.md +348 -0
- package/src/harness_context/skills/ecc/motion-advanced/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/motion-advanced/SKILL.md +597 -0
- package/src/harness_context/skills/ecc/motion-foundations/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/motion-foundations/SKILL.md +300 -0
- package/src/harness_context/skills/ecc/motion-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/motion-patterns/SKILL.md +435 -0
- package/src/harness_context/skills/ecc/motion-ui/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/motion-ui/SKILL.md +576 -0
- package/src/harness_context/skills/ecc/mysql-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/mysql-patterns/SKILL.md +413 -0
- package/src/harness_context/skills/ecc/nanoclaw-repl/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/nanoclaw-repl/SKILL.md +34 -0
- package/src/harness_context/skills/ecc/nasiko-control-plane/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/nasiko-control-plane/SKILL.md +49 -0
- package/src/harness_context/skills/ecc/nasiko-control-plane/agents/openai.yaml +4 -0
- package/src/harness_context/skills/ecc/nestjs-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/nestjs-patterns/SKILL.md +231 -0
- package/src/harness_context/skills/ecc/netmiko-ssh-automation/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/netmiko-ssh-automation/SKILL.md +174 -0
- package/src/harness_context/skills/ecc/network-bgp-diagnostics/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/network-bgp-diagnostics/SKILL.md +168 -0
- package/src/harness_context/skills/ecc/network-config-validation/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/network-config-validation/SKILL.md +211 -0
- package/src/harness_context/skills/ecc/network-interface-health/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/network-interface-health/SKILL.md +153 -0
- package/src/harness_context/skills/ecc/nextjs-turbopack/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/nextjs-turbopack/SKILL.md +58 -0
- package/src/harness_context/skills/ecc/nodejs-keccak256/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/nodejs-keccak256/SKILL.md +103 -0
- package/src/harness_context/skills/ecc/nutrient-document-processing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/nutrient-document-processing/SKILL.md +168 -0
- package/src/harness_context/skills/ecc/nuxt4-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/nuxt4-patterns/SKILL.md +101 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/SKILL.md +289 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/gacha.py +224 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/gacha.sh +5 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/references/error-handling.md +53 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/references/naming-system.md +39 -0
- package/src/harness_context/skills/ecc/openclaw-persona-forge/references/output-template.md +166 -0
- package/src/harness_context/skills/ecc/opensource-pipeline/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/opensource-pipeline/SKILL.md +256 -0
- package/src/harness_context/skills/ecc/orch-add-feature/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/orch-add-feature/SKILL.md +45 -0
- package/src/harness_context/skills/ecc/orch-build-mvp/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/orch-build-mvp/SKILL.md +49 -0
- package/src/harness_context/skills/ecc/orch-change-feature/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/orch-change-feature/SKILL.md +43 -0
- package/src/harness_context/skills/ecc/orch-fix-defect/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/orch-fix-defect/SKILL.md +43 -0
- package/src/harness_context/skills/ecc/orch-pipeline/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/orch-pipeline/SKILL.md +121 -0
- package/src/harness_context/skills/ecc/orch-refine-code/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/orch-refine-code/SKILL.md +44 -0
- package/src/harness_context/skills/ecc/parallel-execution-optimizer/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/parallel-execution-optimizer/SKILL.md +74 -0
- package/src/harness_context/skills/ecc/perl-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/perl-patterns/SKILL.md +505 -0
- package/src/harness_context/skills/ecc/perl-security/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/perl-security/SKILL.md +504 -0
- package/src/harness_context/skills/ecc/perl-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/perl-testing/SKILL.md +476 -0
- package/src/harness_context/skills/ecc/plan-canvas/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/plan-canvas/SKILL.md +196 -0
- package/src/harness_context/skills/ecc/plan-orchestrate/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/plan-orchestrate/SKILL.md +263 -0
- package/src/harness_context/skills/ecc/plankton-code-quality/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/plankton-code-quality/SKILL.md +237 -0
- package/src/harness_context/skills/ecc/postgres-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/postgres-patterns/SKILL.md +148 -0
- package/src/harness_context/skills/ecc/prediction-market-oracle-research/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/prediction-market-oracle-research/SKILL.md +64 -0
- package/src/harness_context/skills/ecc/prediction-market-risk-review/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/prediction-market-risk-review/SKILL.md +61 -0
- package/src/harness_context/skills/ecc/prisma-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/prisma-patterns/SKILL.md +401 -0
- package/src/harness_context/skills/ecc/product-capability/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/product-capability/SKILL.md +142 -0
- package/src/harness_context/skills/ecc/product-lens/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/product-lens/SKILL.md +93 -0
- package/src/harness_context/skills/ecc/production-audit/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/production-audit/SKILL.md +207 -0
- package/src/harness_context/skills/ecc/production-scheduling/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/production-scheduling/SKILL.md +238 -0
- package/src/harness_context/skills/ecc/project-flow-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/project-flow-ops/SKILL.md +112 -0
- package/src/harness_context/skills/ecc/prompt-optimizer/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/prompt-optimizer/SKILL.md +398 -0
- package/src/harness_context/skills/ecc/python-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/python-patterns/SKILL.md +751 -0
- package/src/harness_context/skills/ecc/python-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/python-testing/SKILL.md +817 -0
- package/src/harness_context/skills/ecc/pytorch-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/pytorch-patterns/SKILL.md +397 -0
- package/src/harness_context/skills/ecc/quality-nonconformance/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/quality-nonconformance/SKILL.md +260 -0
- package/src/harness_context/skills/ecc/quarkus-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/quarkus-patterns/SKILL.md +723 -0
- package/src/harness_context/skills/ecc/quarkus-security/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/quarkus-security/SKILL.md +468 -0
- package/src/harness_context/skills/ecc/quarkus-tdd/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/quarkus-tdd/SKILL.md +812 -0
- package/src/harness_context/skills/ecc/quarkus-verification/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/quarkus-verification/SKILL.md +481 -0
- package/src/harness_context/skills/ecc/ralphinho-rfc-pipeline/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ralphinho-rfc-pipeline/SKILL.md +68 -0
- package/src/harness_context/skills/ecc/react-native-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/react-native-patterns/SKILL.md +326 -0
- package/src/harness_context/skills/ecc/react-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/react-patterns/SKILL.md +342 -0
- package/src/harness_context/skills/ecc/react-performance/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/react-performance/SKILL.md +575 -0
- package/src/harness_context/skills/ecc/react-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/react-testing/SKILL.md +424 -0
- package/src/harness_context/skills/ecc/recsys-pipeline-architect/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/recsys-pipeline-architect/SKILL.md +115 -0
- package/src/harness_context/skills/ecc/recursive-decision-ledger/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/recursive-decision-ledger/SKILL.md +81 -0
- package/src/harness_context/skills/ecc/redis-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/redis-patterns/SKILL.md +404 -0
- package/src/harness_context/skills/ecc/regex-vs-llm-structured-text/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/regex-vs-llm-structured-text/SKILL.md +221 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/SKILL.md +43 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/3d.md +86 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/animations.md +29 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/assets.md +78 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/audio.md +172 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/can-decode.md +75 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/charts.md +58 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/compositions.md +146 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/display-captions.md +126 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/extract-frames.md +229 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/fonts.md +152 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/gifs.md +138 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/images.md +130 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/lottie.md +67 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/measuring-text.md +143 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/sequencing.md +106 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/tailwind.md +11 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/text-animations.md +20 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/timing.md +179 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/transitions.md +122 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/trimming.md +52 -0
- package/src/harness_context/skills/ecc/remotion-video-creation/rules/videos.md +171 -0
- package/src/harness_context/skills/ecc/repo-scan/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/repo-scan/SKILL.md +170 -0
- package/src/harness_context/skills/ecc/research-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/research-ops/SKILL.md +113 -0
- package/src/harness_context/skills/ecc/returns-reverse-logistics/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/returns-reverse-logistics/SKILL.md +240 -0
- package/src/harness_context/skills/ecc/rules-distill/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/rules-distill/SKILL.md +265 -0
- package/src/harness_context/skills/ecc/rules-distill/scripts/scan-rules.sh +58 -0
- package/src/harness_context/skills/ecc/rules-distill/scripts/scan-skills.sh +129 -0
- package/src/harness_context/skills/ecc/rust-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/rust-patterns/SKILL.md +500 -0
- package/src/harness_context/skills/ecc/rust-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/rust-testing/SKILL.md +501 -0
- package/src/harness_context/skills/ecc/safety-guard/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/safety-guard/SKILL.md +76 -0
- package/src/harness_context/skills/ecc/santa-method/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/santa-method/SKILL.md +307 -0
- package/src/harness_context/skills/ecc/scientific-db-pubmed-database/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/scientific-db-pubmed-database/SKILL.md +176 -0
- package/src/harness_context/skills/ecc/scientific-db-uspto-database/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/scientific-db-uspto-database/SKILL.md +178 -0
- package/src/harness_context/skills/ecc/scientific-pkg-gget/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/scientific-pkg-gget/SKILL.md +167 -0
- package/src/harness_context/skills/ecc/scientific-thinking-literature-review/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/scientific-thinking-literature-review/SKILL.md +193 -0
- package/src/harness_context/skills/ecc/scientific-thinking-scholar-evaluation/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/scientific-thinking-scholar-evaluation/SKILL.md +161 -0
- package/src/harness_context/skills/ecc/search-first/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/search-first/SKILL.md +183 -0
- package/src/harness_context/skills/ecc/security-bounty-hunter/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/security-bounty-hunter/SKILL.md +100 -0
- package/src/harness_context/skills/ecc/security-review/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/security-review/SKILL.md +504 -0
- package/src/harness_context/skills/ecc/security-review/cloud-infrastructure-security.md +361 -0
- package/src/harness_context/skills/ecc/security-scan/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/security-scan/SKILL.md +166 -0
- package/src/harness_context/skills/ecc/seo/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/seo/SKILL.md +155 -0
- package/src/harness_context/skills/ecc/skill-comply/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/skill-comply/SKILL.md +59 -0
- package/src/harness_context/skills/ecc/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/src/harness_context/skills/ecc/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/src/harness_context/skills/ecc/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/src/harness_context/skills/ecc/skill-comply/prompts/classifier.md +24 -0
- package/src/harness_context/skills/ecc/skill-comply/prompts/scenario_generator.md +62 -0
- package/src/harness_context/skills/ecc/skill-comply/prompts/spec_generator.md +42 -0
- package/src/harness_context/skills/ecc/skill-comply/pyproject.toml +16 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/__init__.py +0 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/classifier.py +85 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/grader.py +124 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/parser.py +107 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/report.py +170 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/run.py +127 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/runner.py +245 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/scenario_generator.py +70 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/spec_generator.py +72 -0
- package/src/harness_context/skills/ecc/skill-comply/scripts/utils.py +13 -0
- package/src/harness_context/skills/ecc/skill-comply/tests/test_grader.py +197 -0
- package/src/harness_context/skills/ecc/skill-comply/tests/test_parser.py +90 -0
- package/src/harness_context/skills/ecc/skill-comply/tests/test_runner.py +316 -0
- package/src/harness_context/skills/ecc/skill-scout/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/skill-scout/SKILL.md +141 -0
- package/src/harness_context/skills/ecc/skill-stocktake/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/skill-stocktake/SKILL.md +195 -0
- package/src/harness_context/skills/ecc/skill-stocktake/scripts/quick-diff.sh +118 -0
- package/src/harness_context/skills/ecc/skill-stocktake/scripts/save-results.sh +56 -0
- package/src/harness_context/skills/ecc/skill-stocktake/scripts/scan.sh +211 -0
- package/src/harness_context/skills/ecc/social-graph-ranker/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/social-graph-ranker/SKILL.md +155 -0
- package/src/harness_context/skills/ecc/social-publisher/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/social-publisher/SKILL.md +139 -0
- package/src/harness_context/skills/ecc/springboot-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/springboot-patterns/SKILL.md +315 -0
- package/src/harness_context/skills/ecc/springboot-security/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/springboot-security/SKILL.md +273 -0
- package/src/harness_context/skills/ecc/springboot-tdd/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/springboot-tdd/SKILL.md +159 -0
- package/src/harness_context/skills/ecc/springboot-verification/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/springboot-verification/SKILL.md +232 -0
- package/src/harness_context/skills/ecc/strategic-compact/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/strategic-compact/SKILL.md +156 -0
- package/src/harness_context/skills/ecc/swift-actor-persistence/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/swift-actor-persistence/SKILL.md +144 -0
- package/src/harness_context/skills/ecc/swift-concurrency-6-2/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/swift-concurrency-6-2/SKILL.md +216 -0
- package/src/harness_context/skills/ecc/swift-protocol-di-testing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/swift-protocol-di-testing/SKILL.md +191 -0
- package/src/harness_context/skills/ecc/swiftui-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/swiftui-patterns/SKILL.md +259 -0
- package/src/harness_context/skills/ecc/taste/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/taste/SKILL.md +264 -0
- package/src/harness_context/skills/ecc/taste/references/genre-taxonomy.md +87 -0
- package/src/harness_context/skills/ecc/tasteforge-video/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/tasteforge-video/SKILL.md +192 -0
- package/src/harness_context/skills/ecc/tdd-workflow/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/tdd-workflow/SKILL.md +583 -0
- package/src/harness_context/skills/ecc/team-agent-orchestration/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/team-agent-orchestration/SKILL.md +111 -0
- package/src/harness_context/skills/ecc/team-builder/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/team-builder/SKILL.md +169 -0
- package/src/harness_context/skills/ecc/terminal-opener/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/terminal-opener/SKILL.md +55 -0
- package/src/harness_context/skills/ecc/terminal-opener/agents/openai.yaml +4 -0
- package/src/harness_context/skills/ecc/terminal-opener/scripts/open-terminal.js +396 -0
- package/src/harness_context/skills/ecc/terminal-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/terminal-ops/SKILL.md +110 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/SKILL.md +279 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/references/architecture.md +90 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/references/data-handling.md +60 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/references/database.md +99 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/references/routing.md +64 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/references/system-usage.md +97 -0
- package/src/harness_context/skills/ecc/tinystruct-patterns/references/testing.md +72 -0
- package/src/harness_context/skills/ecc/token-budget-advisor/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/token-budget-advisor/SKILL.md +134 -0
- package/src/harness_context/skills/ecc/ui-demo/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ui-demo/SKILL.md +466 -0
- package/src/harness_context/skills/ecc/ui-to-vue/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/ui-to-vue/SKILL.md +135 -0
- package/src/harness_context/skills/ecc/uncloud/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/uncloud/SKILL.md +344 -0
- package/src/harness_context/skills/ecc/unified-memory/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/unified-memory/SKILL.md +170 -0
- package/src/harness_context/skills/ecc/unified-notifications-ops/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/unified-notifications-ops/SKILL.md +188 -0
- package/src/harness_context/skills/ecc/verification-loop/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/verification-loop/SKILL.md +129 -0
- package/src/harness_context/skills/ecc/video-editing/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/video-editing/SKILL.md +311 -0
- package/src/harness_context/skills/ecc/videodb/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/videodb/SKILL.md +375 -0
- package/src/harness_context/skills/ecc/videodb/reference/api-reference.md +550 -0
- package/src/harness_context/skills/ecc/videodb/reference/capture-reference.md +407 -0
- package/src/harness_context/skills/ecc/videodb/reference/capture.md +101 -0
- package/src/harness_context/skills/ecc/videodb/reference/editor.md +443 -0
- package/src/harness_context/skills/ecc/videodb/reference/generative.md +331 -0
- package/src/harness_context/skills/ecc/videodb/reference/rtstream-reference.md +564 -0
- package/src/harness_context/skills/ecc/videodb/reference/rtstream.md +65 -0
- package/src/harness_context/skills/ecc/videodb/reference/search.md +230 -0
- package/src/harness_context/skills/ecc/videodb/reference/streaming.md +406 -0
- package/src/harness_context/skills/ecc/videodb/reference/use-cases.md +118 -0
- package/src/harness_context/skills/ecc/videodb/scripts/ws_listener.py +282 -0
- package/src/harness_context/skills/ecc/visa-doc-translate/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/visa-doc-translate/README.md +86 -0
- package/src/harness_context/skills/ecc/visa-doc-translate/SKILL.md +117 -0
- package/src/harness_context/skills/ecc/vite-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/vite-patterns/SKILL.md +450 -0
- package/src/harness_context/skills/ecc/vue-patterns/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/vue-patterns/SKILL.md +471 -0
- package/src/harness_context/skills/ecc/windows-desktop-e2e/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/windows-desktop-e2e/SKILL.md +888 -0
- package/src/harness_context/skills/ecc/workspace-surface-audit/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/workspace-surface-audit/SKILL.md +126 -0
- package/src/harness_context/skills/ecc/x-api/LICENSE.ecc +21 -0
- package/src/harness_context/skills/ecc/x-api/SKILL.md +244 -0
- package/src/harness_context/skills/ecc_catalog.json +2233 -0
- package/src/harness_context/skills/router.py +394 -0
- package/src/harness_context/workspace/roots.py +1 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: homelab-vlan-segmentation
|
|
3
|
+
description: Segmenting home networks into VLANs for IoT, guest, trusted, and server traffic using UniFi, pfSense/OPNsense, and MikroTik — including switch trunk config, firewall rules, and wireless SSID mapping. Use when splitting a home network into IoT, guest, trusted, and server VLANs on UniFi, pfSense/OPNsense, or MikroTik.
|
|
4
|
+
metadata:
|
|
5
|
+
origin: community
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Homelab VLAN Segmentation
|
|
9
|
+
|
|
10
|
+
How to split a home network into isolated VLANs so IoT devices, guests, and your main
|
|
11
|
+
PCs cannot talk to each other. The most impactful security upgrade for a home network.
|
|
12
|
+
|
|
13
|
+
All firewall rules shown here add isolation between segments — they do not remove
|
|
14
|
+
existing protections. Apply changes in a maintenance window and verify connectivity
|
|
15
|
+
between segments after each step before moving on.
|
|
16
|
+
|
|
17
|
+
## When to Use
|
|
18
|
+
|
|
19
|
+
- Setting up VLANs on a home network for the first time
|
|
20
|
+
- Isolating IoT devices (smart bulbs, cameras, TVs) from trusted devices
|
|
21
|
+
- Creating a guest Wi-Fi network that cannot reach home devices
|
|
22
|
+
- Explaining how VLANs work to someone unfamiliar with the concept
|
|
23
|
+
- Configuring trunk ports, access ports, and SSID-to-VLAN mapping
|
|
24
|
+
- Troubleshooting inter-VLAN routing or firewall rule issues on pfSense/OPNsense/UniFi
|
|
25
|
+
|
|
26
|
+
## How It Works
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Without VLANs — flat network:
|
|
30
|
+
All devices on 192.168.1.0/24
|
|
31
|
+
Smart TV (potential malware) → can reach your NAS, PCs, everything
|
|
32
|
+
|
|
33
|
+
With VLANs:
|
|
34
|
+
VLAN 10 — Trusted 192.168.10.0/24 (PCs, phones, laptops)
|
|
35
|
+
VLAN 20 — IoT 192.168.20.0/24 (smart TV, bulbs, cameras)
|
|
36
|
+
VLAN 30 — Servers 192.168.30.0/24 (NAS, Pi, VMs)
|
|
37
|
+
VLAN 40 — Guest 192.168.40.0/24 (visitor Wi-Fi)
|
|
38
|
+
VLAN 99 — Management 192.168.99.0/24 (switch/AP web UIs)
|
|
39
|
+
|
|
40
|
+
Smart TV → blocked from reaching 192.168.10.0/24 and 192.168.30.0/24
|
|
41
|
+
Guests → internet only, cannot see any home devices
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## VLAN Design Template
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
VLAN Name Subnet Gateway Purpose
|
|
48
|
+
10 trusted 192.168.10.0/24 192.168.10.1 PCs, phones, laptops
|
|
49
|
+
20 iot 192.168.20.0/24 192.168.20.1 Smart home devices
|
|
50
|
+
30 servers 192.168.30.0/24 192.168.30.1 NAS, Pi, self-hosted
|
|
51
|
+
40 guest 192.168.40.0/24 192.168.40.1 Visitor Wi-Fi
|
|
52
|
+
99 management 192.168.99.0/24 192.168.99.1 Network gear web UIs
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
**Typical homelab with UniFi AP and managed switch:**
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Scenario: 3-bedroom house, UniFi Dream Machine + UniFi 8-port switch + 2 APs
|
|
61
|
+
|
|
62
|
+
VLAN 10 — Trusted 192.168.10.0/24 MacBook, iPhones, iPad
|
|
63
|
+
VLAN 20 — IoT 192.168.20.0/24 Nest thermostat, Philips Hue, Ring doorbell, smart TVs
|
|
64
|
+
VLAN 30 — Servers 192.168.30.0/24 Synology NAS (192.168.30.10), Pi-hole (192.168.30.2)
|
|
65
|
+
VLAN 40 — Guest 192.168.40.0/24 Visitor Wi-Fi — internet only
|
|
66
|
+
|
|
67
|
+
SSID → VLAN mapping:
|
|
68
|
+
"Home" → VLAN 10 (WPA2, strong password, trusted devices only)
|
|
69
|
+
"IoT" → VLAN 20 (WPA2, separate password, printed on router for setup)
|
|
70
|
+
"Guest" → VLAN 40 (WPA2, simple password you can share freely)
|
|
71
|
+
|
|
72
|
+
Switch port behavior:
|
|
73
|
+
Port 1 → trunk to router (tagged VLANs 10,20,30,40,99)
|
|
74
|
+
Port 2 → trunk to APs (tagged VLANs 10,20,40; AP handles per-SSID tagging)
|
|
75
|
+
Port 3 → access VLAN 30 (NAS — untagged, no VLAN awareness needed)
|
|
76
|
+
Port 4 → access VLAN 30 (Pi-hole — untagged)
|
|
77
|
+
Port 5–8 → access VLAN 10 (wired workstations)
|
|
78
|
+
|
|
79
|
+
Firewall rules applied (all rules add isolation, none remove existing protections):
|
|
80
|
+
IoT → Trusted: BLOCK
|
|
81
|
+
IoT → Servers: BLOCK except 192.168.30.2:53 (Pi-hole DNS allowed)
|
|
82
|
+
IoT → Internet: ALLOW
|
|
83
|
+
Guest → Local networks: BLOCK
|
|
84
|
+
Guest → Internet: ALLOW
|
|
85
|
+
Trusted → everywhere: ALLOW
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## UniFi Configuration
|
|
89
|
+
|
|
90
|
+
### Create Networks in UniFi Controller
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
Settings → Networks → Create New Network
|
|
94
|
+
|
|
95
|
+
For each VLAN:
|
|
96
|
+
Name: IoT
|
|
97
|
+
Purpose: Corporate (gives DHCP + routing)
|
|
98
|
+
VLAN ID: 20
|
|
99
|
+
Network: 192.168.20.0/24
|
|
100
|
+
Gateway IP: 192.168.20.1
|
|
101
|
+
DHCP: Enable
|
|
102
|
+
DHCP Range: 192.168.20.100 – 192.168.20.254
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Map SSIDs to VLANs (UniFi)
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
Settings → WiFi → Create New WiFi
|
|
109
|
+
|
|
110
|
+
Name: IoT-Network
|
|
111
|
+
Password: <separate password>
|
|
112
|
+
Network: IoT ← select your VLAN here
|
|
113
|
+
# All devices connecting to this SSID land in VLAN 20
|
|
114
|
+
|
|
115
|
+
Name: Guest
|
|
116
|
+
Password: <guest password>
|
|
117
|
+
Network: Guest
|
|
118
|
+
Guest Policy: Enable ← isolates guests from each other too
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### UniFi Firewall Rules (Traffic Rules)
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
Settings → Traffic & Security → Traffic Rules
|
|
125
|
+
|
|
126
|
+
# Block IoT from reaching Trusted VLAN
|
|
127
|
+
Action: Block
|
|
128
|
+
Category: Local Network
|
|
129
|
+
Source: IoT (192.168.20.0/24)
|
|
130
|
+
Destination: Trusted (192.168.10.0/24)
|
|
131
|
+
|
|
132
|
+
# Allow IoT to reach internet only
|
|
133
|
+
Action: Allow
|
|
134
|
+
Source: IoT
|
|
135
|
+
Destination: Internet
|
|
136
|
+
|
|
137
|
+
# Block Guest from all local networks
|
|
138
|
+
Action: Block
|
|
139
|
+
Source: Guest
|
|
140
|
+
Destination: Local Networks
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## pfSense / OPNsense Configuration
|
|
144
|
+
|
|
145
|
+
### Create VLANs
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
Interfaces → Assignments → VLANs → Add
|
|
149
|
+
|
|
150
|
+
Parent Interface: em1 (your LAN NIC)
|
|
151
|
+
VLAN Tag: 20
|
|
152
|
+
Description: IoT
|
|
153
|
+
|
|
154
|
+
# Repeat for each VLAN, then assign each VLAN to an interface:
|
|
155
|
+
Interfaces → Assignments → Add
|
|
156
|
+
Select the VLAN you created → click Add
|
|
157
|
+
Enable the interface, set IP to gateway address (192.168.20.1/24)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### DHCP for Each VLAN
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
Services → DHCP Server → Select your VLAN interface
|
|
164
|
+
|
|
165
|
+
Enable DHCP
|
|
166
|
+
Range: 192.168.20.100 to 192.168.20.254
|
|
167
|
+
DNS Servers: 192.168.30.2 ← Pi-hole IP if you have one
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Firewall Rules (pfSense/OPNsense)
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
# Rules are processed top-to-bottom, first match wins.
|
|
174
|
+
|
|
175
|
+
# On the IoT interface (VLAN 20):
|
|
176
|
+
Rule 1: Allow IoT → Pi-hole DNS ← MUST come before the RFC1918 block rule
|
|
177
|
+
Protocol: UDP/TCP
|
|
178
|
+
Source: IoT net
|
|
179
|
+
Destination: 192.168.30.2 port 53
|
|
180
|
+
Action: Allow
|
|
181
|
+
|
|
182
|
+
Rule 2: Block IoT → RFC1918 (all private IP ranges)
|
|
183
|
+
Protocol: any
|
|
184
|
+
Source: IoT net
|
|
185
|
+
Destination: RFC1918 (192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12)
|
|
186
|
+
Action: Block
|
|
187
|
+
|
|
188
|
+
Rule 3: Allow IoT → internet
|
|
189
|
+
Protocol: any
|
|
190
|
+
Source: IoT net
|
|
191
|
+
Destination: any
|
|
192
|
+
Action: Allow
|
|
193
|
+
|
|
194
|
+
# On the Trusted interface (VLAN 10):
|
|
195
|
+
Allow all (trusted devices can reach everything)
|
|
196
|
+
Source: Trusted net
|
|
197
|
+
Destination: any
|
|
198
|
+
Action: Allow
|
|
199
|
+
|
|
200
|
+
# Additional exceptions for IoT devices that need specific local services:
|
|
201
|
+
Insert before Rule 2 (the RFC1918 block):
|
|
202
|
+
Protocol: TCP
|
|
203
|
+
Source: IoT net
|
|
204
|
+
Destination: 192.168.30.x port 8123 ← Home Assistant
|
|
205
|
+
Action: Allow
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## MikroTik Configuration
|
|
209
|
+
|
|
210
|
+
```
|
|
211
|
+
# Step 1: Create a bridge with VLAN filtering enabled
|
|
212
|
+
/interface bridge
|
|
213
|
+
add name=bridge vlan-filtering=yes
|
|
214
|
+
|
|
215
|
+
# Step 2: Add physical ports to the bridge
|
|
216
|
+
# Trunk port to router/uplink (tagged for all VLANs)
|
|
217
|
+
/interface bridge port
|
|
218
|
+
add bridge=bridge interface=ether1 frame-types=admit-only-vlan-tagged
|
|
219
|
+
|
|
220
|
+
# Access port for trusted devices (untagged VLAN 10)
|
|
221
|
+
/interface bridge port
|
|
222
|
+
add bridge=bridge interface=ether2 pvid=10 frame-types=admit-only-untagged-and-priority-tagged
|
|
223
|
+
|
|
224
|
+
# Access port for IoT devices (untagged VLAN 20)
|
|
225
|
+
/interface bridge port
|
|
226
|
+
add bridge=bridge interface=ether3 pvid=20 frame-types=admit-only-untagged-and-priority-tagged
|
|
227
|
+
|
|
228
|
+
# Step 3: Define which VLANs are allowed on which ports
|
|
229
|
+
/interface bridge vlan
|
|
230
|
+
add bridge=bridge tagged=ether1 untagged=ether2 vlan-ids=10
|
|
231
|
+
add bridge=bridge tagged=ether1 untagged=ether3 vlan-ids=20
|
|
232
|
+
|
|
233
|
+
# Step 4: Create VLAN interfaces on the bridge (gateway IPs)
|
|
234
|
+
/interface vlan
|
|
235
|
+
add interface=bridge name=vlan10 vlan-id=10
|
|
236
|
+
add interface=bridge name=vlan20 vlan-id=20
|
|
237
|
+
|
|
238
|
+
# Step 5: Assign gateway IPs
|
|
239
|
+
/ip address
|
|
240
|
+
add interface=vlan10 address=192.168.10.1/24
|
|
241
|
+
add interface=vlan20 address=192.168.20.1/24
|
|
242
|
+
|
|
243
|
+
# Step 6: DHCP pools and servers
|
|
244
|
+
/ip pool
|
|
245
|
+
add name=pool-trusted ranges=192.168.10.100-192.168.10.254
|
|
246
|
+
add name=pool-iot ranges=192.168.20.100-192.168.20.254
|
|
247
|
+
|
|
248
|
+
/ip dhcp-server
|
|
249
|
+
add interface=vlan10 address-pool=pool-trusted name=dhcp-trusted
|
|
250
|
+
add interface=vlan20 address-pool=pool-iot name=dhcp-iot
|
|
251
|
+
|
|
252
|
+
/ip dhcp-server network
|
|
253
|
+
add address=192.168.10.0/24 gateway=192.168.10.1
|
|
254
|
+
add address=192.168.20.0/24 gateway=192.168.20.1
|
|
255
|
+
|
|
256
|
+
# Step 7: Firewall — block IoT from reaching trusted VLAN
|
|
257
|
+
/ip firewall filter
|
|
258
|
+
add chain=forward src-address=192.168.20.0/24 dst-address=192.168.10.0/24 \
|
|
259
|
+
action=drop comment="Block IoT to Trusted"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Switch Trunk vs Access Ports
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
# Trunk port: carries multiple VLANs (tagged) — connects switch-to-switch, switch-to-router, switch-to-AP
|
|
266
|
+
# Access port: carries one VLAN (untagged) — connects to end devices (PC, camera, NAS)
|
|
267
|
+
|
|
268
|
+
# A managed switch port connected to your router should be a trunk:
|
|
269
|
+
Allowed VLANs: 10, 20, 30, 40, 99
|
|
270
|
+
|
|
271
|
+
# A port connecting to a PC should be an access port:
|
|
272
|
+
VLAN: 10 (trusted)
|
|
273
|
+
No tagging — the PC does not know or care about VLANs
|
|
274
|
+
|
|
275
|
+
# A port connecting to an AP must be a trunk:
|
|
276
|
+
The AP tags traffic from each SSID with the right VLAN ID
|
|
277
|
+
Allowed VLANs: 10, 20, 40 (whichever SSIDs the AP serves)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Anti-Patterns
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
# BAD: Creating VLANs without adding firewall rules
|
|
284
|
+
# VLANs without firewall rules do not provide security — inter-VLAN routing is open by default
|
|
285
|
+
# GOOD: Add explicit block rules immediately after creating VLANs
|
|
286
|
+
|
|
287
|
+
# BAD: Putting the Pi-hole in the IoT VLAN
|
|
288
|
+
# IoT devices can reach it but trusted devices cannot (without extra rules)
|
|
289
|
+
# GOOD: Pi-hole in the Servers VLAN with a rule allowing all VLANs to reach port 53
|
|
290
|
+
|
|
291
|
+
# BAD: Native VLAN equals management VLAN
|
|
292
|
+
# Untagged traffic landing in your management VLAN enables VLAN hopping attacks
|
|
293
|
+
# GOOD: Use a dedicated unused VLAN as native (e.g. VLAN 999), keep management traffic tagged
|
|
294
|
+
|
|
295
|
+
# BAD: Same Wi-Fi password for IoT SSID and trusted SSID
|
|
296
|
+
# Anyone who learns the password can connect IoT devices to the wrong segment
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## Best Practices
|
|
300
|
+
|
|
301
|
+
- Start with 4 VLANs: Trusted, IoT, Servers, Guest — add more as needed
|
|
302
|
+
- Put Pi-hole in the Servers VLAN (192.168.30.x)
|
|
303
|
+
- Add a firewall rule allowing DNS (port 53) from all VLANs to the Pi-hole IP — before any RFC1918 block rule
|
|
304
|
+
- Test isolation after every rule change: from the IoT VLAN, try to ping a trusted device — it should fail
|
|
305
|
+
- Use a management VLAN for switch and AP web UIs and restrict access to the Trusted VLAN only
|
|
306
|
+
- Document your VLAN design in a table (VLAN ID, name, subnet, purpose)
|
|
307
|
+
|
|
308
|
+
## Related Skills
|
|
309
|
+
|
|
310
|
+
- homelab-network-setup
|
|
311
|
+
- homelab-pihole-dns
|
|
312
|
+
- homelab-wireguard-vpn
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Affaan Mustafa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: homelab-wireguard-vpn
|
|
3
|
+
description: WireGuard VPN server setup, peer configuration, key generation, split tunneling vs full tunnel routing, and remote access to a home network from mobile and laptop clients. Use when setting up WireGuard for remote access to a home network, or deciding between split and full tunnel routing.
|
|
4
|
+
metadata:
|
|
5
|
+
origin: community
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Homelab WireGuard VPN
|
|
9
|
+
|
|
10
|
+
WireGuard is a fast, modern VPN protocol. It is the right choice for remote access to a
|
|
11
|
+
home network — simpler to configure than OpenVPN and faster than most alternatives.
|
|
12
|
+
|
|
13
|
+
All configuration examples show common setups. Review each command — especially the
|
|
14
|
+
iptables forwarding rules and key file permissions — before applying them to your
|
|
15
|
+
system, and make changes in a maintenance window.
|
|
16
|
+
|
|
17
|
+
## When to Use
|
|
18
|
+
|
|
19
|
+
- Setting up WireGuard server on a Raspberry Pi, Linux host, pfSense, or router
|
|
20
|
+
- Generating WireGuard keypairs and writing peer config files
|
|
21
|
+
- Configuring remote access from a phone or laptop to a home network
|
|
22
|
+
- Explaining split tunneling (route only home traffic) vs full tunnel (route all traffic)
|
|
23
|
+
- Troubleshooting WireGuard connections that will not come up
|
|
24
|
+
- Automating peer configuration generation for multiple clients
|
|
25
|
+
|
|
26
|
+
## How WireGuard Works
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Your phone (WireGuard client)
|
|
30
|
+
│
|
|
31
|
+
│ Encrypted UDP tunnel (port 51820)
|
|
32
|
+
│
|
|
33
|
+
Your home router (WireGuard server — needs a public IP or DDNS)
|
|
34
|
+
│
|
|
35
|
+
Your home network (192.168.1.0/24, NAS, Pi, etc.)
|
|
36
|
+
|
|
37
|
+
Every device has a keypair (public + private key).
|
|
38
|
+
The server knows each client's public key.
|
|
39
|
+
The client knows the server's public key + endpoint (IP:port).
|
|
40
|
+
Traffic is encrypted end-to-end with no central server or certificate authority.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Server Setup (Linux)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Install WireGuard
|
|
47
|
+
sudo apt update && sudo apt install wireguard -y
|
|
48
|
+
|
|
49
|
+
# Generate server keypair — create files with private permissions from the start
|
|
50
|
+
sudo mkdir -p /etc/wireguard
|
|
51
|
+
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server_private.key'
|
|
52
|
+
sudo sh -c 'wg pubkey < /etc/wireguard/server_private.key > /etc/wireguard/server_public.key'
|
|
53
|
+
|
|
54
|
+
# Write server config — substitute the actual private key value
|
|
55
|
+
# Do not store private keys in version control or share them
|
|
56
|
+
sudo tee /etc/wireguard/wg0.conf << 'EOF'
|
|
57
|
+
[Interface]
|
|
58
|
+
Address = 10.8.0.1/24 # VPN subnet — server gets .1
|
|
59
|
+
ListenPort = 51820
|
|
60
|
+
PrivateKey = <paste_server_private_key_here>
|
|
61
|
+
|
|
62
|
+
# Scoped forwarding rules: allow VPN traffic in/out, not a blanket FORWARD ACCEPT
|
|
63
|
+
PostUp = iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
|
|
64
|
+
PostUp = iptables -A FORWARD -i eth0 -o wg0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|
|
65
|
+
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
|
|
66
|
+
PostDown = iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT
|
|
67
|
+
PostDown = iptables -D FORWARD -i eth0 -o wg0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|
|
68
|
+
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
|
|
69
|
+
|
|
70
|
+
[Peer]
|
|
71
|
+
# Phone — replace with the actual phone public key
|
|
72
|
+
PublicKey = <phone_public_key>
|
|
73
|
+
AllowedIPs = 10.8.0.2/32
|
|
74
|
+
|
|
75
|
+
[Peer]
|
|
76
|
+
# Laptop — replace with the actual laptop public key
|
|
77
|
+
PublicKey = <laptop_public_key>
|
|
78
|
+
AllowedIPs = 10.8.0.3/32
|
|
79
|
+
EOF
|
|
80
|
+
sudo chmod 600 /etc/wireguard/wg0.conf
|
|
81
|
+
|
|
82
|
+
# Replace eth0 with your actual outbound interface name
|
|
83
|
+
# Check with: ip route show default
|
|
84
|
+
|
|
85
|
+
# Enable IP forwarding (required for routing traffic through the server)
|
|
86
|
+
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
|
|
87
|
+
sudo sysctl --system
|
|
88
|
+
|
|
89
|
+
# Start WireGuard and enable on boot
|
|
90
|
+
sudo wg-quick up wg0
|
|
91
|
+
sudo systemctl enable wg-quick@wg0
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Client Configuration
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Generate a unique keypair for each client device
|
|
98
|
+
# Run on the client, or on the server and transfer the private key securely — never in plaintext
|
|
99
|
+
umask 077
|
|
100
|
+
wg genkey | tee phone_private.key | wg pubkey > phone_public.key
|
|
101
|
+
|
|
102
|
+
# Client config file (phone_wg0.conf):
|
|
103
|
+
[Interface]
|
|
104
|
+
PrivateKey = <phone_private_key>
|
|
105
|
+
Address = 10.8.0.2/32
|
|
106
|
+
DNS = 192.168.1.2 # Optional: use Pi-hole for DNS over the tunnel
|
|
107
|
+
|
|
108
|
+
[Peer]
|
|
109
|
+
PublicKey = <server_public_key>
|
|
110
|
+
Endpoint = your-home-ip.ddns.net:51820 # Your public IP or DDNS hostname
|
|
111
|
+
AllowedIPs = 192.168.1.0/24 # Split tunnel: only home network traffic
|
|
112
|
+
# AllowedIPs = 0.0.0.0/0, ::/0 # Full tunnel: all traffic through VPN
|
|
113
|
+
|
|
114
|
+
PersistentKeepalive = 25 # Keep NAT hole open (required for mobile clients)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Split Tunnel vs Full Tunnel
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
# Split tunnel: AllowedIPs = 192.168.1.0/24
|
|
121
|
+
Only traffic destined for your home network goes through the VPN.
|
|
122
|
+
Internet traffic (YouTube, Spotify) goes directly — better performance on mobile.
|
|
123
|
+
Best for: "I just want to reach my NAS and Pi from anywhere."
|
|
124
|
+
|
|
125
|
+
# Full tunnel: AllowedIPs = 0.0.0.0/0, ::/0
|
|
126
|
+
ALL traffic goes through your home internet connection.
|
|
127
|
+
Useful for: piggybacking home DNS/Pi-hole ad blocking.
|
|
128
|
+
Downside: home upload speed becomes your bottleneck everywhere.
|
|
129
|
+
|
|
130
|
+
# Multi-subnet split tunnel (most common homelab use case):
|
|
131
|
+
AllowedIPs = 192.168.10.0/24, 192.168.20.0/24, 192.168.30.0/24, 10.8.0.0/24
|
|
132
|
+
Routes all your VLANs through the tunnel; internet stays direct.
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Key Generation and Peer Management
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
import subprocess
|
|
139
|
+
|
|
140
|
+
def generate_keypair() -> tuple[str, str]:
|
|
141
|
+
"""Generate a WireGuard keypair. Returns (private_key, public_key)."""
|
|
142
|
+
private = subprocess.check_output(["wg", "genkey"]).decode().strip()
|
|
143
|
+
public = subprocess.run(
|
|
144
|
+
["wg", "pubkey"], input=private.encode(), capture_output=True
|
|
145
|
+
).stdout.decode().strip()
|
|
146
|
+
return private, public
|
|
147
|
+
|
|
148
|
+
def generate_preshared_key() -> str:
|
|
149
|
+
return subprocess.check_output(["wg", "genpsk"]).decode().strip()
|
|
150
|
+
|
|
151
|
+
def build_client_config(
|
|
152
|
+
client_private_key: str,
|
|
153
|
+
client_vpn_ip: str, # e.g. "10.8.0.3"
|
|
154
|
+
server_public_key: str,
|
|
155
|
+
server_endpoint: str, # e.g. "home.example.com:51820"
|
|
156
|
+
allowed_ips: str = "192.168.1.0/24",
|
|
157
|
+
dns: str = "",
|
|
158
|
+
) -> str:
|
|
159
|
+
dns_line = f"DNS = {dns}\n" if dns else ""
|
|
160
|
+
return f"""[Interface]
|
|
161
|
+
PrivateKey = {client_private_key}
|
|
162
|
+
Address = {client_vpn_ip}/32
|
|
163
|
+
{dns_line}
|
|
164
|
+
[Peer]
|
|
165
|
+
PublicKey = {server_public_key}
|
|
166
|
+
Endpoint = {server_endpoint}
|
|
167
|
+
AllowedIPs = {allowed_ips}
|
|
168
|
+
PersistentKeepalive = 25
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
def build_server_peer_block(
|
|
172
|
+
client_public_key: str,
|
|
173
|
+
client_vpn_ip: str,
|
|
174
|
+
comment: str = "",
|
|
175
|
+
) -> str:
|
|
176
|
+
comment_line = f"# {comment}\n" if comment else ""
|
|
177
|
+
return f"""
|
|
178
|
+
{comment_line}[Peer]
|
|
179
|
+
PublicKey = {client_public_key}
|
|
180
|
+
AllowedIPs = {client_vpn_ip}/32
|
|
181
|
+
"""
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Keep private keys out of source control. If you use this script, write key material
|
|
185
|
+
to files with mode 600 and never log or print it.
|
|
186
|
+
|
|
187
|
+
## pfSense / OPNsense WireGuard
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
# pfSense: VPN → WireGuard → Add Tunnel
|
|
191
|
+
Interface Keys: Generate (creates keypair automatically)
|
|
192
|
+
Listen Port: 51820
|
|
193
|
+
Interface Address: 10.8.0.1/24
|
|
194
|
+
|
|
195
|
+
# Add Peer (one per client):
|
|
196
|
+
Public Key: <client public key>
|
|
197
|
+
Allowed IPs: 10.8.0.2/32
|
|
198
|
+
|
|
199
|
+
# Assign the WireGuard interface:
|
|
200
|
+
Interfaces → Assignments → Add (select wg0)
|
|
201
|
+
Enable interface, no IP needed (it is set in the tunnel config)
|
|
202
|
+
|
|
203
|
+
# Firewall rules:
|
|
204
|
+
WAN → Allow UDP port 51820 inbound (so clients can reach the server)
|
|
205
|
+
WireGuard interface → Allow traffic to LAN networks you want reachable
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## DDNS (Dynamic DNS) for Home Servers
|
|
209
|
+
|
|
210
|
+
Most home internet connections have a dynamic IP. Use DDNS so your VPN endpoint
|
|
211
|
+
stays reachable after an IP change.
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Option 1: Cloudflare DDNS — store credentials in a secrets file, not inline
|
|
215
|
+
# docker-compose entry using an env file:
|
|
216
|
+
ddns-updater:
|
|
217
|
+
image: qmcgaw/ddns-updater
|
|
218
|
+
env_file: ./ddns.env # store zone_id and token here, not in compose
|
|
219
|
+
restart: unless-stopped
|
|
220
|
+
|
|
221
|
+
# ddns.env (chmod 600, not committed to git):
|
|
222
|
+
# SETTINGS_CLOUDFLARE_ZONE_ID=your_zone_id
|
|
223
|
+
# SETTINGS_CLOUDFLARE_TOKEN=your_api_token
|
|
224
|
+
|
|
225
|
+
# Option 2: DuckDNS (free, simple)
|
|
226
|
+
Sign up at duckdns.org → get a token and subdomain (myhome.duckdns.org)
|
|
227
|
+
Store token in /etc/ddns.env (mode 600), then use a small root-owned script:
|
|
228
|
+
|
|
229
|
+
# /usr/local/bin/update-duckdns
|
|
230
|
+
#!/bin/sh
|
|
231
|
+
set -eu
|
|
232
|
+
. /etc/ddns.env
|
|
233
|
+
curl --fail --silent --show-error --max-time 10 \
|
|
234
|
+
--get "https://www.duckdns.org/update" \
|
|
235
|
+
--data-urlencode "domains=myhome" \
|
|
236
|
+
--data-urlencode "token=${DUCKDNS_TOKEN}" \
|
|
237
|
+
--data-urlencode "ip="
|
|
238
|
+
|
|
239
|
+
# Cron job:
|
|
240
|
+
*/5 * * * * /usr/local/bin/update-duckdns >/dev/null 2>&1
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Troubleshooting
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# Check WireGuard status and last handshake
|
|
247
|
+
sudo wg show
|
|
248
|
+
|
|
249
|
+
# If "latest handshake" is never or very old, the tunnel is not connected.
|
|
250
|
+
# Check:
|
|
251
|
+
# 1. Is UDP port 51820 open on the router/firewall?
|
|
252
|
+
sudo ufw status # or check pfSense/UniFi firewall rules
|
|
253
|
+
|
|
254
|
+
# 2. Is the server public key in the client config correct?
|
|
255
|
+
sudo wg show wg0 public-key # Compare to what is in the client config
|
|
256
|
+
|
|
257
|
+
# 3. Is IP forwarding enabled on the server?
|
|
258
|
+
cat /proc/sys/net/ipv4/ip_forward # Should be 1
|
|
259
|
+
|
|
260
|
+
# 4. Does the client AllowedIPs cover the IP you are trying to reach?
|
|
261
|
+
# If AllowedIPs = 192.168.1.0/24 and you are trying to reach 192.168.3.5, it will not route.
|
|
262
|
+
|
|
263
|
+
# Check kernel logs for WireGuard errors
|
|
264
|
+
dmesg | grep wireguard
|
|
265
|
+
|
|
266
|
+
# Restart WireGuard
|
|
267
|
+
sudo wg-quick down wg0 && sudo wg-quick up wg0
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Anti-Patterns
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
# BAD: Storing private keys in version control or sharing them
|
|
274
|
+
# Private keys are equivalent to passwords — never commit them to git
|
|
275
|
+
|
|
276
|
+
# BAD: Using AllowedIPs = 0.0.0.0/0 on mobile without considering the impact
|
|
277
|
+
# Full tunnel routes all mobile traffic through your home upload — usually slow
|
|
278
|
+
|
|
279
|
+
# BAD: Not setting PersistentKeepalive on mobile clients
|
|
280
|
+
# Mobile clients behind NAT drop idle tunnels without it
|
|
281
|
+
|
|
282
|
+
# BAD: Opening port 51820 in the firewall but forgetting IP forwarding on the server
|
|
283
|
+
# Tunnel connects but no traffic routes — confusing to debug
|
|
284
|
+
|
|
285
|
+
# BAD: Sharing a keypair across multiple client devices
|
|
286
|
+
# Each device must have its own unique keypair — shared keys break the security model
|
|
287
|
+
|
|
288
|
+
# BAD: Using a broad "FORWARD ACCEPT" iptables rule
|
|
289
|
+
# Scope forwarding rules to the wg0 interface and direction only
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Best Practices
|
|
293
|
+
|
|
294
|
+
- Generate a unique keypair per client device — never reuse keys
|
|
295
|
+
- Use split tunneling (`AllowedIPs = <home subnets>`) for mobile
|
|
296
|
+
- Set `PersistentKeepalive = 25` on all mobile clients
|
|
297
|
+
- Use DDNS if your ISP assigns a dynamic IP; store credentials in env files, not inline
|
|
298
|
+
- Use scoped iptables forwarding rules (inbound on wg0 only) rather than a blanket FORWARD ACCEPT
|
|
299
|
+
- Add Pi-hole's IP as `DNS =` in client configs to get ad blocking over the VPN
|
|
300
|
+
- Rotate the server keypair periodically and update all client configs
|
|
301
|
+
|
|
302
|
+
## Related Skills
|
|
303
|
+
|
|
304
|
+
- homelab-network-setup
|
|
305
|
+
- homelab-vlan-segmentation
|
|
306
|
+
- homelab-pihole-dns
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Affaan Mustafa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|