@harness-engineering/cli 1.24.0 → 1.24.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/skills/claude-code/a11y-aria-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-color-contrast/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-form-patterns/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/a11y-image-text-alt/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-keyboard-navigation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-modal-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-motion-animation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-screen-reader-testing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-semantic-html/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/a11y-testing-automation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-http-interceptors/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-lazy-loading/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/angular-pipe-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-reactive-forms/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-routing-guards/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-rxjs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-schematics/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-service-di/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-signals-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-standalone-components/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/angular-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/api-api-keys/SKILL.md +135 -0
- package/dist/agents/skills/claude-code/api-api-keys/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/api-authentication-patterns/SKILL.md +117 -0
- package/dist/agents/skills/claude-code/api-authentication-patterns/skill.yaml +44 -0
- package/dist/agents/skills/claude-code/api-backward-compatibility/SKILL.md +170 -0
- package/dist/agents/skills/claude-code/api-backward-compatibility/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-bulk-operations/SKILL.md +198 -0
- package/dist/agents/skills/claude-code/api-bulk-operations/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-conditional-requests/SKILL.md +233 -0
- package/dist/agents/skills/claude-code/api-conditional-requests/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/api-content-negotiation/SKILL.md +194 -0
- package/dist/agents/skills/claude-code/api-content-negotiation/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-contract-testing/SKILL.md +222 -0
- package/dist/agents/skills/claude-code/api-contract-testing/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/api-deprecation-strategy/SKILL.md +156 -0
- package/dist/agents/skills/claude-code/api-deprecation-strategy/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-error-contracts/SKILL.md +149 -0
- package/dist/agents/skills/claude-code/api-error-contracts/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-field-selection/SKILL.md +193 -0
- package/dist/agents/skills/claude-code/api-field-selection/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-filtering-sorting/SKILL.md +170 -0
- package/dist/agents/skills/claude-code/api-filtering-sorting/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-hateoas/SKILL.md +212 -0
- package/dist/agents/skills/claude-code/api-hateoas/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-http-caching/SKILL.md +188 -0
- package/dist/agents/skills/claude-code/api-http-caching/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/api-http-methods/SKILL.md +185 -0
- package/dist/agents/skills/claude-code/api-http-methods/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/api-idempotency-keys/SKILL.md +176 -0
- package/dist/agents/skills/claude-code/api-idempotency-keys/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-long-running-operations/SKILL.md +209 -0
- package/dist/agents/skills/claude-code/api-long-running-operations/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-nested-vs-flat/SKILL.md +173 -0
- package/dist/agents/skills/claude-code/api-nested-vs-flat/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-oauth2-flows/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/api-oauth2-flows/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/api-openapi-design/SKILL.md +260 -0
- package/dist/agents/skills/claude-code/api-openapi-design/skill.yaml +44 -0
- package/dist/agents/skills/claude-code/api-pagination-cursor/SKILL.md +159 -0
- package/dist/agents/skills/claude-code/api-pagination-cursor/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-pagination-keyset/SKILL.md +167 -0
- package/dist/agents/skills/claude-code/api-pagination-keyset/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-pagination-offset/SKILL.md +135 -0
- package/dist/agents/skills/claude-code/api-pagination-offset/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-problem-details-rfc/SKILL.md +164 -0
- package/dist/agents/skills/claude-code/api-problem-details-rfc/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/api-rate-limit-headers/SKILL.md +144 -0
- package/dist/agents/skills/claude-code/api-rate-limit-headers/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-rate-limiting/SKILL.md +131 -0
- package/dist/agents/skills/claude-code/api-rate-limiting/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/api-resource-granularity/SKILL.md +165 -0
- package/dist/agents/skills/claude-code/api-resource-granularity/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-resource-modeling/SKILL.md +155 -0
- package/dist/agents/skills/claude-code/api-resource-modeling/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-rest-maturity-model/SKILL.md +215 -0
- package/dist/agents/skills/claude-code/api-rest-maturity-model/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-retry-guidance/SKILL.md +168 -0
- package/dist/agents/skills/claude-code/api-retry-guidance/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/api-sdk-ergonomics/SKILL.md +194 -0
- package/dist/agents/skills/claude-code/api-sdk-ergonomics/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/api-status-codes/SKILL.md +196 -0
- package/dist/agents/skills/claude-code/api-status-codes/skill.yaml +46 -0
- package/dist/agents/skills/claude-code/api-validation-errors/SKILL.md +174 -0
- package/dist/agents/skills/claude-code/api-validation-errors/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/api-versioning-header/SKILL.md +177 -0
- package/dist/agents/skills/claude-code/api-versioning-header/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/api-versioning-url/SKILL.md +128 -0
- package/dist/agents/skills/claude-code/api-versioning-url/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/api-webhook-design/SKILL.md +165 -0
- package/dist/agents/skills/claude-code/api-webhook-design/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/api-webhook-security/SKILL.md +176 -0
- package/dist/agents/skills/claude-code/api-webhook-security/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/astro-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-content-collections/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-integration-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-islands-architecture/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-multi-framework/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-server-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-ssr-hybrid/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/astro-view-transitions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-animation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-component-variants/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-css-modules/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-custom-components/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-dark-mode/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-design-tokens/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-headless-ui/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-layout-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/css-responsive-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-tailwind-merge/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/css-tailwind-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/db-acid-in-practice/SKILL.md +215 -0
- package/dist/agents/skills/claude-code/db-acid-in-practice/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-acid-properties/SKILL.md +190 -0
- package/dist/agents/skills/claude-code/db-acid-properties/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-adjacency-list/SKILL.md +199 -0
- package/dist/agents/skills/claude-code/db-adjacency-list/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/db-audit-trail/SKILL.md +244 -0
- package/dist/agents/skills/claude-code/db-audit-trail/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-btree-index/SKILL.md +182 -0
- package/dist/agents/skills/claude-code/db-btree-index/skill.yaml +44 -0
- package/dist/agents/skills/claude-code/db-cap-theorem/SKILL.md +156 -0
- package/dist/agents/skills/claude-code/db-cap-theorem/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-closure-table/SKILL.md +197 -0
- package/dist/agents/skills/claude-code/db-closure-table/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-composite-index/SKILL.md +199 -0
- package/dist/agents/skills/claude-code/db-composite-index/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-connection-pooling/SKILL.md +196 -0
- package/dist/agents/skills/claude-code/db-connection-pooling/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/db-connection-sizing/SKILL.md +236 -0
- package/dist/agents/skills/claude-code/db-connection-sizing/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-covering-index/SKILL.md +203 -0
- package/dist/agents/skills/claude-code/db-covering-index/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/db-deadlock-prevention/SKILL.md +204 -0
- package/dist/agents/skills/claude-code/db-deadlock-prevention/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-denormalization/SKILL.md +176 -0
- package/dist/agents/skills/claude-code/db-denormalization/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-document-in-relational/SKILL.md +225 -0
- package/dist/agents/skills/claude-code/db-document-in-relational/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/db-entity-attribute-value/SKILL.md +186 -0
- package/dist/agents/skills/claude-code/db-entity-attribute-value/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/db-eventual-consistency/SKILL.md +226 -0
- package/dist/agents/skills/claude-code/db-eventual-consistency/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-expand-contract/SKILL.md +199 -0
- package/dist/agents/skills/claude-code/db-expand-contract/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/db-explain-reading/SKILL.md +213 -0
- package/dist/agents/skills/claude-code/db-explain-reading/skill.yaml +44 -0
- package/dist/agents/skills/claude-code/db-expression-index/SKILL.md +211 -0
- package/dist/agents/skills/claude-code/db-expression-index/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/db-first-normal-form/SKILL.md +190 -0
- package/dist/agents/skills/claude-code/db-first-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-graph-in-relational/SKILL.md +212 -0
- package/dist/agents/skills/claude-code/db-graph-in-relational/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-hash-index/SKILL.md +176 -0
- package/dist/agents/skills/claude-code/db-hash-index/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/db-hierarchical-data/SKILL.md +194 -0
- package/dist/agents/skills/claude-code/db-hierarchical-data/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-horizontal-sharding/SKILL.md +228 -0
- package/dist/agents/skills/claude-code/db-horizontal-sharding/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/db-isolation-levels/SKILL.md +158 -0
- package/dist/agents/skills/claude-code/db-isolation-levels/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/db-isolation-selection/SKILL.md +160 -0
- package/dist/agents/skills/claude-code/db-isolation-selection/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-migration-rollback/SKILL.md +223 -0
- package/dist/agents/skills/claude-code/db-migration-rollback/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/db-mvcc/SKILL.md +191 -0
- package/dist/agents/skills/claude-code/db-mvcc/skill.yaml +45 -0
- package/dist/agents/skills/claude-code/db-nested-sets/SKILL.md +171 -0
- package/dist/agents/skills/claude-code/db-nested-sets/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-optimistic-locking/SKILL.md +151 -0
- package/dist/agents/skills/claude-code/db-optimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/claude-code/db-partial-index/SKILL.md +196 -0
- package/dist/agents/skills/claude-code/db-partial-index/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/db-pessimistic-locking/SKILL.md +158 -0
- package/dist/agents/skills/claude-code/db-pessimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/claude-code/db-polymorphic-associations/SKILL.md +187 -0
- package/dist/agents/skills/claude-code/db-polymorphic-associations/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/db-query-rewriting/SKILL.md +249 -0
- package/dist/agents/skills/claude-code/db-query-rewriting/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/db-query-statistics/SKILL.md +210 -0
- package/dist/agents/skills/claude-code/db-query-statistics/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-read-phenomena/SKILL.md +205 -0
- package/dist/agents/skills/claude-code/db-read-phenomena/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/db-scan-types/SKILL.md +248 -0
- package/dist/agents/skills/claude-code/db-scan-types/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-second-normal-form/SKILL.md +183 -0
- package/dist/agents/skills/claude-code/db-second-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-table-partitioning/SKILL.md +229 -0
- package/dist/agents/skills/claude-code/db-table-partitioning/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/db-temporal-data/SKILL.md +194 -0
- package/dist/agents/skills/claude-code/db-temporal-data/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-third-normal-form/SKILL.md +210 -0
- package/dist/agents/skills/claude-code/db-third-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/db-time-series/SKILL.md +196 -0
- package/dist/agents/skills/claude-code/db-time-series/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/db-vertical-partitioning/SKILL.md +249 -0
- package/dist/agents/skills/claude-code/db-vertical-partitioning/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/db-zero-downtime-migration/SKILL.md +199 -0
- package/dist/agents/skills/claude-code/db-zero-downtime-migration/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/design-affordances/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-alignment/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-apple-hig/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-atomic-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-brand-consistency/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-color-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-color-harmony/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-color-psychology/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-component-anatomy/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-consistency/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-content-density/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-contrast-ratio/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-dark-mode-color/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-data-viz-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-design-audit/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-design-critique/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-design-documentation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-design-governance/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-elevation-shadow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-empty-error-states/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/design-feedback-patterns/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/design-fluent-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-font-pairing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-form-ux/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/design-gestalt-closure-continuity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-gestalt-common-fate/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-gestalt-figure-ground/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-gestalt-proximity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-gestalt-similarity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-grid-systems/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-i18n-design/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/design-iconography/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-illustration-style/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-imagery-photography/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-information-architecture/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/design-loading-patterns/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/design-material-design-3/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-micro-interactions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-motion-principles/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-naming-conventions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-navigation-ux/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/design-palette-construction/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-parallax-scroll/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-readability/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/design-responsive-strategy/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-responsive-type/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-state-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-token-architecture/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-transitions-timing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-type-scale/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-typographic-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-typography-fundamentals/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-visual-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-web-fonts/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/design-whitespace/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/drizzle-filtering-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/drizzle-migrations/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/drizzle-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/claude-code/drizzle-query-builder/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/drizzle-raw-sql/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/drizzle-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/drizzle-schema-definition/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/drizzle-transactions/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/drizzle-with-nextjs/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-event-schema/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-event-storming/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-idempotency/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/events-idempotency/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/events-kafka-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-message-queue/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-pubsub-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-redis-pubsub/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-saga-choreography/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-sse-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/events-webhooks-pattern/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/events-webhooks-pattern/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/events-websocket-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-abstract-factory/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-builder-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-chain-of-responsibility/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-factory-method/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-mediator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-memento-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-null-object/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-singleton/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-template-method/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/gof-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/graphql-apollo-server/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/graphql-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/graphql-auth-patterns/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/graphql-client-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/graphql-codegen-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/graphql-dataloader-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/graphql-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/graphql-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/graphql-federation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/graphql-pagination-patterns/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/graphql-pagination-patterns/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/graphql-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/graphql-resolver-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/graphql-schema-design/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/graphql-schema-design/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/graphql-subscriptions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-api-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-auth/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +171 -822
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +145 -195
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/harness-caching/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +267 -436
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +7 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-database/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dx/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +180 -271
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +13 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-observability/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +142 -322
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +7 -0
- package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-resilience/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-roadmap-pilot/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-router/SKILL.md +69 -123
- package/dist/agents/skills/claude-code/harness-router/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +3 -3
- package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +7 -0
- package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +483 -667
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-supply-chain-audit/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +13 -0
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +135 -221
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-abstract-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-chain-of-responsibility-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-constructor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-mediator-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-mixin-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-revealing-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-singleton-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-static-import/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-template-method-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/js-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-api-gateway/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-config-server/SKILL.md +1 -1
- package/dist/agents/skills/claude-code/microservices-config-server/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-cqrs-pattern/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/microservices-decomposition/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-distributed-tracing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-event-sourcing/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/microservices-health-check/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-saga-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-service-discovery/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-sidecar-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/microservices-strangler-fig/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-animation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-deployment-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-expo-setup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-flatlist-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-gesture-handling/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-native-modules/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-navigation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-network-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/mobile-push-notifications/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-storage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/mobile-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-config-module/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-controller-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-dependency-injection/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-dto-validation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-exception-filters/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-graphql-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-guards-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-interceptors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-microservices/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-pipes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-service-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-swagger-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nestjs-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-app-router/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-auth-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-caching-strategies/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-data-fetching/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-deployment-optimization/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-error-boundaries/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-metadata-api/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-monorepo-setup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-parallel-intercepting-routes/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-route-handlers/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-server-actions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-server-components/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-static-generation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-streaming-suspense/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/next-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-buffer-encoding/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-child-process/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-crypto-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-esm-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-event-emitter/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-express-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-fastify-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-http-server/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-path-fs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-performance-profiling/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/node-streams-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/node-worker-threads/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-auto-imports/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-layouts-pages/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-modules-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-plugins-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-seo-metadata/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-server-routes/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/nuxt-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-context-propagation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-custom-instrumentation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-error-tracking/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-exporter-config/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-logging-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-metrics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-nestjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-performance-insights/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/otel-sampling-strategies/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-sdk-setup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/otel-tracing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/owasp-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/owasp-auth-patterns/skill.yaml +8 -0
- package/dist/agents/skills/claude-code/owasp-cryptography/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/owasp-csrf-protection/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/owasp-dependency-security/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/owasp-file-upload-security/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/owasp-idor-prevention/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/owasp-injection-prevention/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/owasp-logging-monitoring/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/owasp-rate-limiting/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/owasp-rate-limiting/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/owasp-secrets-management/SKILL.md +2 -1
- package/dist/agents/skills/claude-code/owasp-secrets-management/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/owasp-security-headers/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/owasp-xss-prevention/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/perf-browser-cache/SKILL.md +151 -0
- package/dist/agents/skills/claude-code/perf-browser-cache/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-bundle-analysis/SKILL.md +217 -0
- package/dist/agents/skills/claude-code/perf-bundle-analysis/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/perf-cache-invalidation/SKILL.md +228 -0
- package/dist/agents/skills/claude-code/perf-cache-invalidation/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-cdn-cache-control/SKILL.md +198 -0
- package/dist/agents/skills/claude-code/perf-cdn-cache-control/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-cdn-strategies/SKILL.md +161 -0
- package/dist/agents/skills/claude-code/perf-cdn-strategies/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-client-side-rendering/SKILL.md +245 -0
- package/dist/agents/skills/claude-code/perf-client-side-rendering/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-code-splitting/SKILL.md +185 -0
- package/dist/agents/skills/claude-code/perf-code-splitting/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-compression/SKILL.md +163 -0
- package/dist/agents/skills/claude-code/perf-compression/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-connection-costs/SKILL.md +165 -0
- package/dist/agents/skills/claude-code/perf-connection-costs/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-connection-pooling/SKILL.md +250 -0
- package/dist/agents/skills/claude-code/perf-connection-pooling/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-critical-rendering-path/SKILL.md +167 -0
- package/dist/agents/skills/claude-code/perf-critical-rendering-path/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-cumulative-layout-shift/SKILL.md +180 -0
- package/dist/agents/skills/claude-code/perf-cumulative-layout-shift/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-dom-parsing/SKILL.md +153 -0
- package/dist/agents/skills/claude-code/perf-dom-parsing/skill.yaml +36 -0
- package/dist/agents/skills/claude-code/perf-edge-rendering/SKILL.md +222 -0
- package/dist/agents/skills/claude-code/perf-edge-rendering/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-event-loop/SKILL.md +203 -0
- package/dist/agents/skills/claude-code/perf-event-loop/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-font-loading/SKILL.md +222 -0
- package/dist/agents/skills/claude-code/perf-font-loading/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-garbage-collection/SKILL.md +192 -0
- package/dist/agents/skills/claude-code/perf-garbage-collection/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-heap-profiling/SKILL.md +160 -0
- package/dist/agents/skills/claude-code/perf-heap-profiling/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-http2-multiplexing/SKILL.md +163 -0
- package/dist/agents/skills/claude-code/perf-http2-multiplexing/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-http3-quic/SKILL.md +165 -0
- package/dist/agents/skills/claude-code/perf-http3-quic/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/perf-image-formats/SKILL.md +183 -0
- package/dist/agents/skills/claude-code/perf-image-formats/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-index-strategies/SKILL.md +210 -0
- package/dist/agents/skills/claude-code/perf-index-strategies/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-interaction-to-next-paint/SKILL.md +170 -0
- package/dist/agents/skills/claude-code/perf-interaction-to-next-paint/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-largest-contentful-paint/SKILL.md +162 -0
- package/dist/agents/skills/claude-code/perf-largest-contentful-paint/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/perf-layout-reflow/SKILL.md +187 -0
- package/dist/agents/skills/claude-code/perf-layout-reflow/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-lazy-loading/SKILL.md +217 -0
- package/dist/agents/skills/claude-code/perf-lazy-loading/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-lazy-loading-media/SKILL.md +233 -0
- package/dist/agents/skills/claude-code/perf-lazy-loading-media/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-long-tasks/SKILL.md +194 -0
- package/dist/agents/skills/claude-code/perf-long-tasks/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-memory-leaks/SKILL.md +218 -0
- package/dist/agents/skills/claude-code/perf-memory-leaks/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-module-federation/SKILL.md +242 -0
- package/dist/agents/skills/claude-code/perf-module-federation/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-n-plus-one/SKILL.md +237 -0
- package/dist/agents/skills/claude-code/perf-n-plus-one/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-paint-compositing/SKILL.md +181 -0
- package/dist/agents/skills/claude-code/perf-paint-compositing/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-performance-api/SKILL.md +249 -0
- package/dist/agents/skills/claude-code/perf-performance-api/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/perf-profiling-methodology/SKILL.md +181 -0
- package/dist/agents/skills/claude-code/perf-profiling-methodology/skill.yaml +44 -0
- package/dist/agents/skills/claude-code/perf-query-optimization/SKILL.md +203 -0
- package/dist/agents/skills/claude-code/perf-query-optimization/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-resource-hints/SKILL.md +167 -0
- package/dist/agents/skills/claude-code/perf-resource-hints/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-responsive-images/SKILL.md +225 -0
- package/dist/agents/skills/claude-code/perf-responsive-images/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-server-side-caching/SKILL.md +194 -0
- package/dist/agents/skills/claude-code/perf-server-side-caching/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-server-side-rendering/SKILL.md +239 -0
- package/dist/agents/skills/claude-code/perf-server-side-rendering/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-service-worker-caching/SKILL.md +247 -0
- package/dist/agents/skills/claude-code/perf-service-worker-caching/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/perf-static-generation/SKILL.md +241 -0
- package/dist/agents/skills/claude-code/perf-static-generation/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/perf-streaming-rendering/SKILL.md +242 -0
- package/dist/agents/skills/claude-code/perf-streaming-rendering/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/perf-style-calculation/SKILL.md +166 -0
- package/dist/agents/skills/claude-code/perf-style-calculation/skill.yaml +36 -0
- package/dist/agents/skills/claude-code/perf-svg-optimization/SKILL.md +249 -0
- package/dist/agents/skills/claude-code/perf-svg-optimization/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/perf-tree-shaking/SKILL.md +225 -0
- package/dist/agents/skills/claude-code/perf-tree-shaking/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/perf-web-workers/SKILL.md +237 -0
- package/dist/agents/skills/claude-code/perf-web-workers/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/prisma-client-queries/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/prisma-filtering-sorting/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/prisma-migrations/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/prisma-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/claude-code/prisma-raw-queries/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/prisma-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/prisma-schema-design/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/prisma-seeding-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/prisma-soft-delete/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/prisma-transactions/skill.yaml +4 -0
- package/dist/agents/skills/claude-code/prisma-type-generation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-2026/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-client-rendering/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-compound-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-concurrent-ui/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-container-presentational/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-hoc-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-hooks-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-islands-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-memoization-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-progressive-hydration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-render-props-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-server-components/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-server-rendering/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-state-management-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-static-import/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/react-suspense-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-entity-adapter/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-listener-middleware/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-persistence-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-rtk-optimistic/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-rtk-query-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-rtk-query-setup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-selectors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-slice-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-store-setup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-thunk-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/redux-typescript-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-chaos-testing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-dead-letter/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-fallback-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-health-checks/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-idempotency/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-rate-limiting/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-retry-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/resilience-timeout-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/security-abac-design/SKILL.md +154 -0
- package/dist/agents/skills/claude-code/security-abac-design/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/security-asymmetric-encryption/SKILL.md +201 -0
- package/dist/agents/skills/claude-code/security-asymmetric-encryption/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/security-attack-trees/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/security-attack-trees/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/security-audit-log-design/SKILL.md +227 -0
- package/dist/agents/skills/claude-code/security-audit-log-design/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-authentication-flows/SKILL.md +168 -0
- package/dist/agents/skills/claude-code/security-authentication-flows/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/security-capability-based-security/SKILL.md +158 -0
- package/dist/agents/skills/claude-code/security-capability-based-security/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-certificate-management/SKILL.md +153 -0
- package/dist/agents/skills/claude-code/security-certificate-management/skill.yaml +42 -0
- package/dist/agents/skills/claude-code/security-ci-security-testing/SKILL.md +159 -0
- package/dist/agents/skills/claude-code/security-ci-security-testing/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/security-code-signing/SKILL.md +155 -0
- package/dist/agents/skills/claude-code/security-code-signing/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-compliance-logging/SKILL.md +183 -0
- package/dist/agents/skills/claude-code/security-compliance-logging/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/security-credential-storage/SKILL.md +222 -0
- package/dist/agents/skills/claude-code/security-credential-storage/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/security-cryptographic-randomness/SKILL.md +154 -0
- package/dist/agents/skills/claude-code/security-cryptographic-randomness/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/security-dependency-auditing/SKILL.md +156 -0
- package/dist/agents/skills/claude-code/security-dependency-auditing/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-deserialization-attacks/SKILL.md +180 -0
- package/dist/agents/skills/claude-code/security-deserialization-attacks/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/security-environment-variable-risks/SKILL.md +153 -0
- package/dist/agents/skills/claude-code/security-environment-variable-risks/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/security-forensics-fundamentals/SKILL.md +198 -0
- package/dist/agents/skills/claude-code/security-forensics-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-hashing-fundamentals/SKILL.md +212 -0
- package/dist/agents/skills/claude-code/security-hashing-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-hmac-signatures/SKILL.md +165 -0
- package/dist/agents/skills/claude-code/security-hmac-signatures/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-hsts-preloading/SKILL.md +154 -0
- package/dist/agents/skills/claude-code/security-hsts-preloading/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/security-identity-verification/SKILL.md +157 -0
- package/dist/agents/skills/claude-code/security-identity-verification/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-incident-containment/SKILL.md +190 -0
- package/dist/agents/skills/claude-code/security-incident-containment/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-injection-families/SKILL.md +235 -0
- package/dist/agents/skills/claude-code/security-injection-families/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/security-log-correlation/SKILL.md +178 -0
- package/dist/agents/skills/claude-code/security-log-correlation/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-memory-safety/SKILL.md +234 -0
- package/dist/agents/skills/claude-code/security-memory-safety/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-mfa-design/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/security-mfa-design/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/security-microsegmentation/SKILL.md +154 -0
- package/dist/agents/skills/claude-code/security-microsegmentation/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-mtls-design/SKILL.md +158 -0
- package/dist/agents/skills/claude-code/security-mtls-design/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-penetration-testing/SKILL.md +166 -0
- package/dist/agents/skills/claude-code/security-penetration-testing/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-post-incident-review/SKILL.md +205 -0
- package/dist/agents/skills/claude-code/security-post-incident-review/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-race-conditions/SKILL.md +186 -0
- package/dist/agents/skills/claude-code/security-race-conditions/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-rbac-design/SKILL.md +209 -0
- package/dist/agents/skills/claude-code/security-rbac-design/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-rebac-design/SKILL.md +154 -0
- package/dist/agents/skills/claude-code/security-rebac-design/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-sbom-provenance/SKILL.md +157 -0
- package/dist/agents/skills/claude-code/security-sbom-provenance/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-secrets-lifecycle/SKILL.md +190 -0
- package/dist/agents/skills/claude-code/security-secrets-lifecycle/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-security-champions/SKILL.md +165 -0
- package/dist/agents/skills/claude-code/security-security-champions/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/security-session-management/SKILL.md +196 -0
- package/dist/agents/skills/claude-code/security-session-management/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/security-shift-left-design/SKILL.md +153 -0
- package/dist/agents/skills/claude-code/security-shift-left-design/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/security-symmetric-encryption/SKILL.md +176 -0
- package/dist/agents/skills/claude-code/security-symmetric-encryption/skill.yaml +41 -0
- package/dist/agents/skills/claude-code/security-threat-modeling-process/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/security-threat-modeling-process/skill.yaml +38 -0
- package/dist/agents/skills/claude-code/security-threat-modeling-stride/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/security-threat-modeling-stride/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-tls-fundamentals/SKILL.md +186 -0
- package/dist/agents/skills/claude-code/security-tls-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/security-trust-boundaries/SKILL.md +152 -0
- package/dist/agents/skills/claude-code/security-trust-boundaries/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-vault-patterns/SKILL.md +155 -0
- package/dist/agents/skills/claude-code/security-vault-patterns/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-vulnerability-disclosure/SKILL.md +207 -0
- package/dist/agents/skills/claude-code/security-vulnerability-disclosure/skill.yaml +39 -0
- package/dist/agents/skills/claude-code/security-zero-trust-principles/SKILL.md +229 -0
- package/dist/agents/skills/claude-code/security-zero-trust-principles/skill.yaml +40 -0
- package/dist/agents/skills/claude-code/state-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-jotai-atoms/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-selection-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-server-client-sync/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-zustand-devtools/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-zustand-immer/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-zustand-persist/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-zustand-react/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-zustand-slices/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/state-zustand-store/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-adapter-config/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-component-composition/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-error-pages/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-form-actions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-load-functions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/svelte-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-runes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-server-hooks/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-stores-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/svelte-transitions-animations/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-cache-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-dependent-queries/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-devtools/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-infinite-queries/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-mutation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-optimistic-updates/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-prefetching/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-query-invalidation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-query-keys/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/tanstack-suspense-mode/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-accessibility-testing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-component-react/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-component-svelte/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-contract-testing/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-coverage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-e2e-strategy/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-factory-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-integration-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-mock-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-msw-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-performance-testing/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/test-playwright-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-playwright-setup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-property-based/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-snapshot-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-tdd-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-unit-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/test-vitest-config/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/trpc-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/trpc-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/trpc-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/trpc-input-validation/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/trpc-input-validation/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/trpc-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/trpc-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/trpc-react-query-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/trpc-router-composition/SKILL.md +1 -0
- package/dist/agents/skills/claude-code/trpc-router-composition/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/trpc-subscription-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-async-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-branded-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-class-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-conditional-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-config-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-declaration-merging/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-decorator-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-discriminated-unions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-error-handling-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-generics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-mapped-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-module-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-performance-patterns/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/ts-satisfies-operator/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-strict-mode/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-template-literal-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-testing-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-type-guards/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-utility-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ts-zod-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/ux-active-voice/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/ux-active-voice/skill.yaml +32 -0
- package/dist/agents/skills/claude-code/ux-button-cta-copy/SKILL.md +159 -0
- package/dist/agents/skills/claude-code/ux-button-cta-copy/skill.yaml +34 -0
- package/dist/agents/skills/claude-code/ux-confirmation-dialogs/SKILL.md +156 -0
- package/dist/agents/skills/claude-code/ux-confirmation-dialogs/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-content-hierarchy/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/ux-content-hierarchy/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-data-table-copy/SKILL.md +154 -0
- package/dist/agents/skills/claude-code/ux-data-table-copy/skill.yaml +34 -0
- package/dist/agents/skills/claude-code/ux-destructive-action-copy/SKILL.md +152 -0
- package/dist/agents/skills/claude-code/ux-destructive-action-copy/skill.yaml +34 -0
- package/dist/agents/skills/claude-code/ux-empty-states/SKILL.md +155 -0
- package/dist/agents/skills/claude-code/ux-empty-states/skill.yaml +36 -0
- package/dist/agents/skills/claude-code/ux-error-messages/SKILL.md +159 -0
- package/dist/agents/skills/claude-code/ux-error-messages/skill.yaml +35 -0
- package/dist/agents/skills/claude-code/ux-error-severity/SKILL.md +155 -0
- package/dist/agents/skills/claude-code/ux-error-severity/skill.yaml +35 -0
- package/dist/agents/skills/claude-code/ux-form-labels/SKILL.md +159 -0
- package/dist/agents/skills/claude-code/ux-form-labels/skill.yaml +36 -0
- package/dist/agents/skills/claude-code/ux-inclusive-language/SKILL.md +161 -0
- package/dist/agents/skills/claude-code/ux-inclusive-language/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-internationalization-writing/SKILL.md +196 -0
- package/dist/agents/skills/claude-code/ux-internationalization-writing/skill.yaml +35 -0
- package/dist/agents/skills/claude-code/ux-loading-states/SKILL.md +162 -0
- package/dist/agents/skills/claude-code/ux-loading-states/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-microcopy-principles/SKILL.md +152 -0
- package/dist/agents/skills/claude-code/ux-microcopy-principles/skill.yaml +37 -0
- package/dist/agents/skills/claude-code/ux-navigation-labels/SKILL.md +163 -0
- package/dist/agents/skills/claude-code/ux-navigation-labels/skill.yaml +35 -0
- package/dist/agents/skills/claude-code/ux-notification-copy/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/ux-notification-copy/skill.yaml +35 -0
- package/dist/agents/skills/claude-code/ux-onboarding-copy/SKILL.md +156 -0
- package/dist/agents/skills/claude-code/ux-onboarding-copy/skill.yaml +35 -0
- package/dist/agents/skills/claude-code/ux-permission-access-copy/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/ux-permission-access-copy/skill.yaml +34 -0
- package/dist/agents/skills/claude-code/ux-plain-language/SKILL.md +157 -0
- package/dist/agents/skills/claude-code/ux-plain-language/skill.yaml +34 -0
- package/dist/agents/skills/claude-code/ux-search-copy/SKILL.md +154 -0
- package/dist/agents/skills/claude-code/ux-search-copy/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-settings-preferences/SKILL.md +152 -0
- package/dist/agents/skills/claude-code/ux-settings-preferences/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-success-feedback/SKILL.md +163 -0
- package/dist/agents/skills/claude-code/ux-success-feedback/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-tooltip-contextual-help/SKILL.md +163 -0
- package/dist/agents/skills/claude-code/ux-tooltip-contextual-help/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-voice-tone/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/ux-voice-tone/skill.yaml +33 -0
- package/dist/agents/skills/claude-code/ux-writing-for-scanning/SKILL.md +150 -0
- package/dist/agents/skills/claude-code/ux-writing-for-scanning/skill.yaml +35 -0
- package/dist/agents/skills/claude-code/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-async-components/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-component-events/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-pinia-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-provide-inject/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-reactive-refs/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-renderless-components/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-slots-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-teleport-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/vue-watchers-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-actor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-guards-actions/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-history-states/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-invoke-pattern/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-machine-definition/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-parallel-states/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-react-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-typegen/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/xstate-visualization/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-array-validation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-async-validation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-infer-types/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-object-patterns/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-schema-definition/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-string-validation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-transform-refine/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/zod-union-discriminated/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-aria-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-color-contrast/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-form-patterns/skill.yaml +2 -0
- package/dist/agents/skills/codex/a11y-image-text-alt/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-keyboard-navigation/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-modal-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-motion-animation/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-screen-reader-testing/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-semantic-html/skill.yaml +1 -0
- package/dist/agents/skills/codex/a11y-testing-automation/skill.yaml +1 -0
- package/dist/agents/skills/codex/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/codex/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-http-interceptors/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-lazy-loading/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/codex/angular-pipe-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-reactive-forms/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-routing-guards/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-rxjs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-schematics/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-service-di/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-signals-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-standalone-components/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-state-management/skill.yaml +1 -0
- package/dist/agents/skills/codex/angular-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/api-api-keys/SKILL.md +135 -0
- package/dist/agents/skills/codex/api-api-keys/skill.yaml +41 -0
- package/dist/agents/skills/codex/api-authentication-patterns/SKILL.md +117 -0
- package/dist/agents/skills/codex/api-authentication-patterns/skill.yaml +44 -0
- package/dist/agents/skills/codex/api-backward-compatibility/SKILL.md +170 -0
- package/dist/agents/skills/codex/api-backward-compatibility/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-bulk-operations/SKILL.md +198 -0
- package/dist/agents/skills/codex/api-bulk-operations/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-conditional-requests/SKILL.md +233 -0
- package/dist/agents/skills/codex/api-conditional-requests/skill.yaml +41 -0
- package/dist/agents/skills/codex/api-content-negotiation/SKILL.md +194 -0
- package/dist/agents/skills/codex/api-content-negotiation/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-contract-testing/SKILL.md +222 -0
- package/dist/agents/skills/codex/api-contract-testing/skill.yaml +42 -0
- package/dist/agents/skills/codex/api-deprecation-strategy/SKILL.md +156 -0
- package/dist/agents/skills/codex/api-deprecation-strategy/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-error-contracts/SKILL.md +149 -0
- package/dist/agents/skills/codex/api-error-contracts/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-field-selection/SKILL.md +193 -0
- package/dist/agents/skills/codex/api-field-selection/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-filtering-sorting/SKILL.md +170 -0
- package/dist/agents/skills/codex/api-filtering-sorting/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-hateoas/SKILL.md +212 -0
- package/dist/agents/skills/codex/api-hateoas/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-http-caching/SKILL.md +188 -0
- package/dist/agents/skills/codex/api-http-caching/skill.yaml +43 -0
- package/dist/agents/skills/codex/api-http-methods/SKILL.md +185 -0
- package/dist/agents/skills/codex/api-http-methods/skill.yaml +43 -0
- package/dist/agents/skills/codex/api-idempotency-keys/SKILL.md +176 -0
- package/dist/agents/skills/codex/api-idempotency-keys/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-long-running-operations/SKILL.md +209 -0
- package/dist/agents/skills/codex/api-long-running-operations/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-nested-vs-flat/SKILL.md +173 -0
- package/dist/agents/skills/codex/api-nested-vs-flat/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-oauth2-flows/SKILL.md +150 -0
- package/dist/agents/skills/codex/api-oauth2-flows/skill.yaml +42 -0
- package/dist/agents/skills/codex/api-openapi-design/SKILL.md +260 -0
- package/dist/agents/skills/codex/api-openapi-design/skill.yaml +44 -0
- package/dist/agents/skills/codex/api-pagination-cursor/SKILL.md +159 -0
- package/dist/agents/skills/codex/api-pagination-cursor/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-pagination-keyset/SKILL.md +167 -0
- package/dist/agents/skills/codex/api-pagination-keyset/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-pagination-offset/SKILL.md +135 -0
- package/dist/agents/skills/codex/api-pagination-offset/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-problem-details-rfc/SKILL.md +164 -0
- package/dist/agents/skills/codex/api-problem-details-rfc/skill.yaml +38 -0
- package/dist/agents/skills/codex/api-rate-limit-headers/SKILL.md +144 -0
- package/dist/agents/skills/codex/api-rate-limit-headers/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-rate-limiting/SKILL.md +131 -0
- package/dist/agents/skills/codex/api-rate-limiting/skill.yaml +41 -0
- package/dist/agents/skills/codex/api-resource-granularity/SKILL.md +165 -0
- package/dist/agents/skills/codex/api-resource-granularity/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-resource-modeling/SKILL.md +155 -0
- package/dist/agents/skills/codex/api-resource-modeling/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-rest-maturity-model/SKILL.md +215 -0
- package/dist/agents/skills/codex/api-rest-maturity-model/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-retry-guidance/SKILL.md +168 -0
- package/dist/agents/skills/codex/api-retry-guidance/skill.yaml +41 -0
- package/dist/agents/skills/codex/api-sdk-ergonomics/SKILL.md +194 -0
- package/dist/agents/skills/codex/api-sdk-ergonomics/skill.yaml +43 -0
- package/dist/agents/skills/codex/api-status-codes/SKILL.md +196 -0
- package/dist/agents/skills/codex/api-status-codes/skill.yaml +46 -0
- package/dist/agents/skills/codex/api-validation-errors/SKILL.md +174 -0
- package/dist/agents/skills/codex/api-validation-errors/skill.yaml +40 -0
- package/dist/agents/skills/codex/api-versioning-header/SKILL.md +177 -0
- package/dist/agents/skills/codex/api-versioning-header/skill.yaml +37 -0
- package/dist/agents/skills/codex/api-versioning-url/SKILL.md +128 -0
- package/dist/agents/skills/codex/api-versioning-url/skill.yaml +39 -0
- package/dist/agents/skills/codex/api-webhook-design/SKILL.md +165 -0
- package/dist/agents/skills/codex/api-webhook-design/skill.yaml +41 -0
- package/dist/agents/skills/codex/api-webhook-security/SKILL.md +176 -0
- package/dist/agents/skills/codex/api-webhook-security/skill.yaml +41 -0
- package/dist/agents/skills/codex/astro-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-content-collections/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-integration-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-islands-architecture/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-multi-framework/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-server-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-ssr-hybrid/skill.yaml +1 -0
- package/dist/agents/skills/codex/astro-view-transitions/skill.yaml +1 -0
- package/dist/agents/skills/codex/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/codex/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-animation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-component-variants/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-css-modules/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-custom-components/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-dark-mode/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-design-tokens/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-headless-ui/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-layout-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/codex/css-responsive-design/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-tailwind-merge/skill.yaml +1 -0
- package/dist/agents/skills/codex/css-tailwind-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/db-acid-in-practice/SKILL.md +215 -0
- package/dist/agents/skills/codex/db-acid-in-practice/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-acid-properties/SKILL.md +190 -0
- package/dist/agents/skills/codex/db-acid-properties/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-adjacency-list/SKILL.md +199 -0
- package/dist/agents/skills/codex/db-adjacency-list/skill.yaml +40 -0
- package/dist/agents/skills/codex/db-audit-trail/SKILL.md +244 -0
- package/dist/agents/skills/codex/db-audit-trail/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-btree-index/SKILL.md +182 -0
- package/dist/agents/skills/codex/db-btree-index/skill.yaml +44 -0
- package/dist/agents/skills/codex/db-cap-theorem/SKILL.md +156 -0
- package/dist/agents/skills/codex/db-cap-theorem/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-closure-table/SKILL.md +197 -0
- package/dist/agents/skills/codex/db-closure-table/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-composite-index/SKILL.md +199 -0
- package/dist/agents/skills/codex/db-composite-index/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-connection-pooling/SKILL.md +196 -0
- package/dist/agents/skills/codex/db-connection-pooling/skill.yaml +39 -0
- package/dist/agents/skills/codex/db-connection-sizing/SKILL.md +236 -0
- package/dist/agents/skills/codex/db-connection-sizing/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-covering-index/SKILL.md +203 -0
- package/dist/agents/skills/codex/db-covering-index/skill.yaml +40 -0
- package/dist/agents/skills/codex/db-deadlock-prevention/SKILL.md +204 -0
- package/dist/agents/skills/codex/db-deadlock-prevention/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-denormalization/SKILL.md +176 -0
- package/dist/agents/skills/codex/db-denormalization/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-document-in-relational/SKILL.md +225 -0
- package/dist/agents/skills/codex/db-document-in-relational/skill.yaml +42 -0
- package/dist/agents/skills/codex/db-entity-attribute-value/SKILL.md +186 -0
- package/dist/agents/skills/codex/db-entity-attribute-value/skill.yaml +39 -0
- package/dist/agents/skills/codex/db-eventual-consistency/SKILL.md +226 -0
- package/dist/agents/skills/codex/db-eventual-consistency/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-expand-contract/SKILL.md +199 -0
- package/dist/agents/skills/codex/db-expand-contract/skill.yaml +40 -0
- package/dist/agents/skills/codex/db-explain-reading/SKILL.md +213 -0
- package/dist/agents/skills/codex/db-explain-reading/skill.yaml +44 -0
- package/dist/agents/skills/codex/db-expression-index/SKILL.md +211 -0
- package/dist/agents/skills/codex/db-expression-index/skill.yaml +40 -0
- package/dist/agents/skills/codex/db-first-normal-form/SKILL.md +190 -0
- package/dist/agents/skills/codex/db-first-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-graph-in-relational/SKILL.md +212 -0
- package/dist/agents/skills/codex/db-graph-in-relational/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-hash-index/SKILL.md +176 -0
- package/dist/agents/skills/codex/db-hash-index/skill.yaml +37 -0
- package/dist/agents/skills/codex/db-hierarchical-data/SKILL.md +194 -0
- package/dist/agents/skills/codex/db-hierarchical-data/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-horizontal-sharding/SKILL.md +228 -0
- package/dist/agents/skills/codex/db-horizontal-sharding/skill.yaml +40 -0
- package/dist/agents/skills/codex/db-isolation-levels/SKILL.md +158 -0
- package/dist/agents/skills/codex/db-isolation-levels/skill.yaml +43 -0
- package/dist/agents/skills/codex/db-isolation-selection/SKILL.md +160 -0
- package/dist/agents/skills/codex/db-isolation-selection/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-migration-rollback/SKILL.md +223 -0
- package/dist/agents/skills/codex/db-migration-rollback/skill.yaml +40 -0
- package/dist/agents/skills/codex/db-mvcc/SKILL.md +191 -0
- package/dist/agents/skills/codex/db-mvcc/skill.yaml +45 -0
- package/dist/agents/skills/codex/db-nested-sets/SKILL.md +171 -0
- package/dist/agents/skills/codex/db-nested-sets/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-optimistic-locking/SKILL.md +151 -0
- package/dist/agents/skills/codex/db-optimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/codex/db-partial-index/SKILL.md +196 -0
- package/dist/agents/skills/codex/db-partial-index/skill.yaml +39 -0
- package/dist/agents/skills/codex/db-pessimistic-locking/SKILL.md +158 -0
- package/dist/agents/skills/codex/db-pessimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/codex/db-polymorphic-associations/SKILL.md +187 -0
- package/dist/agents/skills/codex/db-polymorphic-associations/skill.yaml +42 -0
- package/dist/agents/skills/codex/db-query-rewriting/SKILL.md +249 -0
- package/dist/agents/skills/codex/db-query-rewriting/skill.yaml +43 -0
- package/dist/agents/skills/codex/db-query-statistics/SKILL.md +210 -0
- package/dist/agents/skills/codex/db-query-statistics/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-read-phenomena/SKILL.md +205 -0
- package/dist/agents/skills/codex/db-read-phenomena/skill.yaml +42 -0
- package/dist/agents/skills/codex/db-scan-types/SKILL.md +248 -0
- package/dist/agents/skills/codex/db-scan-types/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-second-normal-form/SKILL.md +183 -0
- package/dist/agents/skills/codex/db-second-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-table-partitioning/SKILL.md +229 -0
- package/dist/agents/skills/codex/db-table-partitioning/skill.yaml +39 -0
- package/dist/agents/skills/codex/db-temporal-data/SKILL.md +194 -0
- package/dist/agents/skills/codex/db-temporal-data/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-third-normal-form/SKILL.md +210 -0
- package/dist/agents/skills/codex/db-third-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/codex/db-time-series/SKILL.md +196 -0
- package/dist/agents/skills/codex/db-time-series/skill.yaml +41 -0
- package/dist/agents/skills/codex/db-vertical-partitioning/SKILL.md +249 -0
- package/dist/agents/skills/codex/db-vertical-partitioning/skill.yaml +40 -0
- package/dist/agents/skills/codex/db-zero-downtime-migration/SKILL.md +199 -0
- package/dist/agents/skills/codex/db-zero-downtime-migration/skill.yaml +42 -0
- package/dist/agents/skills/codex/design-affordances/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-alignment/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-apple-hig/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-atomic-design/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-brand-consistency/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-color-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-color-harmony/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-color-psychology/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-component-anatomy/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-consistency/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-content-density/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-contrast-ratio/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-dark-mode-color/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-data-viz-design/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-design-audit/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-design-critique/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-design-documentation/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-design-governance/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-elevation-shadow/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-empty-error-states/skill.yaml +3 -0
- package/dist/agents/skills/codex/design-feedback-patterns/skill.yaml +5 -0
- package/dist/agents/skills/codex/design-fluent-design/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-font-pairing/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-form-ux/skill.yaml +2 -0
- package/dist/agents/skills/codex/design-gestalt-closure-continuity/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-gestalt-common-fate/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-gestalt-figure-ground/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-gestalt-proximity/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-gestalt-similarity/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-grid-systems/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-i18n-design/skill.yaml +2 -0
- package/dist/agents/skills/codex/design-iconography/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-illustration-style/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-imagery-photography/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-information-architecture/skill.yaml +3 -0
- package/dist/agents/skills/codex/design-loading-patterns/skill.yaml +2 -0
- package/dist/agents/skills/codex/design-material-design-3/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-micro-interactions/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-motion-principles/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-naming-conventions/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-navigation-ux/skill.yaml +2 -0
- package/dist/agents/skills/codex/design-palette-construction/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-parallax-scroll/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-readability/skill.yaml +3 -0
- package/dist/agents/skills/codex/design-responsive-strategy/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-responsive-type/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-state-design/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-token-architecture/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-transitions-timing/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-type-scale/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-typographic-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-typography-fundamentals/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-visual-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-web-fonts/skill.yaml +1 -0
- package/dist/agents/skills/codex/design-whitespace/skill.yaml +1 -0
- package/dist/agents/skills/codex/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/codex/drizzle-filtering-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/drizzle-migrations/skill.yaml +3 -0
- package/dist/agents/skills/codex/drizzle-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/codex/drizzle-query-builder/skill.yaml +1 -0
- package/dist/agents/skills/codex/drizzle-raw-sql/skill.yaml +1 -0
- package/dist/agents/skills/codex/drizzle-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/drizzle-schema-definition/skill.yaml +4 -0
- package/dist/agents/skills/codex/drizzle-transactions/skill.yaml +4 -0
- package/dist/agents/skills/codex/drizzle-with-nextjs/skill.yaml +1 -0
- package/dist/agents/skills/codex/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-event-schema/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-event-storming/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-idempotency/SKILL.md +1 -0
- package/dist/agents/skills/codex/events-idempotency/skill.yaml +2 -0
- package/dist/agents/skills/codex/events-kafka-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-message-queue/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-pubsub-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-redis-pubsub/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-saga-choreography/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-sse-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/events-webhooks-pattern/SKILL.md +1 -0
- package/dist/agents/skills/codex/events-webhooks-pattern/skill.yaml +3 -0
- package/dist/agents/skills/codex/events-websocket-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-abstract-factory/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-builder-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-chain-of-responsibility/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-factory-method/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-mediator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-memento-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-null-object/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-singleton/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-template-method/skill.yaml +1 -0
- package/dist/agents/skills/codex/gof-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/graphql-apollo-server/skill.yaml +1 -0
- package/dist/agents/skills/codex/graphql-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/codex/graphql-auth-patterns/skill.yaml +3 -0
- package/dist/agents/skills/codex/graphql-client-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/graphql-codegen-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/graphql-dataloader-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/graphql-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/codex/graphql-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/codex/graphql-federation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/graphql-pagination-patterns/SKILL.md +1 -0
- package/dist/agents/skills/codex/graphql-pagination-patterns/skill.yaml +4 -0
- package/dist/agents/skills/codex/graphql-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/codex/graphql-resolver-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/graphql-schema-design/SKILL.md +1 -0
- package/dist/agents/skills/codex/graphql-schema-design/skill.yaml +3 -0
- package/dist/agents/skills/codex/graphql-subscriptions/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-api-design/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-auth/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-autopilot/SKILL.md +171 -822
- package/dist/agents/skills/codex/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +145 -195
- package/dist/agents/skills/codex/harness-brainstorming/skill.yaml +4 -0
- package/dist/agents/skills/codex/harness-caching/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-chaos/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-code-review/SKILL.md +267 -436
- package/dist/agents/skills/codex/harness-code-review/skill.yaml +7 -0
- package/dist/agents/skills/codex/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-compliance/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-containerization/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-data-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-data-validation/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-database/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-deployment/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-dx/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-e2e/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-execution/SKILL.md +180 -271
- package/dist/agents/skills/codex/harness-execution/skill.yaml +13 -0
- package/dist/agents/skills/codex/harness-feature-flags/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-incident-response/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-infrastructure-as-code/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-integration-test/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-load-testing/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-ml-ops/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-mobile-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-mutation-test/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-observability/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-planning/SKILL.md +142 -322
- package/dist/agents/skills/codex/harness-planning/skill.yaml +7 -0
- package/dist/agents/skills/codex/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-product-spec/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-property-test/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-resilience/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-roadmap-pilot/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-router/SKILL.md +69 -123
- package/dist/agents/skills/codex/harness-router/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-secrets/SKILL.md +3 -3
- package/dist/agents/skills/codex/harness-secrets/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-security-review/skill.yaml +6 -0
- package/dist/agents/skills/codex/harness-security-scan/skill.yaml +7 -0
- package/dist/agents/skills/codex/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-soundness-review/SKILL.md +483 -667
- package/dist/agents/skills/codex/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-sql-review/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-supply-chain-audit/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-test-data/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-ux-copy/skill.yaml +13 -0
- package/dist/agents/skills/codex/harness-verification/SKILL.md +135 -221
- package/dist/agents/skills/codex/harness-verification/skill.yaml +4 -0
- package/dist/agents/skills/codex/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/codex/harness-visual-regression/skill.yaml +1 -0
- package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-abstract-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-chain-of-responsibility-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-constructor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-mediator-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-mixin-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-revealing-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-singleton-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-static-import/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-template-method-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/js-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-api-gateway/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-config-server/SKILL.md +1 -1
- package/dist/agents/skills/codex/microservices-config-server/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-cqrs-pattern/skill.yaml +3 -0
- package/dist/agents/skills/codex/microservices-decomposition/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-distributed-tracing/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-event-sourcing/skill.yaml +3 -0
- package/dist/agents/skills/codex/microservices-health-check/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-saga-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-service-discovery/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-sidecar-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/microservices-strangler-fig/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-animation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-deployment-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-expo-setup/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-flatlist-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-gesture-handling/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-native-modules/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-navigation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-network-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/codex/mobile-push-notifications/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-storage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/mobile-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-config-module/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-controller-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-dependency-injection/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-dto-validation/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-exception-filters/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-graphql-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-guards-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-interceptors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-microservices/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-pipes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-service-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-swagger-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/nestjs-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-app-router/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-auth-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-caching-strategies/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-data-fetching/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-deployment-optimization/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-error-boundaries/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-metadata-api/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-monorepo-setup/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-parallel-intercepting-routes/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-route-handlers/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-server-actions/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-server-components/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-static-generation/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-streaming-suspense/skill.yaml +1 -0
- package/dist/agents/skills/codex/next-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-buffer-encoding/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-child-process/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-crypto-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-esm-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-event-emitter/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-express-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-fastify-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-http-server/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-path-fs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-performance-profiling/skill.yaml +6 -0
- package/dist/agents/skills/codex/node-streams-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/node-worker-threads/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-auto-imports/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-layouts-pages/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-modules-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-plugins-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-seo-metadata/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-server-routes/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-state-management/skill.yaml +1 -0
- package/dist/agents/skills/codex/nuxt-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-context-propagation/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-custom-instrumentation/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-error-tracking/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-exporter-config/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-logging-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-metrics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-nestjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-performance-insights/skill.yaml +5 -0
- package/dist/agents/skills/codex/otel-sampling-strategies/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-sdk-setup/skill.yaml +1 -0
- package/dist/agents/skills/codex/otel-tracing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/owasp-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/codex/owasp-auth-patterns/skill.yaml +8 -0
- package/dist/agents/skills/codex/owasp-cryptography/skill.yaml +6 -0
- package/dist/agents/skills/codex/owasp-csrf-protection/skill.yaml +3 -0
- package/dist/agents/skills/codex/owasp-dependency-security/skill.yaml +4 -0
- package/dist/agents/skills/codex/owasp-file-upload-security/skill.yaml +3 -0
- package/dist/agents/skills/codex/owasp-idor-prevention/skill.yaml +4 -0
- package/dist/agents/skills/codex/owasp-injection-prevention/skill.yaml +4 -0
- package/dist/agents/skills/codex/owasp-logging-monitoring/skill.yaml +5 -0
- package/dist/agents/skills/codex/owasp-rate-limiting/SKILL.md +1 -0
- package/dist/agents/skills/codex/owasp-rate-limiting/skill.yaml +5 -0
- package/dist/agents/skills/codex/owasp-secrets-management/SKILL.md +2 -1
- package/dist/agents/skills/codex/owasp-secrets-management/skill.yaml +5 -0
- package/dist/agents/skills/codex/owasp-security-headers/skill.yaml +4 -0
- package/dist/agents/skills/codex/owasp-xss-prevention/skill.yaml +3 -0
- package/dist/agents/skills/codex/perf-browser-cache/SKILL.md +151 -0
- package/dist/agents/skills/codex/perf-browser-cache/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-bundle-analysis/SKILL.md +217 -0
- package/dist/agents/skills/codex/perf-bundle-analysis/skill.yaml +37 -0
- package/dist/agents/skills/codex/perf-cache-invalidation/SKILL.md +228 -0
- package/dist/agents/skills/codex/perf-cache-invalidation/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-cdn-cache-control/SKILL.md +198 -0
- package/dist/agents/skills/codex/perf-cdn-cache-control/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-cdn-strategies/SKILL.md +161 -0
- package/dist/agents/skills/codex/perf-cdn-strategies/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-client-side-rendering/SKILL.md +245 -0
- package/dist/agents/skills/codex/perf-client-side-rendering/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-code-splitting/SKILL.md +185 -0
- package/dist/agents/skills/codex/perf-code-splitting/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-compression/SKILL.md +163 -0
- package/dist/agents/skills/codex/perf-compression/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-connection-costs/SKILL.md +165 -0
- package/dist/agents/skills/codex/perf-connection-costs/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-connection-pooling/SKILL.md +250 -0
- package/dist/agents/skills/codex/perf-connection-pooling/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-critical-rendering-path/SKILL.md +167 -0
- package/dist/agents/skills/codex/perf-critical-rendering-path/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-cumulative-layout-shift/SKILL.md +180 -0
- package/dist/agents/skills/codex/perf-cumulative-layout-shift/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-dom-parsing/SKILL.md +153 -0
- package/dist/agents/skills/codex/perf-dom-parsing/skill.yaml +36 -0
- package/dist/agents/skills/codex/perf-edge-rendering/SKILL.md +222 -0
- package/dist/agents/skills/codex/perf-edge-rendering/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-event-loop/SKILL.md +203 -0
- package/dist/agents/skills/codex/perf-event-loop/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-font-loading/SKILL.md +222 -0
- package/dist/agents/skills/codex/perf-font-loading/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-garbage-collection/SKILL.md +192 -0
- package/dist/agents/skills/codex/perf-garbage-collection/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-heap-profiling/SKILL.md +160 -0
- package/dist/agents/skills/codex/perf-heap-profiling/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-http2-multiplexing/SKILL.md +163 -0
- package/dist/agents/skills/codex/perf-http2-multiplexing/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-http3-quic/SKILL.md +165 -0
- package/dist/agents/skills/codex/perf-http3-quic/skill.yaml +37 -0
- package/dist/agents/skills/codex/perf-image-formats/SKILL.md +183 -0
- package/dist/agents/skills/codex/perf-image-formats/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-index-strategies/SKILL.md +210 -0
- package/dist/agents/skills/codex/perf-index-strategies/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-interaction-to-next-paint/SKILL.md +170 -0
- package/dist/agents/skills/codex/perf-interaction-to-next-paint/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-largest-contentful-paint/SKILL.md +162 -0
- package/dist/agents/skills/codex/perf-largest-contentful-paint/skill.yaml +41 -0
- package/dist/agents/skills/codex/perf-layout-reflow/SKILL.md +187 -0
- package/dist/agents/skills/codex/perf-layout-reflow/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-lazy-loading/SKILL.md +217 -0
- package/dist/agents/skills/codex/perf-lazy-loading/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-lazy-loading-media/SKILL.md +233 -0
- package/dist/agents/skills/codex/perf-lazy-loading-media/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-long-tasks/SKILL.md +194 -0
- package/dist/agents/skills/codex/perf-long-tasks/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-memory-leaks/SKILL.md +218 -0
- package/dist/agents/skills/codex/perf-memory-leaks/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-module-federation/SKILL.md +242 -0
- package/dist/agents/skills/codex/perf-module-federation/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-n-plus-one/SKILL.md +237 -0
- package/dist/agents/skills/codex/perf-n-plus-one/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-paint-compositing/SKILL.md +181 -0
- package/dist/agents/skills/codex/perf-paint-compositing/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-performance-api/SKILL.md +249 -0
- package/dist/agents/skills/codex/perf-performance-api/skill.yaml +41 -0
- package/dist/agents/skills/codex/perf-profiling-methodology/SKILL.md +181 -0
- package/dist/agents/skills/codex/perf-profiling-methodology/skill.yaml +44 -0
- package/dist/agents/skills/codex/perf-query-optimization/SKILL.md +203 -0
- package/dist/agents/skills/codex/perf-query-optimization/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-resource-hints/SKILL.md +167 -0
- package/dist/agents/skills/codex/perf-resource-hints/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-responsive-images/SKILL.md +225 -0
- package/dist/agents/skills/codex/perf-responsive-images/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-server-side-caching/SKILL.md +194 -0
- package/dist/agents/skills/codex/perf-server-side-caching/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-server-side-rendering/SKILL.md +239 -0
- package/dist/agents/skills/codex/perf-server-side-rendering/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-service-worker-caching/SKILL.md +247 -0
- package/dist/agents/skills/codex/perf-service-worker-caching/skill.yaml +40 -0
- package/dist/agents/skills/codex/perf-static-generation/SKILL.md +241 -0
- package/dist/agents/skills/codex/perf-static-generation/skill.yaml +39 -0
- package/dist/agents/skills/codex/perf-streaming-rendering/SKILL.md +242 -0
- package/dist/agents/skills/codex/perf-streaming-rendering/skill.yaml +37 -0
- package/dist/agents/skills/codex/perf-style-calculation/SKILL.md +166 -0
- package/dist/agents/skills/codex/perf-style-calculation/skill.yaml +36 -0
- package/dist/agents/skills/codex/perf-svg-optimization/SKILL.md +249 -0
- package/dist/agents/skills/codex/perf-svg-optimization/skill.yaml +37 -0
- package/dist/agents/skills/codex/perf-tree-shaking/SKILL.md +225 -0
- package/dist/agents/skills/codex/perf-tree-shaking/skill.yaml +38 -0
- package/dist/agents/skills/codex/perf-web-workers/SKILL.md +237 -0
- package/dist/agents/skills/codex/perf-web-workers/skill.yaml +40 -0
- package/dist/agents/skills/codex/prisma-client-queries/skill.yaml +1 -0
- package/dist/agents/skills/codex/prisma-filtering-sorting/skill.yaml +1 -0
- package/dist/agents/skills/codex/prisma-migrations/skill.yaml +3 -0
- package/dist/agents/skills/codex/prisma-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/codex/prisma-raw-queries/skill.yaml +1 -0
- package/dist/agents/skills/codex/prisma-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/prisma-schema-design/skill.yaml +4 -0
- package/dist/agents/skills/codex/prisma-seeding-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/prisma-soft-delete/skill.yaml +1 -0
- package/dist/agents/skills/codex/prisma-transactions/skill.yaml +4 -0
- package/dist/agents/skills/codex/prisma-type-generation/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-2026/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-client-rendering/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-compound-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-concurrent-ui/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-container-presentational/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-hoc-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-hooks-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-islands-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-memoization-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-progressive-hydration/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-render-props-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-server-components/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-server-rendering/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-state-management-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-static-import/skill.yaml +1 -0
- package/dist/agents/skills/codex/react-suspense-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-entity-adapter/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-listener-middleware/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-persistence-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-rtk-optimistic/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-rtk-query-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-rtk-query-setup/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-selectors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-slice-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-store-setup/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-thunk-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/redux-typescript-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-chaos-testing/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-dead-letter/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-fallback-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-health-checks/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-idempotency/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-rate-limiting/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-retry-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/resilience-timeout-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/security-abac-design/SKILL.md +154 -0
- package/dist/agents/skills/codex/security-abac-design/skill.yaml +41 -0
- package/dist/agents/skills/codex/security-asymmetric-encryption/SKILL.md +201 -0
- package/dist/agents/skills/codex/security-asymmetric-encryption/skill.yaml +42 -0
- package/dist/agents/skills/codex/security-attack-trees/SKILL.md +150 -0
- package/dist/agents/skills/codex/security-attack-trees/skill.yaml +37 -0
- package/dist/agents/skills/codex/security-audit-log-design/SKILL.md +227 -0
- package/dist/agents/skills/codex/security-audit-log-design/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-authentication-flows/SKILL.md +168 -0
- package/dist/agents/skills/codex/security-authentication-flows/skill.yaml +42 -0
- package/dist/agents/skills/codex/security-capability-based-security/SKILL.md +158 -0
- package/dist/agents/skills/codex/security-capability-based-security/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-certificate-management/SKILL.md +153 -0
- package/dist/agents/skills/codex/security-certificate-management/skill.yaml +42 -0
- package/dist/agents/skills/codex/security-ci-security-testing/SKILL.md +159 -0
- package/dist/agents/skills/codex/security-ci-security-testing/skill.yaml +43 -0
- package/dist/agents/skills/codex/security-code-signing/SKILL.md +155 -0
- package/dist/agents/skills/codex/security-code-signing/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-compliance-logging/SKILL.md +183 -0
- package/dist/agents/skills/codex/security-compliance-logging/skill.yaml +38 -0
- package/dist/agents/skills/codex/security-credential-storage/SKILL.md +222 -0
- package/dist/agents/skills/codex/security-credential-storage/skill.yaml +41 -0
- package/dist/agents/skills/codex/security-cryptographic-randomness/SKILL.md +154 -0
- package/dist/agents/skills/codex/security-cryptographic-randomness/skill.yaml +41 -0
- package/dist/agents/skills/codex/security-dependency-auditing/SKILL.md +156 -0
- package/dist/agents/skills/codex/security-dependency-auditing/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-deserialization-attacks/SKILL.md +180 -0
- package/dist/agents/skills/codex/security-deserialization-attacks/skill.yaml +38 -0
- package/dist/agents/skills/codex/security-environment-variable-risks/SKILL.md +153 -0
- package/dist/agents/skills/codex/security-environment-variable-risks/skill.yaml +37 -0
- package/dist/agents/skills/codex/security-forensics-fundamentals/SKILL.md +198 -0
- package/dist/agents/skills/codex/security-forensics-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-hashing-fundamentals/SKILL.md +212 -0
- package/dist/agents/skills/codex/security-hashing-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-hmac-signatures/SKILL.md +165 -0
- package/dist/agents/skills/codex/security-hmac-signatures/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-hsts-preloading/SKILL.md +154 -0
- package/dist/agents/skills/codex/security-hsts-preloading/skill.yaml +38 -0
- package/dist/agents/skills/codex/security-identity-verification/SKILL.md +157 -0
- package/dist/agents/skills/codex/security-identity-verification/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-incident-containment/SKILL.md +190 -0
- package/dist/agents/skills/codex/security-incident-containment/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-injection-families/SKILL.md +235 -0
- package/dist/agents/skills/codex/security-injection-families/skill.yaml +41 -0
- package/dist/agents/skills/codex/security-log-correlation/SKILL.md +178 -0
- package/dist/agents/skills/codex/security-log-correlation/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-memory-safety/SKILL.md +234 -0
- package/dist/agents/skills/codex/security-memory-safety/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-mfa-design/SKILL.md +150 -0
- package/dist/agents/skills/codex/security-mfa-design/skill.yaml +41 -0
- package/dist/agents/skills/codex/security-microsegmentation/SKILL.md +154 -0
- package/dist/agents/skills/codex/security-microsegmentation/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-mtls-design/SKILL.md +158 -0
- package/dist/agents/skills/codex/security-mtls-design/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-penetration-testing/SKILL.md +166 -0
- package/dist/agents/skills/codex/security-penetration-testing/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-post-incident-review/SKILL.md +205 -0
- package/dist/agents/skills/codex/security-post-incident-review/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-race-conditions/SKILL.md +186 -0
- package/dist/agents/skills/codex/security-race-conditions/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-rbac-design/SKILL.md +209 -0
- package/dist/agents/skills/codex/security-rbac-design/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-rebac-design/SKILL.md +154 -0
- package/dist/agents/skills/codex/security-rebac-design/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-sbom-provenance/SKILL.md +157 -0
- package/dist/agents/skills/codex/security-sbom-provenance/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-secrets-lifecycle/SKILL.md +190 -0
- package/dist/agents/skills/codex/security-secrets-lifecycle/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-security-champions/SKILL.md +165 -0
- package/dist/agents/skills/codex/security-security-champions/skill.yaml +37 -0
- package/dist/agents/skills/codex/security-session-management/SKILL.md +196 -0
- package/dist/agents/skills/codex/security-session-management/skill.yaml +41 -0
- package/dist/agents/skills/codex/security-shift-left-design/SKILL.md +153 -0
- package/dist/agents/skills/codex/security-shift-left-design/skill.yaml +38 -0
- package/dist/agents/skills/codex/security-symmetric-encryption/SKILL.md +176 -0
- package/dist/agents/skills/codex/security-symmetric-encryption/skill.yaml +41 -0
- package/dist/agents/skills/codex/security-threat-modeling-process/SKILL.md +150 -0
- package/dist/agents/skills/codex/security-threat-modeling-process/skill.yaml +38 -0
- package/dist/agents/skills/codex/security-threat-modeling-stride/SKILL.md +150 -0
- package/dist/agents/skills/codex/security-threat-modeling-stride/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-tls-fundamentals/SKILL.md +186 -0
- package/dist/agents/skills/codex/security-tls-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/codex/security-trust-boundaries/SKILL.md +152 -0
- package/dist/agents/skills/codex/security-trust-boundaries/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-vault-patterns/SKILL.md +155 -0
- package/dist/agents/skills/codex/security-vault-patterns/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-vulnerability-disclosure/SKILL.md +207 -0
- package/dist/agents/skills/codex/security-vulnerability-disclosure/skill.yaml +39 -0
- package/dist/agents/skills/codex/security-zero-trust-principles/SKILL.md +229 -0
- package/dist/agents/skills/codex/security-zero-trust-principles/skill.yaml +40 -0
- package/dist/agents/skills/codex/state-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-jotai-atoms/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-selection-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-server-client-sync/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-zustand-devtools/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-zustand-immer/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-zustand-persist/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-zustand-react/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-zustand-slices/skill.yaml +1 -0
- package/dist/agents/skills/codex/state-zustand-store/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-adapter-config/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-component-composition/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-error-pages/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-form-actions/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-load-functions/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/codex/svelte-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-runes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-server-hooks/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-state-management/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-stores-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/svelte-transitions-animations/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-cache-management/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-dependent-queries/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-devtools/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-infinite-queries/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-mutation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-optimistic-updates/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-prefetching/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-query-invalidation/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-query-keys/skill.yaml +1 -0
- package/dist/agents/skills/codex/tanstack-suspense-mode/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-accessibility-testing/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-component-react/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-component-svelte/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-contract-testing/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-coverage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-e2e-strategy/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-factory-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-integration-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-mock-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-msw-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-performance-testing/skill.yaml +5 -0
- package/dist/agents/skills/codex/test-playwright-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-playwright-setup/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-property-based/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-snapshot-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-tdd-workflow/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-unit-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/test-vitest-config/skill.yaml +1 -0
- package/dist/agents/skills/codex/trpc-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/trpc-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/codex/trpc-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/codex/trpc-input-validation/SKILL.md +1 -0
- package/dist/agents/skills/codex/trpc-input-validation/skill.yaml +2 -0
- package/dist/agents/skills/codex/trpc-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/trpc-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/trpc-react-query-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/trpc-router-composition/SKILL.md +1 -0
- package/dist/agents/skills/codex/trpc-router-composition/skill.yaml +3 -0
- package/dist/agents/skills/codex/trpc-subscription-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-async-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-branded-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-class-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-conditional-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-config-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-declaration-merging/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-decorator-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-discriminated-unions/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-error-handling-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-generics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-mapped-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-module-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-performance-patterns/skill.yaml +5 -0
- package/dist/agents/skills/codex/ts-satisfies-operator/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-strict-mode/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-template-literal-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-testing-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-type-guards/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-utility-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/ts-zod-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/ux-active-voice/SKILL.md +150 -0
- package/dist/agents/skills/codex/ux-active-voice/skill.yaml +32 -0
- package/dist/agents/skills/codex/ux-button-cta-copy/SKILL.md +159 -0
- package/dist/agents/skills/codex/ux-button-cta-copy/skill.yaml +34 -0
- package/dist/agents/skills/codex/ux-confirmation-dialogs/SKILL.md +156 -0
- package/dist/agents/skills/codex/ux-confirmation-dialogs/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-content-hierarchy/SKILL.md +150 -0
- package/dist/agents/skills/codex/ux-content-hierarchy/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-data-table-copy/SKILL.md +154 -0
- package/dist/agents/skills/codex/ux-data-table-copy/skill.yaml +34 -0
- package/dist/agents/skills/codex/ux-destructive-action-copy/SKILL.md +152 -0
- package/dist/agents/skills/codex/ux-destructive-action-copy/skill.yaml +34 -0
- package/dist/agents/skills/codex/ux-empty-states/SKILL.md +155 -0
- package/dist/agents/skills/codex/ux-empty-states/skill.yaml +36 -0
- package/dist/agents/skills/codex/ux-error-messages/SKILL.md +159 -0
- package/dist/agents/skills/codex/ux-error-messages/skill.yaml +35 -0
- package/dist/agents/skills/codex/ux-error-severity/SKILL.md +155 -0
- package/dist/agents/skills/codex/ux-error-severity/skill.yaml +35 -0
- package/dist/agents/skills/codex/ux-form-labels/SKILL.md +159 -0
- package/dist/agents/skills/codex/ux-form-labels/skill.yaml +36 -0
- package/dist/agents/skills/codex/ux-inclusive-language/SKILL.md +161 -0
- package/dist/agents/skills/codex/ux-inclusive-language/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-internationalization-writing/SKILL.md +196 -0
- package/dist/agents/skills/codex/ux-internationalization-writing/skill.yaml +35 -0
- package/dist/agents/skills/codex/ux-loading-states/SKILL.md +162 -0
- package/dist/agents/skills/codex/ux-loading-states/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-microcopy-principles/SKILL.md +152 -0
- package/dist/agents/skills/codex/ux-microcopy-principles/skill.yaml +37 -0
- package/dist/agents/skills/codex/ux-navigation-labels/SKILL.md +163 -0
- package/dist/agents/skills/codex/ux-navigation-labels/skill.yaml +35 -0
- package/dist/agents/skills/codex/ux-notification-copy/SKILL.md +150 -0
- package/dist/agents/skills/codex/ux-notification-copy/skill.yaml +35 -0
- package/dist/agents/skills/codex/ux-onboarding-copy/SKILL.md +156 -0
- package/dist/agents/skills/codex/ux-onboarding-copy/skill.yaml +35 -0
- package/dist/agents/skills/codex/ux-permission-access-copy/SKILL.md +150 -0
- package/dist/agents/skills/codex/ux-permission-access-copy/skill.yaml +34 -0
- package/dist/agents/skills/codex/ux-plain-language/SKILL.md +157 -0
- package/dist/agents/skills/codex/ux-plain-language/skill.yaml +34 -0
- package/dist/agents/skills/codex/ux-search-copy/SKILL.md +154 -0
- package/dist/agents/skills/codex/ux-search-copy/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-settings-preferences/SKILL.md +152 -0
- package/dist/agents/skills/codex/ux-settings-preferences/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-success-feedback/SKILL.md +163 -0
- package/dist/agents/skills/codex/ux-success-feedback/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-tooltip-contextual-help/SKILL.md +163 -0
- package/dist/agents/skills/codex/ux-tooltip-contextual-help/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-voice-tone/SKILL.md +150 -0
- package/dist/agents/skills/codex/ux-voice-tone/skill.yaml +33 -0
- package/dist/agents/skills/codex/ux-writing-for-scanning/SKILL.md +150 -0
- package/dist/agents/skills/codex/ux-writing-for-scanning/skill.yaml +35 -0
- package/dist/agents/skills/codex/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-async-components/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-component-events/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-pinia-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-provide-inject/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-reactive-refs/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-renderless-components/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-slots-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-teleport-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/vue-watchers-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-actor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-guards-actions/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-history-states/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-invoke-pattern/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-machine-definition/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-parallel-states/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-react-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-typegen/skill.yaml +1 -0
- package/dist/agents/skills/codex/xstate-visualization/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-array-validation/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-async-validation/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-infer-types/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-object-patterns/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-schema-definition/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-string-validation/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-transform-refine/skill.yaml +1 -0
- package/dist/agents/skills/codex/zod-union-discriminated/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-aria-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-color-contrast/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-form-patterns/skill.yaml +2 -0
- package/dist/agents/skills/cursor/a11y-image-text-alt/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-keyboard-navigation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-modal-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-motion-animation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-screen-reader-testing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-semantic-html/skill.yaml +1 -0
- package/dist/agents/skills/cursor/a11y-testing-automation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/cursor/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-http-interceptors/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-lazy-loading/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/cursor/angular-pipe-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-reactive-forms/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-routing-guards/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-rxjs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-schematics/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-service-di/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-signals-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-standalone-components/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-state-management/skill.yaml +1 -0
- package/dist/agents/skills/cursor/angular-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/api-api-keys/SKILL.md +135 -0
- package/dist/agents/skills/cursor/api-api-keys/skill.yaml +41 -0
- package/dist/agents/skills/cursor/api-authentication-patterns/SKILL.md +117 -0
- package/dist/agents/skills/cursor/api-authentication-patterns/skill.yaml +44 -0
- package/dist/agents/skills/cursor/api-backward-compatibility/SKILL.md +170 -0
- package/dist/agents/skills/cursor/api-backward-compatibility/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-bulk-operations/SKILL.md +198 -0
- package/dist/agents/skills/cursor/api-bulk-operations/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-conditional-requests/SKILL.md +233 -0
- package/dist/agents/skills/cursor/api-conditional-requests/skill.yaml +41 -0
- package/dist/agents/skills/cursor/api-content-negotiation/SKILL.md +194 -0
- package/dist/agents/skills/cursor/api-content-negotiation/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-contract-testing/SKILL.md +222 -0
- package/dist/agents/skills/cursor/api-contract-testing/skill.yaml +42 -0
- package/dist/agents/skills/cursor/api-deprecation-strategy/SKILL.md +156 -0
- package/dist/agents/skills/cursor/api-deprecation-strategy/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-error-contracts/SKILL.md +149 -0
- package/dist/agents/skills/cursor/api-error-contracts/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-field-selection/SKILL.md +193 -0
- package/dist/agents/skills/cursor/api-field-selection/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-filtering-sorting/SKILL.md +170 -0
- package/dist/agents/skills/cursor/api-filtering-sorting/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-hateoas/SKILL.md +212 -0
- package/dist/agents/skills/cursor/api-hateoas/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-http-caching/SKILL.md +188 -0
- package/dist/agents/skills/cursor/api-http-caching/skill.yaml +43 -0
- package/dist/agents/skills/cursor/api-http-methods/SKILL.md +185 -0
- package/dist/agents/skills/cursor/api-http-methods/skill.yaml +43 -0
- package/dist/agents/skills/cursor/api-idempotency-keys/SKILL.md +176 -0
- package/dist/agents/skills/cursor/api-idempotency-keys/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-long-running-operations/SKILL.md +209 -0
- package/dist/agents/skills/cursor/api-long-running-operations/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-nested-vs-flat/SKILL.md +173 -0
- package/dist/agents/skills/cursor/api-nested-vs-flat/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-oauth2-flows/SKILL.md +150 -0
- package/dist/agents/skills/cursor/api-oauth2-flows/skill.yaml +42 -0
- package/dist/agents/skills/cursor/api-openapi-design/SKILL.md +260 -0
- package/dist/agents/skills/cursor/api-openapi-design/skill.yaml +44 -0
- package/dist/agents/skills/cursor/api-pagination-cursor/SKILL.md +159 -0
- package/dist/agents/skills/cursor/api-pagination-cursor/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-pagination-keyset/SKILL.md +167 -0
- package/dist/agents/skills/cursor/api-pagination-keyset/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-pagination-offset/SKILL.md +135 -0
- package/dist/agents/skills/cursor/api-pagination-offset/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-problem-details-rfc/SKILL.md +164 -0
- package/dist/agents/skills/cursor/api-problem-details-rfc/skill.yaml +38 -0
- package/dist/agents/skills/cursor/api-rate-limit-headers/SKILL.md +144 -0
- package/dist/agents/skills/cursor/api-rate-limit-headers/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-rate-limiting/SKILL.md +131 -0
- package/dist/agents/skills/cursor/api-rate-limiting/skill.yaml +41 -0
- package/dist/agents/skills/cursor/api-resource-granularity/SKILL.md +165 -0
- package/dist/agents/skills/cursor/api-resource-granularity/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-resource-modeling/SKILL.md +155 -0
- package/dist/agents/skills/cursor/api-resource-modeling/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-rest-maturity-model/SKILL.md +215 -0
- package/dist/agents/skills/cursor/api-rest-maturity-model/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-retry-guidance/SKILL.md +168 -0
- package/dist/agents/skills/cursor/api-retry-guidance/skill.yaml +41 -0
- package/dist/agents/skills/cursor/api-sdk-ergonomics/SKILL.md +194 -0
- package/dist/agents/skills/cursor/api-sdk-ergonomics/skill.yaml +43 -0
- package/dist/agents/skills/cursor/api-status-codes/SKILL.md +196 -0
- package/dist/agents/skills/cursor/api-status-codes/skill.yaml +46 -0
- package/dist/agents/skills/cursor/api-validation-errors/SKILL.md +174 -0
- package/dist/agents/skills/cursor/api-validation-errors/skill.yaml +40 -0
- package/dist/agents/skills/cursor/api-versioning-header/SKILL.md +177 -0
- package/dist/agents/skills/cursor/api-versioning-header/skill.yaml +37 -0
- package/dist/agents/skills/cursor/api-versioning-url/SKILL.md +128 -0
- package/dist/agents/skills/cursor/api-versioning-url/skill.yaml +39 -0
- package/dist/agents/skills/cursor/api-webhook-design/SKILL.md +165 -0
- package/dist/agents/skills/cursor/api-webhook-design/skill.yaml +41 -0
- package/dist/agents/skills/cursor/api-webhook-security/SKILL.md +176 -0
- package/dist/agents/skills/cursor/api-webhook-security/skill.yaml +41 -0
- package/dist/agents/skills/cursor/astro-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-content-collections/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-integration-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-islands-architecture/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-multi-framework/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-server-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-ssr-hybrid/skill.yaml +1 -0
- package/dist/agents/skills/cursor/astro-view-transitions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/cursor/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-animation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-component-variants/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-css-modules/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-custom-components/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-dark-mode/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-design-tokens/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-headless-ui/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-layout-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/cursor/css-responsive-design/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-tailwind-merge/skill.yaml +1 -0
- package/dist/agents/skills/cursor/css-tailwind-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/db-acid-in-practice/SKILL.md +215 -0
- package/dist/agents/skills/cursor/db-acid-in-practice/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-acid-properties/SKILL.md +190 -0
- package/dist/agents/skills/cursor/db-acid-properties/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-adjacency-list/SKILL.md +199 -0
- package/dist/agents/skills/cursor/db-adjacency-list/skill.yaml +40 -0
- package/dist/agents/skills/cursor/db-audit-trail/SKILL.md +244 -0
- package/dist/agents/skills/cursor/db-audit-trail/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-btree-index/SKILL.md +182 -0
- package/dist/agents/skills/cursor/db-btree-index/skill.yaml +44 -0
- package/dist/agents/skills/cursor/db-cap-theorem/SKILL.md +156 -0
- package/dist/agents/skills/cursor/db-cap-theorem/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-closure-table/SKILL.md +197 -0
- package/dist/agents/skills/cursor/db-closure-table/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-composite-index/SKILL.md +199 -0
- package/dist/agents/skills/cursor/db-composite-index/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-connection-pooling/SKILL.md +196 -0
- package/dist/agents/skills/cursor/db-connection-pooling/skill.yaml +39 -0
- package/dist/agents/skills/cursor/db-connection-sizing/SKILL.md +236 -0
- package/dist/agents/skills/cursor/db-connection-sizing/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-covering-index/SKILL.md +203 -0
- package/dist/agents/skills/cursor/db-covering-index/skill.yaml +40 -0
- package/dist/agents/skills/cursor/db-deadlock-prevention/SKILL.md +204 -0
- package/dist/agents/skills/cursor/db-deadlock-prevention/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-denormalization/SKILL.md +176 -0
- package/dist/agents/skills/cursor/db-denormalization/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-document-in-relational/SKILL.md +225 -0
- package/dist/agents/skills/cursor/db-document-in-relational/skill.yaml +42 -0
- package/dist/agents/skills/cursor/db-entity-attribute-value/SKILL.md +186 -0
- package/dist/agents/skills/cursor/db-entity-attribute-value/skill.yaml +39 -0
- package/dist/agents/skills/cursor/db-eventual-consistency/SKILL.md +226 -0
- package/dist/agents/skills/cursor/db-eventual-consistency/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-expand-contract/SKILL.md +199 -0
- package/dist/agents/skills/cursor/db-expand-contract/skill.yaml +40 -0
- package/dist/agents/skills/cursor/db-explain-reading/SKILL.md +213 -0
- package/dist/agents/skills/cursor/db-explain-reading/skill.yaml +44 -0
- package/dist/agents/skills/cursor/db-expression-index/SKILL.md +211 -0
- package/dist/agents/skills/cursor/db-expression-index/skill.yaml +40 -0
- package/dist/agents/skills/cursor/db-first-normal-form/SKILL.md +190 -0
- package/dist/agents/skills/cursor/db-first-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-graph-in-relational/SKILL.md +212 -0
- package/dist/agents/skills/cursor/db-graph-in-relational/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-hash-index/SKILL.md +176 -0
- package/dist/agents/skills/cursor/db-hash-index/skill.yaml +37 -0
- package/dist/agents/skills/cursor/db-hierarchical-data/SKILL.md +194 -0
- package/dist/agents/skills/cursor/db-hierarchical-data/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-horizontal-sharding/SKILL.md +228 -0
- package/dist/agents/skills/cursor/db-horizontal-sharding/skill.yaml +40 -0
- package/dist/agents/skills/cursor/db-isolation-levels/SKILL.md +158 -0
- package/dist/agents/skills/cursor/db-isolation-levels/skill.yaml +43 -0
- package/dist/agents/skills/cursor/db-isolation-selection/SKILL.md +160 -0
- package/dist/agents/skills/cursor/db-isolation-selection/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-migration-rollback/SKILL.md +223 -0
- package/dist/agents/skills/cursor/db-migration-rollback/skill.yaml +40 -0
- package/dist/agents/skills/cursor/db-mvcc/SKILL.md +191 -0
- package/dist/agents/skills/cursor/db-mvcc/skill.yaml +45 -0
- package/dist/agents/skills/cursor/db-nested-sets/SKILL.md +171 -0
- package/dist/agents/skills/cursor/db-nested-sets/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-optimistic-locking/SKILL.md +151 -0
- package/dist/agents/skills/cursor/db-optimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/cursor/db-partial-index/SKILL.md +196 -0
- package/dist/agents/skills/cursor/db-partial-index/skill.yaml +39 -0
- package/dist/agents/skills/cursor/db-pessimistic-locking/SKILL.md +158 -0
- package/dist/agents/skills/cursor/db-pessimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/cursor/db-polymorphic-associations/SKILL.md +187 -0
- package/dist/agents/skills/cursor/db-polymorphic-associations/skill.yaml +42 -0
- package/dist/agents/skills/cursor/db-query-rewriting/SKILL.md +249 -0
- package/dist/agents/skills/cursor/db-query-rewriting/skill.yaml +43 -0
- package/dist/agents/skills/cursor/db-query-statistics/SKILL.md +210 -0
- package/dist/agents/skills/cursor/db-query-statistics/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-read-phenomena/SKILL.md +205 -0
- package/dist/agents/skills/cursor/db-read-phenomena/skill.yaml +42 -0
- package/dist/agents/skills/cursor/db-scan-types/SKILL.md +248 -0
- package/dist/agents/skills/cursor/db-scan-types/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-second-normal-form/SKILL.md +183 -0
- package/dist/agents/skills/cursor/db-second-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-table-partitioning/SKILL.md +229 -0
- package/dist/agents/skills/cursor/db-table-partitioning/skill.yaml +39 -0
- package/dist/agents/skills/cursor/db-temporal-data/SKILL.md +194 -0
- package/dist/agents/skills/cursor/db-temporal-data/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-third-normal-form/SKILL.md +210 -0
- package/dist/agents/skills/cursor/db-third-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/cursor/db-time-series/SKILL.md +196 -0
- package/dist/agents/skills/cursor/db-time-series/skill.yaml +41 -0
- package/dist/agents/skills/cursor/db-vertical-partitioning/SKILL.md +249 -0
- package/dist/agents/skills/cursor/db-vertical-partitioning/skill.yaml +40 -0
- package/dist/agents/skills/cursor/db-zero-downtime-migration/SKILL.md +199 -0
- package/dist/agents/skills/cursor/db-zero-downtime-migration/skill.yaml +42 -0
- package/dist/agents/skills/cursor/design-affordances/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-alignment/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-apple-hig/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-atomic-design/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-brand-consistency/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-color-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-color-harmony/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-color-psychology/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-component-anatomy/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-consistency/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-content-density/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-contrast-ratio/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-dark-mode-color/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-data-viz-design/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-design-audit/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-design-critique/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-design-documentation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-design-governance/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-elevation-shadow/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-empty-error-states/skill.yaml +3 -0
- package/dist/agents/skills/cursor/design-feedback-patterns/skill.yaml +5 -0
- package/dist/agents/skills/cursor/design-fluent-design/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-font-pairing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-form-ux/skill.yaml +2 -0
- package/dist/agents/skills/cursor/design-gestalt-closure-continuity/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-gestalt-common-fate/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-gestalt-figure-ground/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-gestalt-proximity/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-gestalt-similarity/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-grid-systems/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-i18n-design/skill.yaml +2 -0
- package/dist/agents/skills/cursor/design-iconography/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-illustration-style/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-imagery-photography/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-information-architecture/skill.yaml +3 -0
- package/dist/agents/skills/cursor/design-loading-patterns/skill.yaml +2 -0
- package/dist/agents/skills/cursor/design-material-design-3/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-micro-interactions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-motion-principles/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-naming-conventions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-navigation-ux/skill.yaml +2 -0
- package/dist/agents/skills/cursor/design-palette-construction/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-parallax-scroll/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-readability/skill.yaml +3 -0
- package/dist/agents/skills/cursor/design-responsive-strategy/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-responsive-type/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-state-design/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-token-architecture/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-transitions-timing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-type-scale/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-typographic-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-typography-fundamentals/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-visual-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-web-fonts/skill.yaml +1 -0
- package/dist/agents/skills/cursor/design-whitespace/skill.yaml +1 -0
- package/dist/agents/skills/cursor/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/cursor/drizzle-filtering-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/drizzle-migrations/skill.yaml +3 -0
- package/dist/agents/skills/cursor/drizzle-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/cursor/drizzle-query-builder/skill.yaml +1 -0
- package/dist/agents/skills/cursor/drizzle-raw-sql/skill.yaml +1 -0
- package/dist/agents/skills/cursor/drizzle-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/drizzle-schema-definition/skill.yaml +4 -0
- package/dist/agents/skills/cursor/drizzle-transactions/skill.yaml +4 -0
- package/dist/agents/skills/cursor/drizzle-with-nextjs/skill.yaml +1 -0
- package/dist/agents/skills/cursor/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-event-schema/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-event-storming/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-idempotency/SKILL.md +1 -0
- package/dist/agents/skills/cursor/events-idempotency/skill.yaml +2 -0
- package/dist/agents/skills/cursor/events-kafka-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-message-queue/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-pubsub-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-redis-pubsub/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-saga-choreography/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-sse-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/events-webhooks-pattern/SKILL.md +1 -0
- package/dist/agents/skills/cursor/events-webhooks-pattern/skill.yaml +3 -0
- package/dist/agents/skills/cursor/events-websocket-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-abstract-factory/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-builder-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-chain-of-responsibility/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-factory-method/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-mediator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-memento-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-null-object/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-singleton/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-template-method/skill.yaml +1 -0
- package/dist/agents/skills/cursor/gof-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/graphql-apollo-server/skill.yaml +1 -0
- package/dist/agents/skills/cursor/graphql-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/cursor/graphql-auth-patterns/skill.yaml +3 -0
- package/dist/agents/skills/cursor/graphql-client-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/graphql-codegen-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/graphql-dataloader-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/graphql-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/cursor/graphql-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/cursor/graphql-federation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/graphql-pagination-patterns/SKILL.md +1 -0
- package/dist/agents/skills/cursor/graphql-pagination-patterns/skill.yaml +4 -0
- package/dist/agents/skills/cursor/graphql-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/cursor/graphql-resolver-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/graphql-schema-design/SKILL.md +1 -0
- package/dist/agents/skills/cursor/graphql-schema-design/skill.yaml +3 -0
- package/dist/agents/skills/cursor/graphql-subscriptions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-api-design/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-auth/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +171 -822
- package/dist/agents/skills/cursor/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +145 -195
- package/dist/agents/skills/cursor/harness-brainstorming/skill.yaml +4 -0
- package/dist/agents/skills/cursor/harness-caching/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-chaos/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-code-review/SKILL.md +267 -436
- package/dist/agents/skills/cursor/harness-code-review/skill.yaml +7 -0
- package/dist/agents/skills/cursor/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-compliance/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-containerization/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-data-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-data-validation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-database/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-deployment/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-dx/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-e2e/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-execution/SKILL.md +180 -271
- package/dist/agents/skills/cursor/harness-execution/skill.yaml +13 -0
- package/dist/agents/skills/cursor/harness-feature-flags/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-incident-response/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-infrastructure-as-code/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-integration-test/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-load-testing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-ml-ops/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-mobile-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-mutation-test/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-observability/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-planning/SKILL.md +142 -322
- package/dist/agents/skills/cursor/harness-planning/skill.yaml +7 -0
- package/dist/agents/skills/cursor/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-product-spec/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-property-test/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-resilience/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-roadmap-pilot/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-router/SKILL.md +69 -123
- package/dist/agents/skills/cursor/harness-router/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-secrets/SKILL.md +3 -3
- package/dist/agents/skills/cursor/harness-secrets/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-security-review/skill.yaml +6 -0
- package/dist/agents/skills/cursor/harness-security-scan/skill.yaml +7 -0
- package/dist/agents/skills/cursor/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-soundness-review/SKILL.md +483 -667
- package/dist/agents/skills/cursor/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-sql-review/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-supply-chain-audit/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-test-data/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-ux-copy/skill.yaml +13 -0
- package/dist/agents/skills/cursor/harness-verification/SKILL.md +135 -221
- package/dist/agents/skills/cursor/harness-verification/skill.yaml +4 -0
- package/dist/agents/skills/cursor/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/cursor/harness-visual-regression/skill.yaml +1 -0
- package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-abstract-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-chain-of-responsibility-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-constructor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-mediator-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-mixin-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-revealing-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-singleton-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-static-import/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-template-method-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/js-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-api-gateway/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-config-server/SKILL.md +1 -1
- package/dist/agents/skills/cursor/microservices-config-server/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-cqrs-pattern/skill.yaml +3 -0
- package/dist/agents/skills/cursor/microservices-decomposition/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-distributed-tracing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-event-sourcing/skill.yaml +3 -0
- package/dist/agents/skills/cursor/microservices-health-check/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-saga-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-service-discovery/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-sidecar-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/microservices-strangler-fig/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-animation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-deployment-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-expo-setup/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-flatlist-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-gesture-handling/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-native-modules/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-navigation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-network-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/cursor/mobile-push-notifications/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-storage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/mobile-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-config-module/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-controller-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-dependency-injection/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-dto-validation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-exception-filters/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-graphql-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-guards-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-interceptors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-microservices/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-pipes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-service-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-swagger-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nestjs-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-app-router/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-auth-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-caching-strategies/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-data-fetching/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-deployment-optimization/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-error-boundaries/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-metadata-api/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-monorepo-setup/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-parallel-intercepting-routes/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-route-handlers/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-server-actions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-server-components/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-static-generation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-streaming-suspense/skill.yaml +1 -0
- package/dist/agents/skills/cursor/next-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-buffer-encoding/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-child-process/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-crypto-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-esm-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-event-emitter/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-express-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-fastify-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-http-server/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-path-fs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-performance-profiling/skill.yaml +6 -0
- package/dist/agents/skills/cursor/node-streams-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/node-worker-threads/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-auto-imports/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-layouts-pages/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-modules-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-plugins-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-seo-metadata/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-server-routes/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-state-management/skill.yaml +1 -0
- package/dist/agents/skills/cursor/nuxt-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-context-propagation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-custom-instrumentation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-error-tracking/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-exporter-config/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-logging-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-metrics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-nestjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-performance-insights/skill.yaml +5 -0
- package/dist/agents/skills/cursor/otel-sampling-strategies/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-sdk-setup/skill.yaml +1 -0
- package/dist/agents/skills/cursor/otel-tracing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/owasp-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/cursor/owasp-auth-patterns/skill.yaml +8 -0
- package/dist/agents/skills/cursor/owasp-cryptography/skill.yaml +6 -0
- package/dist/agents/skills/cursor/owasp-csrf-protection/skill.yaml +3 -0
- package/dist/agents/skills/cursor/owasp-dependency-security/skill.yaml +4 -0
- package/dist/agents/skills/cursor/owasp-file-upload-security/skill.yaml +3 -0
- package/dist/agents/skills/cursor/owasp-idor-prevention/skill.yaml +4 -0
- package/dist/agents/skills/cursor/owasp-injection-prevention/skill.yaml +4 -0
- package/dist/agents/skills/cursor/owasp-logging-monitoring/skill.yaml +5 -0
- package/dist/agents/skills/cursor/owasp-rate-limiting/SKILL.md +1 -0
- package/dist/agents/skills/cursor/owasp-rate-limiting/skill.yaml +5 -0
- package/dist/agents/skills/cursor/owasp-secrets-management/SKILL.md +2 -1
- package/dist/agents/skills/cursor/owasp-secrets-management/skill.yaml +5 -0
- package/dist/agents/skills/cursor/owasp-security-headers/skill.yaml +4 -0
- package/dist/agents/skills/cursor/owasp-xss-prevention/skill.yaml +3 -0
- package/dist/agents/skills/cursor/perf-browser-cache/SKILL.md +151 -0
- package/dist/agents/skills/cursor/perf-browser-cache/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-bundle-analysis/SKILL.md +217 -0
- package/dist/agents/skills/cursor/perf-bundle-analysis/skill.yaml +37 -0
- package/dist/agents/skills/cursor/perf-cache-invalidation/SKILL.md +228 -0
- package/dist/agents/skills/cursor/perf-cache-invalidation/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-cdn-cache-control/SKILL.md +198 -0
- package/dist/agents/skills/cursor/perf-cdn-cache-control/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-cdn-strategies/SKILL.md +161 -0
- package/dist/agents/skills/cursor/perf-cdn-strategies/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-client-side-rendering/SKILL.md +245 -0
- package/dist/agents/skills/cursor/perf-client-side-rendering/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-code-splitting/SKILL.md +185 -0
- package/dist/agents/skills/cursor/perf-code-splitting/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-compression/SKILL.md +163 -0
- package/dist/agents/skills/cursor/perf-compression/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-connection-costs/SKILL.md +165 -0
- package/dist/agents/skills/cursor/perf-connection-costs/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-connection-pooling/SKILL.md +250 -0
- package/dist/agents/skills/cursor/perf-connection-pooling/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-critical-rendering-path/SKILL.md +167 -0
- package/dist/agents/skills/cursor/perf-critical-rendering-path/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-cumulative-layout-shift/SKILL.md +180 -0
- package/dist/agents/skills/cursor/perf-cumulative-layout-shift/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-dom-parsing/SKILL.md +153 -0
- package/dist/agents/skills/cursor/perf-dom-parsing/skill.yaml +36 -0
- package/dist/agents/skills/cursor/perf-edge-rendering/SKILL.md +222 -0
- package/dist/agents/skills/cursor/perf-edge-rendering/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-event-loop/SKILL.md +203 -0
- package/dist/agents/skills/cursor/perf-event-loop/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-font-loading/SKILL.md +222 -0
- package/dist/agents/skills/cursor/perf-font-loading/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-garbage-collection/SKILL.md +192 -0
- package/dist/agents/skills/cursor/perf-garbage-collection/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-heap-profiling/SKILL.md +160 -0
- package/dist/agents/skills/cursor/perf-heap-profiling/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-http2-multiplexing/SKILL.md +163 -0
- package/dist/agents/skills/cursor/perf-http2-multiplexing/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-http3-quic/SKILL.md +165 -0
- package/dist/agents/skills/cursor/perf-http3-quic/skill.yaml +37 -0
- package/dist/agents/skills/cursor/perf-image-formats/SKILL.md +183 -0
- package/dist/agents/skills/cursor/perf-image-formats/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-index-strategies/SKILL.md +210 -0
- package/dist/agents/skills/cursor/perf-index-strategies/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-interaction-to-next-paint/SKILL.md +170 -0
- package/dist/agents/skills/cursor/perf-interaction-to-next-paint/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-largest-contentful-paint/SKILL.md +162 -0
- package/dist/agents/skills/cursor/perf-largest-contentful-paint/skill.yaml +41 -0
- package/dist/agents/skills/cursor/perf-layout-reflow/SKILL.md +187 -0
- package/dist/agents/skills/cursor/perf-layout-reflow/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-lazy-loading/SKILL.md +217 -0
- package/dist/agents/skills/cursor/perf-lazy-loading/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-lazy-loading-media/SKILL.md +233 -0
- package/dist/agents/skills/cursor/perf-lazy-loading-media/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-long-tasks/SKILL.md +194 -0
- package/dist/agents/skills/cursor/perf-long-tasks/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-memory-leaks/SKILL.md +218 -0
- package/dist/agents/skills/cursor/perf-memory-leaks/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-module-federation/SKILL.md +242 -0
- package/dist/agents/skills/cursor/perf-module-federation/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-n-plus-one/SKILL.md +237 -0
- package/dist/agents/skills/cursor/perf-n-plus-one/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-paint-compositing/SKILL.md +181 -0
- package/dist/agents/skills/cursor/perf-paint-compositing/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-performance-api/SKILL.md +249 -0
- package/dist/agents/skills/cursor/perf-performance-api/skill.yaml +41 -0
- package/dist/agents/skills/cursor/perf-profiling-methodology/SKILL.md +181 -0
- package/dist/agents/skills/cursor/perf-profiling-methodology/skill.yaml +44 -0
- package/dist/agents/skills/cursor/perf-query-optimization/SKILL.md +203 -0
- package/dist/agents/skills/cursor/perf-query-optimization/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-resource-hints/SKILL.md +167 -0
- package/dist/agents/skills/cursor/perf-resource-hints/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-responsive-images/SKILL.md +225 -0
- package/dist/agents/skills/cursor/perf-responsive-images/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-server-side-caching/SKILL.md +194 -0
- package/dist/agents/skills/cursor/perf-server-side-caching/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-server-side-rendering/SKILL.md +239 -0
- package/dist/agents/skills/cursor/perf-server-side-rendering/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-service-worker-caching/SKILL.md +247 -0
- package/dist/agents/skills/cursor/perf-service-worker-caching/skill.yaml +40 -0
- package/dist/agents/skills/cursor/perf-static-generation/SKILL.md +241 -0
- package/dist/agents/skills/cursor/perf-static-generation/skill.yaml +39 -0
- package/dist/agents/skills/cursor/perf-streaming-rendering/SKILL.md +242 -0
- package/dist/agents/skills/cursor/perf-streaming-rendering/skill.yaml +37 -0
- package/dist/agents/skills/cursor/perf-style-calculation/SKILL.md +166 -0
- package/dist/agents/skills/cursor/perf-style-calculation/skill.yaml +36 -0
- package/dist/agents/skills/cursor/perf-svg-optimization/SKILL.md +249 -0
- package/dist/agents/skills/cursor/perf-svg-optimization/skill.yaml +37 -0
- package/dist/agents/skills/cursor/perf-tree-shaking/SKILL.md +225 -0
- package/dist/agents/skills/cursor/perf-tree-shaking/skill.yaml +38 -0
- package/dist/agents/skills/cursor/perf-web-workers/SKILL.md +237 -0
- package/dist/agents/skills/cursor/perf-web-workers/skill.yaml +40 -0
- package/dist/agents/skills/cursor/prisma-client-queries/skill.yaml +1 -0
- package/dist/agents/skills/cursor/prisma-filtering-sorting/skill.yaml +1 -0
- package/dist/agents/skills/cursor/prisma-migrations/skill.yaml +3 -0
- package/dist/agents/skills/cursor/prisma-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/cursor/prisma-raw-queries/skill.yaml +1 -0
- package/dist/agents/skills/cursor/prisma-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/prisma-schema-design/skill.yaml +4 -0
- package/dist/agents/skills/cursor/prisma-seeding-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/prisma-soft-delete/skill.yaml +1 -0
- package/dist/agents/skills/cursor/prisma-transactions/skill.yaml +4 -0
- package/dist/agents/skills/cursor/prisma-type-generation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-2026/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-client-rendering/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-compound-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-concurrent-ui/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-container-presentational/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-hoc-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-hooks-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-islands-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-memoization-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-progressive-hydration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-render-props-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-server-components/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-server-rendering/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-state-management-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-static-import/skill.yaml +1 -0
- package/dist/agents/skills/cursor/react-suspense-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-entity-adapter/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-listener-middleware/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-persistence-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-rtk-optimistic/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-rtk-query-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-rtk-query-setup/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-selectors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-slice-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-store-setup/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-thunk-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/redux-typescript-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-chaos-testing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-dead-letter/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-fallback-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-health-checks/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-idempotency/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-rate-limiting/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-retry-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/resilience-timeout-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/security-abac-design/SKILL.md +154 -0
- package/dist/agents/skills/cursor/security-abac-design/skill.yaml +41 -0
- package/dist/agents/skills/cursor/security-asymmetric-encryption/SKILL.md +201 -0
- package/dist/agents/skills/cursor/security-asymmetric-encryption/skill.yaml +42 -0
- package/dist/agents/skills/cursor/security-attack-trees/SKILL.md +150 -0
- package/dist/agents/skills/cursor/security-attack-trees/skill.yaml +37 -0
- package/dist/agents/skills/cursor/security-audit-log-design/SKILL.md +227 -0
- package/dist/agents/skills/cursor/security-audit-log-design/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-authentication-flows/SKILL.md +168 -0
- package/dist/agents/skills/cursor/security-authentication-flows/skill.yaml +42 -0
- package/dist/agents/skills/cursor/security-capability-based-security/SKILL.md +158 -0
- package/dist/agents/skills/cursor/security-capability-based-security/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-certificate-management/SKILL.md +153 -0
- package/dist/agents/skills/cursor/security-certificate-management/skill.yaml +42 -0
- package/dist/agents/skills/cursor/security-ci-security-testing/SKILL.md +159 -0
- package/dist/agents/skills/cursor/security-ci-security-testing/skill.yaml +43 -0
- package/dist/agents/skills/cursor/security-code-signing/SKILL.md +155 -0
- package/dist/agents/skills/cursor/security-code-signing/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-compliance-logging/SKILL.md +183 -0
- package/dist/agents/skills/cursor/security-compliance-logging/skill.yaml +38 -0
- package/dist/agents/skills/cursor/security-credential-storage/SKILL.md +222 -0
- package/dist/agents/skills/cursor/security-credential-storage/skill.yaml +41 -0
- package/dist/agents/skills/cursor/security-cryptographic-randomness/SKILL.md +154 -0
- package/dist/agents/skills/cursor/security-cryptographic-randomness/skill.yaml +41 -0
- package/dist/agents/skills/cursor/security-dependency-auditing/SKILL.md +156 -0
- package/dist/agents/skills/cursor/security-dependency-auditing/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-deserialization-attacks/SKILL.md +180 -0
- package/dist/agents/skills/cursor/security-deserialization-attacks/skill.yaml +38 -0
- package/dist/agents/skills/cursor/security-environment-variable-risks/SKILL.md +153 -0
- package/dist/agents/skills/cursor/security-environment-variable-risks/skill.yaml +37 -0
- package/dist/agents/skills/cursor/security-forensics-fundamentals/SKILL.md +198 -0
- package/dist/agents/skills/cursor/security-forensics-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-hashing-fundamentals/SKILL.md +212 -0
- package/dist/agents/skills/cursor/security-hashing-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-hmac-signatures/SKILL.md +165 -0
- package/dist/agents/skills/cursor/security-hmac-signatures/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-hsts-preloading/SKILL.md +154 -0
- package/dist/agents/skills/cursor/security-hsts-preloading/skill.yaml +38 -0
- package/dist/agents/skills/cursor/security-identity-verification/SKILL.md +157 -0
- package/dist/agents/skills/cursor/security-identity-verification/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-incident-containment/SKILL.md +190 -0
- package/dist/agents/skills/cursor/security-incident-containment/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-injection-families/SKILL.md +235 -0
- package/dist/agents/skills/cursor/security-injection-families/skill.yaml +41 -0
- package/dist/agents/skills/cursor/security-log-correlation/SKILL.md +178 -0
- package/dist/agents/skills/cursor/security-log-correlation/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-memory-safety/SKILL.md +234 -0
- package/dist/agents/skills/cursor/security-memory-safety/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-mfa-design/SKILL.md +150 -0
- package/dist/agents/skills/cursor/security-mfa-design/skill.yaml +41 -0
- package/dist/agents/skills/cursor/security-microsegmentation/SKILL.md +154 -0
- package/dist/agents/skills/cursor/security-microsegmentation/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-mtls-design/SKILL.md +158 -0
- package/dist/agents/skills/cursor/security-mtls-design/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-penetration-testing/SKILL.md +166 -0
- package/dist/agents/skills/cursor/security-penetration-testing/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-post-incident-review/SKILL.md +205 -0
- package/dist/agents/skills/cursor/security-post-incident-review/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-race-conditions/SKILL.md +186 -0
- package/dist/agents/skills/cursor/security-race-conditions/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-rbac-design/SKILL.md +209 -0
- package/dist/agents/skills/cursor/security-rbac-design/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-rebac-design/SKILL.md +154 -0
- package/dist/agents/skills/cursor/security-rebac-design/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-sbom-provenance/SKILL.md +157 -0
- package/dist/agents/skills/cursor/security-sbom-provenance/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-secrets-lifecycle/SKILL.md +190 -0
- package/dist/agents/skills/cursor/security-secrets-lifecycle/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-security-champions/SKILL.md +165 -0
- package/dist/agents/skills/cursor/security-security-champions/skill.yaml +37 -0
- package/dist/agents/skills/cursor/security-session-management/SKILL.md +196 -0
- package/dist/agents/skills/cursor/security-session-management/skill.yaml +41 -0
- package/dist/agents/skills/cursor/security-shift-left-design/SKILL.md +153 -0
- package/dist/agents/skills/cursor/security-shift-left-design/skill.yaml +38 -0
- package/dist/agents/skills/cursor/security-symmetric-encryption/SKILL.md +176 -0
- package/dist/agents/skills/cursor/security-symmetric-encryption/skill.yaml +41 -0
- package/dist/agents/skills/cursor/security-threat-modeling-process/SKILL.md +150 -0
- package/dist/agents/skills/cursor/security-threat-modeling-process/skill.yaml +38 -0
- package/dist/agents/skills/cursor/security-threat-modeling-stride/SKILL.md +150 -0
- package/dist/agents/skills/cursor/security-threat-modeling-stride/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-tls-fundamentals/SKILL.md +186 -0
- package/dist/agents/skills/cursor/security-tls-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/cursor/security-trust-boundaries/SKILL.md +152 -0
- package/dist/agents/skills/cursor/security-trust-boundaries/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-vault-patterns/SKILL.md +155 -0
- package/dist/agents/skills/cursor/security-vault-patterns/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-vulnerability-disclosure/SKILL.md +207 -0
- package/dist/agents/skills/cursor/security-vulnerability-disclosure/skill.yaml +39 -0
- package/dist/agents/skills/cursor/security-zero-trust-principles/SKILL.md +229 -0
- package/dist/agents/skills/cursor/security-zero-trust-principles/skill.yaml +40 -0
- package/dist/agents/skills/cursor/state-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-jotai-atoms/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-selection-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-server-client-sync/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-zustand-devtools/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-zustand-immer/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-zustand-persist/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-zustand-react/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-zustand-slices/skill.yaml +1 -0
- package/dist/agents/skills/cursor/state-zustand-store/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-adapter-config/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-component-composition/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-error-pages/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-form-actions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-load-functions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/cursor/svelte-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-runes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-server-hooks/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-state-management/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-stores-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/svelte-transitions-animations/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-cache-management/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-dependent-queries/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-devtools/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-infinite-queries/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-mutation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-optimistic-updates/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-prefetching/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-query-invalidation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-query-keys/skill.yaml +1 -0
- package/dist/agents/skills/cursor/tanstack-suspense-mode/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-accessibility-testing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-component-react/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-component-svelte/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-contract-testing/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-coverage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-e2e-strategy/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-factory-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-integration-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-mock-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-msw-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-performance-testing/skill.yaml +5 -0
- package/dist/agents/skills/cursor/test-playwright-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-playwright-setup/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-property-based/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-snapshot-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-tdd-workflow/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-unit-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/test-vitest-config/skill.yaml +1 -0
- package/dist/agents/skills/cursor/trpc-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/trpc-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/cursor/trpc-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/cursor/trpc-input-validation/SKILL.md +1 -0
- package/dist/agents/skills/cursor/trpc-input-validation/skill.yaml +2 -0
- package/dist/agents/skills/cursor/trpc-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/trpc-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/trpc-react-query-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/trpc-router-composition/SKILL.md +1 -0
- package/dist/agents/skills/cursor/trpc-router-composition/skill.yaml +3 -0
- package/dist/agents/skills/cursor/trpc-subscription-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-async-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-branded-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-class-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-conditional-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-config-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-declaration-merging/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-decorator-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-discriminated-unions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-error-handling-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-generics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-mapped-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-module-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-performance-patterns/skill.yaml +5 -0
- package/dist/agents/skills/cursor/ts-satisfies-operator/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-strict-mode/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-template-literal-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-testing-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-type-guards/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-utility-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ts-zod-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/ux-active-voice/SKILL.md +150 -0
- package/dist/agents/skills/cursor/ux-active-voice/skill.yaml +32 -0
- package/dist/agents/skills/cursor/ux-button-cta-copy/SKILL.md +159 -0
- package/dist/agents/skills/cursor/ux-button-cta-copy/skill.yaml +34 -0
- package/dist/agents/skills/cursor/ux-confirmation-dialogs/SKILL.md +156 -0
- package/dist/agents/skills/cursor/ux-confirmation-dialogs/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-content-hierarchy/SKILL.md +150 -0
- package/dist/agents/skills/cursor/ux-content-hierarchy/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-data-table-copy/SKILL.md +154 -0
- package/dist/agents/skills/cursor/ux-data-table-copy/skill.yaml +34 -0
- package/dist/agents/skills/cursor/ux-destructive-action-copy/SKILL.md +152 -0
- package/dist/agents/skills/cursor/ux-destructive-action-copy/skill.yaml +34 -0
- package/dist/agents/skills/cursor/ux-empty-states/SKILL.md +155 -0
- package/dist/agents/skills/cursor/ux-empty-states/skill.yaml +36 -0
- package/dist/agents/skills/cursor/ux-error-messages/SKILL.md +159 -0
- package/dist/agents/skills/cursor/ux-error-messages/skill.yaml +35 -0
- package/dist/agents/skills/cursor/ux-error-severity/SKILL.md +155 -0
- package/dist/agents/skills/cursor/ux-error-severity/skill.yaml +35 -0
- package/dist/agents/skills/cursor/ux-form-labels/SKILL.md +159 -0
- package/dist/agents/skills/cursor/ux-form-labels/skill.yaml +36 -0
- package/dist/agents/skills/cursor/ux-inclusive-language/SKILL.md +161 -0
- package/dist/agents/skills/cursor/ux-inclusive-language/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-internationalization-writing/SKILL.md +196 -0
- package/dist/agents/skills/cursor/ux-internationalization-writing/skill.yaml +35 -0
- package/dist/agents/skills/cursor/ux-loading-states/SKILL.md +162 -0
- package/dist/agents/skills/cursor/ux-loading-states/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-microcopy-principles/SKILL.md +152 -0
- package/dist/agents/skills/cursor/ux-microcopy-principles/skill.yaml +37 -0
- package/dist/agents/skills/cursor/ux-navigation-labels/SKILL.md +163 -0
- package/dist/agents/skills/cursor/ux-navigation-labels/skill.yaml +35 -0
- package/dist/agents/skills/cursor/ux-notification-copy/SKILL.md +150 -0
- package/dist/agents/skills/cursor/ux-notification-copy/skill.yaml +35 -0
- package/dist/agents/skills/cursor/ux-onboarding-copy/SKILL.md +156 -0
- package/dist/agents/skills/cursor/ux-onboarding-copy/skill.yaml +35 -0
- package/dist/agents/skills/cursor/ux-permission-access-copy/SKILL.md +150 -0
- package/dist/agents/skills/cursor/ux-permission-access-copy/skill.yaml +34 -0
- package/dist/agents/skills/cursor/ux-plain-language/SKILL.md +157 -0
- package/dist/agents/skills/cursor/ux-plain-language/skill.yaml +34 -0
- package/dist/agents/skills/cursor/ux-search-copy/SKILL.md +154 -0
- package/dist/agents/skills/cursor/ux-search-copy/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-settings-preferences/SKILL.md +152 -0
- package/dist/agents/skills/cursor/ux-settings-preferences/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-success-feedback/SKILL.md +163 -0
- package/dist/agents/skills/cursor/ux-success-feedback/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-tooltip-contextual-help/SKILL.md +163 -0
- package/dist/agents/skills/cursor/ux-tooltip-contextual-help/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-voice-tone/SKILL.md +150 -0
- package/dist/agents/skills/cursor/ux-voice-tone/skill.yaml +33 -0
- package/dist/agents/skills/cursor/ux-writing-for-scanning/SKILL.md +150 -0
- package/dist/agents/skills/cursor/ux-writing-for-scanning/skill.yaml +35 -0
- package/dist/agents/skills/cursor/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-async-components/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-component-events/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-pinia-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-provide-inject/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-reactive-refs/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-renderless-components/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-slots-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-teleport-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/vue-watchers-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-actor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-guards-actions/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-history-states/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-invoke-pattern/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-machine-definition/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-parallel-states/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-react-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-typegen/skill.yaml +1 -0
- package/dist/agents/skills/cursor/xstate-visualization/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-array-validation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-async-validation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-infer-types/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-object-patterns/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-schema-definition/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-string-validation/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-transform-refine/skill.yaml +1 -0
- package/dist/agents/skills/cursor/zod-union-discriminated/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-aria-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-color-contrast/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-form-patterns/skill.yaml +2 -0
- package/dist/agents/skills/gemini-cli/a11y-image-text-alt/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-keyboard-navigation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-modal-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-motion-animation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-screen-reader-testing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-semantic-html/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/a11y-testing-automation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-http-interceptors/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-lazy-loading/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/angular-pipe-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-reactive-forms/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-routing-guards/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-rxjs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-schematics/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-service-di/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-signals-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-standalone-components/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/angular-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/api-api-keys/SKILL.md +135 -0
- package/dist/agents/skills/gemini-cli/api-api-keys/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/api-authentication-patterns/SKILL.md +117 -0
- package/dist/agents/skills/gemini-cli/api-authentication-patterns/skill.yaml +44 -0
- package/dist/agents/skills/gemini-cli/api-backward-compatibility/SKILL.md +170 -0
- package/dist/agents/skills/gemini-cli/api-backward-compatibility/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-bulk-operations/SKILL.md +198 -0
- package/dist/agents/skills/gemini-cli/api-bulk-operations/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-conditional-requests/SKILL.md +233 -0
- package/dist/agents/skills/gemini-cli/api-conditional-requests/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/api-content-negotiation/SKILL.md +194 -0
- package/dist/agents/skills/gemini-cli/api-content-negotiation/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-contract-testing/SKILL.md +222 -0
- package/dist/agents/skills/gemini-cli/api-contract-testing/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/api-deprecation-strategy/SKILL.md +156 -0
- package/dist/agents/skills/gemini-cli/api-deprecation-strategy/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-error-contracts/SKILL.md +149 -0
- package/dist/agents/skills/gemini-cli/api-error-contracts/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-field-selection/SKILL.md +193 -0
- package/dist/agents/skills/gemini-cli/api-field-selection/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-filtering-sorting/SKILL.md +170 -0
- package/dist/agents/skills/gemini-cli/api-filtering-sorting/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-hateoas/SKILL.md +212 -0
- package/dist/agents/skills/gemini-cli/api-hateoas/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-http-caching/SKILL.md +188 -0
- package/dist/agents/skills/gemini-cli/api-http-caching/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/api-http-methods/SKILL.md +185 -0
- package/dist/agents/skills/gemini-cli/api-http-methods/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/api-idempotency-keys/SKILL.md +176 -0
- package/dist/agents/skills/gemini-cli/api-idempotency-keys/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-long-running-operations/SKILL.md +209 -0
- package/dist/agents/skills/gemini-cli/api-long-running-operations/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-nested-vs-flat/SKILL.md +173 -0
- package/dist/agents/skills/gemini-cli/api-nested-vs-flat/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-oauth2-flows/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/api-oauth2-flows/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/api-openapi-design/SKILL.md +260 -0
- package/dist/agents/skills/gemini-cli/api-openapi-design/skill.yaml +44 -0
- package/dist/agents/skills/gemini-cli/api-pagination-cursor/SKILL.md +159 -0
- package/dist/agents/skills/gemini-cli/api-pagination-cursor/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-pagination-keyset/SKILL.md +167 -0
- package/dist/agents/skills/gemini-cli/api-pagination-keyset/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-pagination-offset/SKILL.md +135 -0
- package/dist/agents/skills/gemini-cli/api-pagination-offset/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-problem-details-rfc/SKILL.md +164 -0
- package/dist/agents/skills/gemini-cli/api-problem-details-rfc/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/api-rate-limit-headers/SKILL.md +144 -0
- package/dist/agents/skills/gemini-cli/api-rate-limit-headers/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-rate-limiting/SKILL.md +131 -0
- package/dist/agents/skills/gemini-cli/api-rate-limiting/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/api-resource-granularity/SKILL.md +165 -0
- package/dist/agents/skills/gemini-cli/api-resource-granularity/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-resource-modeling/SKILL.md +155 -0
- package/dist/agents/skills/gemini-cli/api-resource-modeling/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-rest-maturity-model/SKILL.md +215 -0
- package/dist/agents/skills/gemini-cli/api-rest-maturity-model/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-retry-guidance/SKILL.md +168 -0
- package/dist/agents/skills/gemini-cli/api-retry-guidance/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/api-sdk-ergonomics/SKILL.md +194 -0
- package/dist/agents/skills/gemini-cli/api-sdk-ergonomics/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/api-status-codes/SKILL.md +196 -0
- package/dist/agents/skills/gemini-cli/api-status-codes/skill.yaml +46 -0
- package/dist/agents/skills/gemini-cli/api-validation-errors/SKILL.md +174 -0
- package/dist/agents/skills/gemini-cli/api-validation-errors/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/api-versioning-header/SKILL.md +177 -0
- package/dist/agents/skills/gemini-cli/api-versioning-header/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/api-versioning-url/SKILL.md +128 -0
- package/dist/agents/skills/gemini-cli/api-versioning-url/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/api-webhook-design/SKILL.md +165 -0
- package/dist/agents/skills/gemini-cli/api-webhook-design/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/api-webhook-security/SKILL.md +176 -0
- package/dist/agents/skills/gemini-cli/api-webhook-security/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/astro-component-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-content-collections/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-integration-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-islands-architecture/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-multi-framework/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-server-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-ssr-hybrid/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/astro-view-transitions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-animation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-component-variants/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-css-modules/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-custom-components/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-dark-mode/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-design-tokens/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-headless-ui/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-layout-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/css-responsive-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-tailwind-merge/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/css-tailwind-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/db-acid-in-practice/SKILL.md +215 -0
- package/dist/agents/skills/gemini-cli/db-acid-in-practice/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-acid-properties/SKILL.md +190 -0
- package/dist/agents/skills/gemini-cli/db-acid-properties/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-adjacency-list/SKILL.md +199 -0
- package/dist/agents/skills/gemini-cli/db-adjacency-list/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/db-audit-trail/SKILL.md +244 -0
- package/dist/agents/skills/gemini-cli/db-audit-trail/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-btree-index/SKILL.md +182 -0
- package/dist/agents/skills/gemini-cli/db-btree-index/skill.yaml +44 -0
- package/dist/agents/skills/gemini-cli/db-cap-theorem/SKILL.md +156 -0
- package/dist/agents/skills/gemini-cli/db-cap-theorem/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-closure-table/SKILL.md +197 -0
- package/dist/agents/skills/gemini-cli/db-closure-table/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-composite-index/SKILL.md +199 -0
- package/dist/agents/skills/gemini-cli/db-composite-index/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-connection-pooling/SKILL.md +196 -0
- package/dist/agents/skills/gemini-cli/db-connection-pooling/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/db-connection-sizing/SKILL.md +236 -0
- package/dist/agents/skills/gemini-cli/db-connection-sizing/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-covering-index/SKILL.md +203 -0
- package/dist/agents/skills/gemini-cli/db-covering-index/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/db-deadlock-prevention/SKILL.md +204 -0
- package/dist/agents/skills/gemini-cli/db-deadlock-prevention/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-denormalization/SKILL.md +176 -0
- package/dist/agents/skills/gemini-cli/db-denormalization/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-document-in-relational/SKILL.md +225 -0
- package/dist/agents/skills/gemini-cli/db-document-in-relational/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/db-entity-attribute-value/SKILL.md +186 -0
- package/dist/agents/skills/gemini-cli/db-entity-attribute-value/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/db-eventual-consistency/SKILL.md +226 -0
- package/dist/agents/skills/gemini-cli/db-eventual-consistency/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-expand-contract/SKILL.md +199 -0
- package/dist/agents/skills/gemini-cli/db-expand-contract/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/db-explain-reading/SKILL.md +213 -0
- package/dist/agents/skills/gemini-cli/db-explain-reading/skill.yaml +44 -0
- package/dist/agents/skills/gemini-cli/db-expression-index/SKILL.md +211 -0
- package/dist/agents/skills/gemini-cli/db-expression-index/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/db-first-normal-form/SKILL.md +190 -0
- package/dist/agents/skills/gemini-cli/db-first-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-graph-in-relational/SKILL.md +212 -0
- package/dist/agents/skills/gemini-cli/db-graph-in-relational/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-hash-index/SKILL.md +176 -0
- package/dist/agents/skills/gemini-cli/db-hash-index/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/db-hierarchical-data/SKILL.md +194 -0
- package/dist/agents/skills/gemini-cli/db-hierarchical-data/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-horizontal-sharding/SKILL.md +228 -0
- package/dist/agents/skills/gemini-cli/db-horizontal-sharding/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/db-isolation-levels/SKILL.md +158 -0
- package/dist/agents/skills/gemini-cli/db-isolation-levels/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/db-isolation-selection/SKILL.md +160 -0
- package/dist/agents/skills/gemini-cli/db-isolation-selection/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-migration-rollback/SKILL.md +223 -0
- package/dist/agents/skills/gemini-cli/db-migration-rollback/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/db-mvcc/SKILL.md +191 -0
- package/dist/agents/skills/gemini-cli/db-mvcc/skill.yaml +45 -0
- package/dist/agents/skills/gemini-cli/db-nested-sets/SKILL.md +171 -0
- package/dist/agents/skills/gemini-cli/db-nested-sets/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-optimistic-locking/SKILL.md +151 -0
- package/dist/agents/skills/gemini-cli/db-optimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/gemini-cli/db-partial-index/SKILL.md +196 -0
- package/dist/agents/skills/gemini-cli/db-partial-index/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/db-pessimistic-locking/SKILL.md +158 -0
- package/dist/agents/skills/gemini-cli/db-pessimistic-locking/skill.yaml +44 -0
- package/dist/agents/skills/gemini-cli/db-polymorphic-associations/SKILL.md +187 -0
- package/dist/agents/skills/gemini-cli/db-polymorphic-associations/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/db-query-rewriting/SKILL.md +249 -0
- package/dist/agents/skills/gemini-cli/db-query-rewriting/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/db-query-statistics/SKILL.md +210 -0
- package/dist/agents/skills/gemini-cli/db-query-statistics/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-read-phenomena/SKILL.md +205 -0
- package/dist/agents/skills/gemini-cli/db-read-phenomena/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/db-scan-types/SKILL.md +248 -0
- package/dist/agents/skills/gemini-cli/db-scan-types/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-second-normal-form/SKILL.md +183 -0
- package/dist/agents/skills/gemini-cli/db-second-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-table-partitioning/SKILL.md +229 -0
- package/dist/agents/skills/gemini-cli/db-table-partitioning/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/db-temporal-data/SKILL.md +194 -0
- package/dist/agents/skills/gemini-cli/db-temporal-data/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-third-normal-form/SKILL.md +210 -0
- package/dist/agents/skills/gemini-cli/db-third-normal-form/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/db-time-series/SKILL.md +196 -0
- package/dist/agents/skills/gemini-cli/db-time-series/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/db-vertical-partitioning/SKILL.md +249 -0
- package/dist/agents/skills/gemini-cli/db-vertical-partitioning/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/db-zero-downtime-migration/SKILL.md +199 -0
- package/dist/agents/skills/gemini-cli/db-zero-downtime-migration/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/design-affordances/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-alignment/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-apple-hig/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-atomic-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-brand-consistency/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-color-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-color-harmony/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-color-psychology/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-component-anatomy/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-consistency/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-content-density/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-contrast-ratio/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-dark-mode-color/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-data-viz-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-design-audit/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-design-critique/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-design-documentation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-design-governance/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-elevation-shadow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-empty-error-states/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/design-feedback-patterns/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/design-fluent-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-font-pairing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-form-ux/skill.yaml +2 -0
- package/dist/agents/skills/gemini-cli/design-gestalt-closure-continuity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-gestalt-common-fate/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-gestalt-figure-ground/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-gestalt-proximity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-gestalt-similarity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-grid-systems/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-i18n-design/skill.yaml +2 -0
- package/dist/agents/skills/gemini-cli/design-iconography/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-illustration-style/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-imagery-photography/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-information-architecture/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/design-loading-patterns/skill.yaml +2 -0
- package/dist/agents/skills/gemini-cli/design-material-design-3/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-micro-interactions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-motion-principles/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-naming-conventions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-navigation-ux/skill.yaml +2 -0
- package/dist/agents/skills/gemini-cli/design-palette-construction/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-parallax-scroll/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-readability/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/design-responsive-strategy/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-responsive-type/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-state-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-token-architecture/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-transitions-timing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-type-scale/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-typographic-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-typography-fundamentals/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-visual-hierarchy/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-web-fonts/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/design-whitespace/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/drizzle-filtering-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/drizzle-migrations/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/drizzle-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/gemini-cli/drizzle-query-builder/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/drizzle-raw-sql/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/drizzle-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/drizzle-schema-definition/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/drizzle-transactions/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/drizzle-with-nextjs/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-event-schema/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-event-storming/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-idempotency/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/events-idempotency/skill.yaml +2 -0
- package/dist/agents/skills/gemini-cli/events-kafka-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-message-queue/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-pubsub-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-redis-pubsub/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-saga-choreography/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-sse-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/events-webhooks-pattern/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/events-webhooks-pattern/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/events-websocket-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-abstract-factory/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-builder-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-chain-of-responsibility/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-factory-method/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-mediator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-memento-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-null-object/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-singleton/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-template-method/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/gof-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/graphql-apollo-server/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/graphql-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/graphql-auth-patterns/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/graphql-client-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/graphql-codegen-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/graphql-dataloader-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/graphql-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/graphql-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/graphql-federation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/graphql-pagination-patterns/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/graphql-pagination-patterns/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/graphql-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/graphql-resolver-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/graphql-schema-design/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/graphql-schema-design/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/graphql-subscriptions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-auth/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +171 -822
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +145 -195
- package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +267 -436
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +7 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +180 -271
- package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +13 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +142 -322
- package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +7 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-router/SKILL.md +69 -123
- package/dist/agents/skills/gemini-cli/harness-router/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +3 -3
- package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +7 -0
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +483 -667
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-supply-chain-audit/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +13 -0
- package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +135 -221
- package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-abstract-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-adapter-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-bridge-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-chain-of-responsibility-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-command-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-composite-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-constructor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-decorator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-facade-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-factory-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-flyweight-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-iterator-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-mediator-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-mixin-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-observer-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-prototype-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-proxy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-revealing-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-singleton-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-state-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-static-import/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-strategy-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-template-method-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/js-visitor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-api-gateway/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-config-server/SKILL.md +1 -1
- package/dist/agents/skills/gemini-cli/microservices-config-server/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-cqrs-pattern/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/microservices-decomposition/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-distributed-tracing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-event-sourcing/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/microservices-health-check/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-outbox-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-saga-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-service-discovery/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-sidecar-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/microservices-strangler-fig/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-animation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-deployment-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-expo-setup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-flatlist-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-gesture-handling/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-native-modules/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-navigation-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-network-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/mobile-push-notifications/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-storage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/mobile-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-config-module/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-controller-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-dependency-injection/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-dto-validation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-event-driven/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-exception-filters/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-graphql-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-guards-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-interceptors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-microservices/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-module-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-pipes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-service-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-swagger-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nestjs-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-app-router/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-auth-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-caching-strategies/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-data-fetching/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-deployment-optimization/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-error-boundaries/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-image-optimization/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-metadata-api/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-monorepo-setup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-parallel-intercepting-routes/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-route-handlers/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-server-actions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-server-components/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-static-generation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-streaming-suspense/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/next-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-buffer-encoding/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-child-process/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-crypto-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-environment-config/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-esm-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-event-emitter/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-express-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-fastify-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-http-server/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-path-fs-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-performance-profiling/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/node-streams-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/node-worker-threads/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-auto-imports/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-deployment-config/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-layouts-pages/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-modules-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-plugins-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-seo-metadata/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-server-routes/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/nuxt-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-context-propagation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-custom-instrumentation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-error-tracking/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-exporter-config/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-logging-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-metrics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-nestjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-performance-insights/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/otel-sampling-strategies/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-sdk-setup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/otel-tracing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/owasp-auth-patterns/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/owasp-auth-patterns/skill.yaml +8 -0
- package/dist/agents/skills/gemini-cli/owasp-cryptography/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/owasp-csrf-protection/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/owasp-dependency-security/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/owasp-file-upload-security/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/owasp-idor-prevention/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/owasp-injection-prevention/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/owasp-logging-monitoring/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/owasp-rate-limiting/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/owasp-rate-limiting/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/owasp-secrets-management/SKILL.md +2 -1
- package/dist/agents/skills/gemini-cli/owasp-secrets-management/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/owasp-security-headers/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/owasp-xss-prevention/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/perf-browser-cache/SKILL.md +151 -0
- package/dist/agents/skills/gemini-cli/perf-browser-cache/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-bundle-analysis/SKILL.md +217 -0
- package/dist/agents/skills/gemini-cli/perf-bundle-analysis/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/perf-cache-invalidation/SKILL.md +228 -0
- package/dist/agents/skills/gemini-cli/perf-cache-invalidation/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-cdn-cache-control/SKILL.md +198 -0
- package/dist/agents/skills/gemini-cli/perf-cdn-cache-control/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-cdn-strategies/SKILL.md +161 -0
- package/dist/agents/skills/gemini-cli/perf-cdn-strategies/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-client-side-rendering/SKILL.md +245 -0
- package/dist/agents/skills/gemini-cli/perf-client-side-rendering/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-code-splitting/SKILL.md +185 -0
- package/dist/agents/skills/gemini-cli/perf-code-splitting/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-compression/SKILL.md +163 -0
- package/dist/agents/skills/gemini-cli/perf-compression/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-connection-costs/SKILL.md +165 -0
- package/dist/agents/skills/gemini-cli/perf-connection-costs/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-connection-pooling/SKILL.md +250 -0
- package/dist/agents/skills/gemini-cli/perf-connection-pooling/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-critical-rendering-path/SKILL.md +167 -0
- package/dist/agents/skills/gemini-cli/perf-critical-rendering-path/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-cumulative-layout-shift/SKILL.md +180 -0
- package/dist/agents/skills/gemini-cli/perf-cumulative-layout-shift/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-dom-parsing/SKILL.md +153 -0
- package/dist/agents/skills/gemini-cli/perf-dom-parsing/skill.yaml +36 -0
- package/dist/agents/skills/gemini-cli/perf-edge-rendering/SKILL.md +222 -0
- package/dist/agents/skills/gemini-cli/perf-edge-rendering/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-event-loop/SKILL.md +203 -0
- package/dist/agents/skills/gemini-cli/perf-event-loop/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-font-loading/SKILL.md +222 -0
- package/dist/agents/skills/gemini-cli/perf-font-loading/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-garbage-collection/SKILL.md +192 -0
- package/dist/agents/skills/gemini-cli/perf-garbage-collection/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-heap-profiling/SKILL.md +160 -0
- package/dist/agents/skills/gemini-cli/perf-heap-profiling/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-http2-multiplexing/SKILL.md +163 -0
- package/dist/agents/skills/gemini-cli/perf-http2-multiplexing/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-http3-quic/SKILL.md +165 -0
- package/dist/agents/skills/gemini-cli/perf-http3-quic/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/perf-image-formats/SKILL.md +183 -0
- package/dist/agents/skills/gemini-cli/perf-image-formats/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-index-strategies/SKILL.md +210 -0
- package/dist/agents/skills/gemini-cli/perf-index-strategies/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-interaction-to-next-paint/SKILL.md +170 -0
- package/dist/agents/skills/gemini-cli/perf-interaction-to-next-paint/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-largest-contentful-paint/SKILL.md +162 -0
- package/dist/agents/skills/gemini-cli/perf-largest-contentful-paint/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/perf-layout-reflow/SKILL.md +187 -0
- package/dist/agents/skills/gemini-cli/perf-layout-reflow/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-lazy-loading/SKILL.md +217 -0
- package/dist/agents/skills/gemini-cli/perf-lazy-loading/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-lazy-loading-media/SKILL.md +233 -0
- package/dist/agents/skills/gemini-cli/perf-lazy-loading-media/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-long-tasks/SKILL.md +194 -0
- package/dist/agents/skills/gemini-cli/perf-long-tasks/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-memory-leaks/SKILL.md +218 -0
- package/dist/agents/skills/gemini-cli/perf-memory-leaks/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-module-federation/SKILL.md +242 -0
- package/dist/agents/skills/gemini-cli/perf-module-federation/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-n-plus-one/SKILL.md +237 -0
- package/dist/agents/skills/gemini-cli/perf-n-plus-one/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-paint-compositing/SKILL.md +181 -0
- package/dist/agents/skills/gemini-cli/perf-paint-compositing/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-performance-api/SKILL.md +249 -0
- package/dist/agents/skills/gemini-cli/perf-performance-api/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/perf-profiling-methodology/SKILL.md +181 -0
- package/dist/agents/skills/gemini-cli/perf-profiling-methodology/skill.yaml +44 -0
- package/dist/agents/skills/gemini-cli/perf-query-optimization/SKILL.md +203 -0
- package/dist/agents/skills/gemini-cli/perf-query-optimization/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-resource-hints/SKILL.md +167 -0
- package/dist/agents/skills/gemini-cli/perf-resource-hints/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-responsive-images/SKILL.md +225 -0
- package/dist/agents/skills/gemini-cli/perf-responsive-images/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-server-side-caching/SKILL.md +194 -0
- package/dist/agents/skills/gemini-cli/perf-server-side-caching/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-server-side-rendering/SKILL.md +239 -0
- package/dist/agents/skills/gemini-cli/perf-server-side-rendering/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-service-worker-caching/SKILL.md +247 -0
- package/dist/agents/skills/gemini-cli/perf-service-worker-caching/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/perf-static-generation/SKILL.md +241 -0
- package/dist/agents/skills/gemini-cli/perf-static-generation/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/perf-streaming-rendering/SKILL.md +242 -0
- package/dist/agents/skills/gemini-cli/perf-streaming-rendering/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/perf-style-calculation/SKILL.md +166 -0
- package/dist/agents/skills/gemini-cli/perf-style-calculation/skill.yaml +36 -0
- package/dist/agents/skills/gemini-cli/perf-svg-optimization/SKILL.md +249 -0
- package/dist/agents/skills/gemini-cli/perf-svg-optimization/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/perf-tree-shaking/SKILL.md +225 -0
- package/dist/agents/skills/gemini-cli/perf-tree-shaking/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/perf-web-workers/SKILL.md +237 -0
- package/dist/agents/skills/gemini-cli/perf-web-workers/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/prisma-client-queries/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/prisma-filtering-sorting/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/prisma-migrations/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/prisma-performance-patterns/skill.yaml +8 -0
- package/dist/agents/skills/gemini-cli/prisma-raw-queries/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/prisma-relations-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/prisma-schema-design/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/prisma-seeding-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/prisma-soft-delete/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/prisma-transactions/skill.yaml +4 -0
- package/dist/agents/skills/gemini-cli/prisma-type-generation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-2026/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-client-rendering/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-compound-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-concurrent-ui/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-container-presentational/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-dynamic-import/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-hoc-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-hooks-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-islands-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-memoization-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-progressive-hydration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-provider-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-render-props-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-server-components/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-server-rendering/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-state-management-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-static-import/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/react-suspense-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-entity-adapter/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-listener-middleware/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-persistence-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-rtk-optimistic/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-rtk-query-endpoints/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-rtk-query-setup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-selectors-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-slice-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-store-setup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-thunk-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/redux-typescript-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-bulkhead-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-chaos-testing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-circuit-breaker/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-dead-letter/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-fallback-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-health-checks/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-idempotency/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-rate-limiting/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-retry-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/resilience-timeout-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/security-abac-design/SKILL.md +154 -0
- package/dist/agents/skills/gemini-cli/security-abac-design/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/security-asymmetric-encryption/SKILL.md +201 -0
- package/dist/agents/skills/gemini-cli/security-asymmetric-encryption/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/security-attack-trees/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/security-attack-trees/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/security-audit-log-design/SKILL.md +227 -0
- package/dist/agents/skills/gemini-cli/security-audit-log-design/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-authentication-flows/SKILL.md +168 -0
- package/dist/agents/skills/gemini-cli/security-authentication-flows/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/security-capability-based-security/SKILL.md +158 -0
- package/dist/agents/skills/gemini-cli/security-capability-based-security/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-certificate-management/SKILL.md +153 -0
- package/dist/agents/skills/gemini-cli/security-certificate-management/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/security-ci-security-testing/SKILL.md +159 -0
- package/dist/agents/skills/gemini-cli/security-ci-security-testing/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/security-code-signing/SKILL.md +155 -0
- package/dist/agents/skills/gemini-cli/security-code-signing/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-compliance-logging/SKILL.md +183 -0
- package/dist/agents/skills/gemini-cli/security-compliance-logging/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/security-credential-storage/SKILL.md +222 -0
- package/dist/agents/skills/gemini-cli/security-credential-storage/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/security-cryptographic-randomness/SKILL.md +154 -0
- package/dist/agents/skills/gemini-cli/security-cryptographic-randomness/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/security-dependency-auditing/SKILL.md +156 -0
- package/dist/agents/skills/gemini-cli/security-dependency-auditing/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-deserialization-attacks/SKILL.md +180 -0
- package/dist/agents/skills/gemini-cli/security-deserialization-attacks/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/security-environment-variable-risks/SKILL.md +153 -0
- package/dist/agents/skills/gemini-cli/security-environment-variable-risks/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/security-forensics-fundamentals/SKILL.md +198 -0
- package/dist/agents/skills/gemini-cli/security-forensics-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-hashing-fundamentals/SKILL.md +212 -0
- package/dist/agents/skills/gemini-cli/security-hashing-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-hmac-signatures/SKILL.md +165 -0
- package/dist/agents/skills/gemini-cli/security-hmac-signatures/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-hsts-preloading/SKILL.md +154 -0
- package/dist/agents/skills/gemini-cli/security-hsts-preloading/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/security-identity-verification/SKILL.md +157 -0
- package/dist/agents/skills/gemini-cli/security-identity-verification/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-incident-containment/SKILL.md +190 -0
- package/dist/agents/skills/gemini-cli/security-incident-containment/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-injection-families/SKILL.md +235 -0
- package/dist/agents/skills/gemini-cli/security-injection-families/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/security-log-correlation/SKILL.md +178 -0
- package/dist/agents/skills/gemini-cli/security-log-correlation/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-memory-safety/SKILL.md +234 -0
- package/dist/agents/skills/gemini-cli/security-memory-safety/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-mfa-design/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/security-mfa-design/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/security-microsegmentation/SKILL.md +154 -0
- package/dist/agents/skills/gemini-cli/security-microsegmentation/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-mtls-design/SKILL.md +158 -0
- package/dist/agents/skills/gemini-cli/security-mtls-design/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-penetration-testing/SKILL.md +166 -0
- package/dist/agents/skills/gemini-cli/security-penetration-testing/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-post-incident-review/SKILL.md +205 -0
- package/dist/agents/skills/gemini-cli/security-post-incident-review/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-race-conditions/SKILL.md +186 -0
- package/dist/agents/skills/gemini-cli/security-race-conditions/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-rbac-design/SKILL.md +209 -0
- package/dist/agents/skills/gemini-cli/security-rbac-design/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-rebac-design/SKILL.md +154 -0
- package/dist/agents/skills/gemini-cli/security-rebac-design/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-sbom-provenance/SKILL.md +157 -0
- package/dist/agents/skills/gemini-cli/security-sbom-provenance/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-secrets-lifecycle/SKILL.md +190 -0
- package/dist/agents/skills/gemini-cli/security-secrets-lifecycle/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-security-champions/SKILL.md +165 -0
- package/dist/agents/skills/gemini-cli/security-security-champions/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/security-session-management/SKILL.md +196 -0
- package/dist/agents/skills/gemini-cli/security-session-management/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/security-shift-left-design/SKILL.md +153 -0
- package/dist/agents/skills/gemini-cli/security-shift-left-design/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/security-symmetric-encryption/SKILL.md +176 -0
- package/dist/agents/skills/gemini-cli/security-symmetric-encryption/skill.yaml +41 -0
- package/dist/agents/skills/gemini-cli/security-threat-modeling-process/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/security-threat-modeling-process/skill.yaml +38 -0
- package/dist/agents/skills/gemini-cli/security-threat-modeling-stride/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/security-threat-modeling-stride/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-tls-fundamentals/SKILL.md +186 -0
- package/dist/agents/skills/gemini-cli/security-tls-fundamentals/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/security-trust-boundaries/SKILL.md +152 -0
- package/dist/agents/skills/gemini-cli/security-trust-boundaries/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-vault-patterns/SKILL.md +155 -0
- package/dist/agents/skills/gemini-cli/security-vault-patterns/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-vulnerability-disclosure/SKILL.md +207 -0
- package/dist/agents/skills/gemini-cli/security-vulnerability-disclosure/skill.yaml +39 -0
- package/dist/agents/skills/gemini-cli/security-zero-trust-principles/SKILL.md +229 -0
- package/dist/agents/skills/gemini-cli/security-zero-trust-principles/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/state-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-jotai-atoms/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-selection-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-server-client-sync/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-zustand-devtools/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-zustand-immer/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-zustand-persist/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-zustand-react/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-zustand-slices/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/state-zustand-store/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-adapter-config/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-component-composition/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-error-pages/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-form-actions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-load-functions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-performance-patterns/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/svelte-routing-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-runes-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-server-hooks/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-stores-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/svelte-transitions-animations/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-cache-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-dependent-queries/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-devtools/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-infinite-queries/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-mutation-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-optimistic-updates/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-prefetching/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-query-invalidation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-query-keys/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/tanstack-suspense-mode/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-accessibility-testing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-component-react/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-component-svelte/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-contract-testing/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-coverage-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-e2e-strategy/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-factory-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-integration-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-mock-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-msw-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-performance-testing/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/test-playwright-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-playwright-setup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-property-based/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-snapshot-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-tdd-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-unit-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/test-vitest-config/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/trpc-context-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/trpc-error-handling/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/trpc-error-handling/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/trpc-input-validation/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/trpc-input-validation/skill.yaml +2 -0
- package/dist/agents/skills/gemini-cli/trpc-middleware-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/trpc-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/trpc-react-query-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/trpc-router-composition/SKILL.md +1 -0
- package/dist/agents/skills/gemini-cli/trpc-router-composition/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/trpc-subscription-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-async-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-branded-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-class-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-conditional-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-config-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-declaration-merging/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-decorator-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-discriminated-unions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-error-handling-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-generics-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-mapped-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-module-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-performance-patterns/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/ts-satisfies-operator/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-strict-mode/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-template-literal-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-testing-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-type-guards/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-utility-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ts-zod-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/ux-active-voice/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/ux-active-voice/skill.yaml +32 -0
- package/dist/agents/skills/gemini-cli/ux-button-cta-copy/SKILL.md +159 -0
- package/dist/agents/skills/gemini-cli/ux-button-cta-copy/skill.yaml +34 -0
- package/dist/agents/skills/gemini-cli/ux-confirmation-dialogs/SKILL.md +156 -0
- package/dist/agents/skills/gemini-cli/ux-confirmation-dialogs/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-content-hierarchy/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/ux-content-hierarchy/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-data-table-copy/SKILL.md +154 -0
- package/dist/agents/skills/gemini-cli/ux-data-table-copy/skill.yaml +34 -0
- package/dist/agents/skills/gemini-cli/ux-destructive-action-copy/SKILL.md +152 -0
- package/dist/agents/skills/gemini-cli/ux-destructive-action-copy/skill.yaml +34 -0
- package/dist/agents/skills/gemini-cli/ux-empty-states/SKILL.md +155 -0
- package/dist/agents/skills/gemini-cli/ux-empty-states/skill.yaml +36 -0
- package/dist/agents/skills/gemini-cli/ux-error-messages/SKILL.md +159 -0
- package/dist/agents/skills/gemini-cli/ux-error-messages/skill.yaml +35 -0
- package/dist/agents/skills/gemini-cli/ux-error-severity/SKILL.md +155 -0
- package/dist/agents/skills/gemini-cli/ux-error-severity/skill.yaml +35 -0
- package/dist/agents/skills/gemini-cli/ux-form-labels/SKILL.md +159 -0
- package/dist/agents/skills/gemini-cli/ux-form-labels/skill.yaml +36 -0
- package/dist/agents/skills/gemini-cli/ux-inclusive-language/SKILL.md +161 -0
- package/dist/agents/skills/gemini-cli/ux-inclusive-language/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-internationalization-writing/SKILL.md +196 -0
- package/dist/agents/skills/gemini-cli/ux-internationalization-writing/skill.yaml +35 -0
- package/dist/agents/skills/gemini-cli/ux-loading-states/SKILL.md +162 -0
- package/dist/agents/skills/gemini-cli/ux-loading-states/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-microcopy-principles/SKILL.md +152 -0
- package/dist/agents/skills/gemini-cli/ux-microcopy-principles/skill.yaml +37 -0
- package/dist/agents/skills/gemini-cli/ux-navigation-labels/SKILL.md +163 -0
- package/dist/agents/skills/gemini-cli/ux-navigation-labels/skill.yaml +35 -0
- package/dist/agents/skills/gemini-cli/ux-notification-copy/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/ux-notification-copy/skill.yaml +35 -0
- package/dist/agents/skills/gemini-cli/ux-onboarding-copy/SKILL.md +156 -0
- package/dist/agents/skills/gemini-cli/ux-onboarding-copy/skill.yaml +35 -0
- package/dist/agents/skills/gemini-cli/ux-permission-access-copy/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/ux-permission-access-copy/skill.yaml +34 -0
- package/dist/agents/skills/gemini-cli/ux-plain-language/SKILL.md +157 -0
- package/dist/agents/skills/gemini-cli/ux-plain-language/skill.yaml +34 -0
- package/dist/agents/skills/gemini-cli/ux-search-copy/SKILL.md +154 -0
- package/dist/agents/skills/gemini-cli/ux-search-copy/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-settings-preferences/SKILL.md +152 -0
- package/dist/agents/skills/gemini-cli/ux-settings-preferences/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-success-feedback/SKILL.md +163 -0
- package/dist/agents/skills/gemini-cli/ux-success-feedback/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-tooltip-contextual-help/SKILL.md +163 -0
- package/dist/agents/skills/gemini-cli/ux-tooltip-contextual-help/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-voice-tone/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/ux-voice-tone/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/ux-writing-for-scanning/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/ux-writing-for-scanning/skill.yaml +35 -0
- package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-async-components/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-component-events/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-composables-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-directive-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-pinia-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-provide-inject/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-reactive-refs/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-renderless-components/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-slots-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-teleport-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/vue-watchers-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-actor-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-guards-actions/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-history-states/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-invoke-pattern/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-machine-definition/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-parallel-states/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-react-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-testing-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-typegen/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/xstate-visualization/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-array-validation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-async-validation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-error-handling/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-infer-types/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-nextjs-integration/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-object-patterns/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-schema-definition/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-string-validation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-transform-refine/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/zod-union-discriminated/skill.yaml +1 -0
- package/dist/{agents-md-RP63BO56.js → agents-md-PBKKTSQY.js} +2 -2
- package/dist/{architecture-MCCHZWOK.js → architecture-FBSLURIB.js} +4 -4
- package/dist/{assess-project-7HE2Z5PW.js → assess-project-74UVWPMB.js} +1 -1
- package/dist/bin/harness-mcp.js +16 -16
- package/dist/bin/harness.js +24 -23
- package/dist/{check-phase-gate-JXIRVHTR.js → check-phase-gate-WY6UICCL.js} +4 -4
- package/dist/{chunk-HP74FPUJ.js → chunk-3VYWO6QN.js} +8 -8
- package/dist/chunk-3XAPHB2Z.js +43 -0
- package/dist/{chunk-ZOIGL5PP.js → chunk-5PMRARB5.js} +11 -1
- package/dist/{chunk-ANXOO2HR.js → chunk-A737JDL4.js} +4 -4
- package/dist/{chunk-IDZNPTYD.js → chunk-EPUKTTJZ.js} +6 -1
- package/dist/{chunk-FVF66DVL.js → chunk-FJYP32IV.js} +6 -6
- package/dist/{chunk-DSB6O257.js → chunk-GISMXMVL.js} +3 -0
- package/dist/{chunk-WPFFEDTO.js → chunk-H4U2QNY2.js} +523 -41
- package/dist/{chunk-EKYIKFOO.js → chunk-L5UONZ53.js} +58 -1
- package/dist/{chunk-BH6GUAUS.js → chunk-O6UF33QH.js} +777 -138
- package/dist/{chunk-MY5DBCJZ.js → chunk-OZIHPMA7.js} +105 -3
- package/dist/{chunk-LRX6J7IA.js → chunk-SPTKLCKC.js} +1 -1
- package/dist/{chunk-R7LB3VJR.js → chunk-TB427QOK.js} +9 -9
- package/dist/{chunk-7QYO5UWW.js → chunk-TDLOFNNQ.js} +1 -1
- package/dist/{chunk-3POJUEEZ.js → chunk-UFQQBGC3.js} +1 -1
- package/dist/{chunk-LASBAGC6.js → chunk-UQEUYRBP.js} +1 -1
- package/dist/{chunk-44DNUOBH.js → chunk-V2FGX2KD.js} +5 -5
- package/dist/{chunk-OWH5XSMD.js → chunk-WEN5Z7CL.js} +2 -2
- package/dist/{chunk-ICPZNX6O.js → chunk-XNEMDKV5.js} +1 -1
- package/dist/{chunk-UKMWY5OJ.js → chunk-YPKKEP3O.js} +10 -10
- package/dist/{chunk-46PEKT5G.js → chunk-ZAMT24QN.js} +1077 -546
- package/dist/{chunk-BKHS7RPB.js → chunk-ZOVATVQC.js} +1 -0
- package/dist/{ci-workflow-YE7B375K.js → ci-workflow-QZRHAIO2.js} +2 -2
- package/dist/{create-skill-LTLAAJPC.js → create-skill-QCXINA5Q.js} +2 -2
- package/dist/{dist-27IJJDWG.js → dist-7EBSGAHX.js} +42 -2
- package/dist/{dist-M6FBUXZD.js → dist-QW5G3GX3.js} +7 -1
- package/dist/{docs-YAYNHDC3.js → docs-H34GBVRS.js} +5 -5
- package/dist/{engine-TS24YHIT.js → engine-VUQEAJFZ.js} +2 -2
- package/dist/{entropy-RSH5D63W.js → entropy-ZAY73R6A.js} +4 -4
- package/dist/{feedback-VGGBOI54.js → feedback-TMEGYMWU.js} +2 -2
- package/dist/{generate-agent-definitions-PBITSP7C.js → generate-agent-definitions-PQPG6SX5.js} +2 -2
- package/dist/{graph-loader-OLSOE537.js → graph-loader-M6FXJAKK.js} +1 -1
- package/dist/index.d.ts +38 -8
- package/dist/index.js +29 -27
- package/dist/{loader-HBQNUGAM.js → loader-Y6A42WBD.js} +2 -2
- package/dist/mcp-LCHC4NZ5.js +37 -0
- package/dist/{performance-MMIMMNFQ.js → performance-N67YJJDG.js} +5 -5
- package/dist/{review-pipeline-UAPVKI6W.js → review-pipeline-YXF5ITL2.js} +4 -1
- package/dist/{runner-YYCVNAVF.js → runner-TY7DJGQV.js} +1 -1
- package/dist/{runtime-NQNTDQV5.js → runtime-XNJUJCSG.js} +2 -2
- package/dist/scan-U67OKDRS.js +8 -0
- package/dist/{security-IP5IJTB7.js → security-L2YN3CTI.js} +1 -1
- package/dist/{skill-executor-CS25H7FF.js → skill-executor-GA7BDX3F.js} +2 -2
- package/dist/{validate-QLHCVBKE.js → validate-MNE25KLZ.js} +3 -3
- package/dist/{validate-cross-check-WQWFMPXJ.js → validate-cross-check-Y4PDR63C.js} +2 -2
- package/package.json +6 -5
- package/dist/mcp-HZ6CRAZR.js +0 -37
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
generateAgentsMd
|
|
3
|
+
} from "./chunk-I4QR3HNH.js";
|
|
1
4
|
import {
|
|
2
5
|
generateCIWorkflow
|
|
3
6
|
} from "./chunk-LOUH2LIC.js";
|
|
7
|
+
import {
|
|
8
|
+
TemplateEngine
|
|
9
|
+
} from "./chunk-FP53DDB5.js";
|
|
4
10
|
import {
|
|
5
11
|
generate,
|
|
6
12
|
validate
|
|
@@ -8,15 +14,12 @@ import {
|
|
|
8
14
|
import {
|
|
9
15
|
generateRuntime
|
|
10
16
|
} from "./chunk-LM5Z2WCA.js";
|
|
11
|
-
import {
|
|
12
|
-
generateAgentsMd
|
|
13
|
-
} from "./chunk-I4QR3HNH.js";
|
|
14
17
|
import {
|
|
15
18
|
runPersona
|
|
16
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-GISMXMVL.js";
|
|
17
20
|
import {
|
|
18
21
|
executeSkill
|
|
19
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-UQEUYRBP.js";
|
|
20
23
|
import {
|
|
21
24
|
ALLOWED_PERSONA_COMMANDS
|
|
22
25
|
} from "./chunk-TEFCFC4H.js";
|
|
@@ -25,7 +28,7 @@ import {
|
|
|
25
28
|
OutputMode,
|
|
26
29
|
createCheckPhaseGateCommand,
|
|
27
30
|
findFiles
|
|
28
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-SPTKLCKC.js";
|
|
29
32
|
import {
|
|
30
33
|
createGenerateAgentDefinitionsCommand,
|
|
31
34
|
generateAgentDefinitions
|
|
@@ -38,12 +41,13 @@ import {
|
|
|
38
41
|
loadPersona
|
|
39
42
|
} from "./chunk-YDRB55Q4.js";
|
|
40
43
|
import {
|
|
41
|
-
|
|
42
|
-
} from "./chunk-
|
|
44
|
+
createScanCommand
|
|
45
|
+
} from "./chunk-3XAPHB2Z.js";
|
|
43
46
|
import {
|
|
44
47
|
appendFrameworkAgents,
|
|
45
48
|
captureHealthSnapshot,
|
|
46
49
|
createGenerateSlashCommandsCommand,
|
|
50
|
+
ensureHarnessGitignore,
|
|
47
51
|
generateSlashCommands,
|
|
48
52
|
handleGetImpact,
|
|
49
53
|
handleOrphanDeletion,
|
|
@@ -52,11 +56,11 @@ import {
|
|
|
52
56
|
loadOrRebuildIndex,
|
|
53
57
|
persistToolingConfig,
|
|
54
58
|
recommend
|
|
55
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-O6UF33QH.js";
|
|
56
60
|
import {
|
|
57
61
|
findConfigFile,
|
|
58
62
|
resolveConfig
|
|
59
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-5PMRARB5.js";
|
|
60
64
|
import {
|
|
61
65
|
VALID_PLATFORMS
|
|
62
66
|
} from "./chunk-3ISINLYT.js";
|
|
@@ -70,7 +74,7 @@ import {
|
|
|
70
74
|
} from "./chunk-6B6UN6SG.js";
|
|
71
75
|
import {
|
|
72
76
|
loadGraphStore
|
|
73
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-TDLOFNNQ.js";
|
|
74
78
|
import {
|
|
75
79
|
CLI_VERSION
|
|
76
80
|
} from "./chunk-BM3PWGXQ.js";
|
|
@@ -108,6 +112,7 @@ import {
|
|
|
108
112
|
diff,
|
|
109
113
|
extractBundle,
|
|
110
114
|
generateSuggestions,
|
|
115
|
+
getOrCreateInstallId,
|
|
111
116
|
listStreams,
|
|
112
117
|
listTaintedSessions,
|
|
113
118
|
loadState,
|
|
@@ -118,10 +123,12 @@ import {
|
|
|
118
123
|
parseManifest,
|
|
119
124
|
parseSecurityConfig,
|
|
120
125
|
pruneLearnings,
|
|
126
|
+
readIdentity,
|
|
121
127
|
readLockfile,
|
|
122
128
|
removeContributions,
|
|
123
129
|
removeProvenance,
|
|
124
130
|
requestPeerReview,
|
|
131
|
+
resolveConsent,
|
|
125
132
|
resolveStreamPath,
|
|
126
133
|
runAll,
|
|
127
134
|
runCIChecks,
|
|
@@ -133,20 +140,20 @@ import {
|
|
|
133
140
|
validateKnowledgeMap,
|
|
134
141
|
writeConfig,
|
|
135
142
|
writeLockfile
|
|
136
|
-
} from "./chunk-
|
|
143
|
+
} from "./chunk-H4U2QNY2.js";
|
|
137
144
|
import {
|
|
138
145
|
Err,
|
|
139
146
|
Ok
|
|
140
147
|
} from "./chunk-5LMZA5LZ.js";
|
|
141
148
|
import {
|
|
142
149
|
createCreateSkillCommand
|
|
143
|
-
} from "./chunk-
|
|
150
|
+
} from "./chunk-XNEMDKV5.js";
|
|
144
151
|
import {
|
|
145
152
|
logger
|
|
146
153
|
} from "./chunk-EBJQ6N4M.js";
|
|
147
154
|
import {
|
|
148
155
|
SkillMetadataSchema
|
|
149
|
-
} from "./chunk-
|
|
156
|
+
} from "./chunk-ZOVATVQC.js";
|
|
150
157
|
import {
|
|
151
158
|
CLIError,
|
|
152
159
|
ExitCode,
|
|
@@ -154,7 +161,7 @@ import {
|
|
|
154
161
|
} from "./chunk-3WGJMBKH.js";
|
|
155
162
|
|
|
156
163
|
// src/index.ts
|
|
157
|
-
import { Command as
|
|
164
|
+
import { Command as Command79 } from "commander";
|
|
158
165
|
|
|
159
166
|
// src/commands/add.ts
|
|
160
167
|
import { Command } from "commander";
|
|
@@ -244,7 +251,7 @@ function addDoc(name, cwd, configResult, created) {
|
|
|
244
251
|
return Ok(void 0);
|
|
245
252
|
}
|
|
246
253
|
async function addSkill(name, cwd, created) {
|
|
247
|
-
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-
|
|
254
|
+
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-QCXINA5Q.js");
|
|
248
255
|
generateSkillFiles2({
|
|
249
256
|
name,
|
|
250
257
|
description: `${name} skill`,
|
|
@@ -324,11 +331,164 @@ function createAddCommand() {
|
|
|
324
331
|
return command;
|
|
325
332
|
}
|
|
326
333
|
|
|
334
|
+
// src/commands/adoption.ts
|
|
335
|
+
import { Command as Command2 } from "commander";
|
|
336
|
+
function formatDuration(ms) {
|
|
337
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
338
|
+
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
339
|
+
return `${(ms / 6e4).toFixed(1)}m`;
|
|
340
|
+
}
|
|
341
|
+
function formatRate(rate) {
|
|
342
|
+
return `${(rate * 100).toFixed(0)}%`;
|
|
343
|
+
}
|
|
344
|
+
function padRight(str, len) {
|
|
345
|
+
return str.length >= len ? str : str + " ".repeat(len - str.length);
|
|
346
|
+
}
|
|
347
|
+
function registerSkillsCommand(adoption) {
|
|
348
|
+
adoption.command("skills").description("Show top skills by invocation count").option("--limit <n>", "Number of skills to show (default: 20)", "20").action(async (opts, cmd) => {
|
|
349
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
350
|
+
const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
|
|
351
|
+
const cwd = process.cwd();
|
|
352
|
+
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-7EBSGAHX.js");
|
|
353
|
+
const records = readAdoptionRecords(cwd);
|
|
354
|
+
if (records.length === 0) {
|
|
355
|
+
if (globalOpts.json) {
|
|
356
|
+
console.log(JSON.stringify([]));
|
|
357
|
+
} else {
|
|
358
|
+
logger.info("No adoption data found. Skills will be tracked after your next session.");
|
|
359
|
+
}
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const summaries = aggregateBySkill(records).slice(0, limit);
|
|
363
|
+
if (globalOpts.json) {
|
|
364
|
+
console.log(JSON.stringify(summaries, null, 2));
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const header = "Skill | Invocations | Success | Avg Duration | Last Used";
|
|
368
|
+
const divider = "-----------------------------------|-------------|---------|--------------|----------";
|
|
369
|
+
console.log(header);
|
|
370
|
+
console.log(divider);
|
|
371
|
+
for (const s of summaries) {
|
|
372
|
+
const name = padRight(s.skill, 35);
|
|
373
|
+
const count = padRight(String(s.invocations), 11);
|
|
374
|
+
const rate = padRight(formatRate(s.successRate), 7);
|
|
375
|
+
const dur = padRight(formatDuration(s.avgDuration), 12);
|
|
376
|
+
const last = s.lastUsed.slice(0, 10);
|
|
377
|
+
console.log(`${name} | ${count} | ${rate} | ${dur} | ${last}`);
|
|
378
|
+
}
|
|
379
|
+
console.log(`
|
|
380
|
+
Total: ${records.length} invocations across ${summaries.length} skill(s)`);
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
function registerRecentCommand(adoption) {
|
|
384
|
+
adoption.command("recent").description("Show recent skill invocations").option("--limit <n>", "Number of invocations to show (default: 20)", "20").action(async (opts, cmd) => {
|
|
385
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
386
|
+
const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
|
|
387
|
+
const cwd = process.cwd();
|
|
388
|
+
const { readAdoptionRecords } = await import("./dist-7EBSGAHX.js");
|
|
389
|
+
const records = readAdoptionRecords(cwd);
|
|
390
|
+
if (records.length === 0) {
|
|
391
|
+
if (globalOpts.json) {
|
|
392
|
+
console.log(JSON.stringify([]));
|
|
393
|
+
} else {
|
|
394
|
+
logger.info("No adoption data found. Skills will be tracked after your next session.");
|
|
395
|
+
}
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
const sorted = [...records].sort(
|
|
399
|
+
(a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime()
|
|
400
|
+
);
|
|
401
|
+
const limited = sorted.slice(0, limit);
|
|
402
|
+
if (globalOpts.json) {
|
|
403
|
+
console.log(JSON.stringify(limited, null, 2));
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
const header = "Date | Skill | Outcome | Duration";
|
|
407
|
+
const divider = "-----------|------------------------------------|-----------|---------";
|
|
408
|
+
console.log(header);
|
|
409
|
+
console.log(divider);
|
|
410
|
+
for (const r of limited) {
|
|
411
|
+
const date = r.startedAt.slice(0, 10);
|
|
412
|
+
const skill = padRight(r.skill, 35);
|
|
413
|
+
const outcome = padRight(r.outcome, 9);
|
|
414
|
+
const dur = formatDuration(r.duration);
|
|
415
|
+
console.log(`${date} | ${skill}| ${outcome} | ${dur}`);
|
|
416
|
+
}
|
|
417
|
+
console.log(`
|
|
418
|
+
Showing ${limited.length} of ${records.length} invocations`);
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
function registerSkillCommand(adoption) {
|
|
422
|
+
adoption.command("skill <name>").description("Show detail for a specific skill").action(async (name, _opts, cmd) => {
|
|
423
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
424
|
+
const cwd = process.cwd();
|
|
425
|
+
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-7EBSGAHX.js");
|
|
426
|
+
const records = readAdoptionRecords(cwd);
|
|
427
|
+
const skillRecords = records.filter((r) => r.skill === name);
|
|
428
|
+
if (skillRecords.length === 0) {
|
|
429
|
+
if (globalOpts.json) {
|
|
430
|
+
console.log(JSON.stringify(null));
|
|
431
|
+
} else {
|
|
432
|
+
logger.info(`No adoption data found for skill "${name}".`);
|
|
433
|
+
}
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
const summaries = aggregateBySkill(skillRecords);
|
|
437
|
+
const summary = summaries[0];
|
|
438
|
+
const phaseMap = /* @__PURE__ */ new Map();
|
|
439
|
+
for (const r of skillRecords) {
|
|
440
|
+
for (const phase of r.phasesReached) {
|
|
441
|
+
phaseMap.set(phase, (phaseMap.get(phase) ?? 0) + 1);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
const phaseRates = Array.from(phaseMap.entries()).map(([phase, count]) => ({ phase, count, rate: count / skillRecords.length })).sort((a, b) => b.count - a.count);
|
|
445
|
+
if (globalOpts.json) {
|
|
446
|
+
console.log(
|
|
447
|
+
JSON.stringify({ summary, phaseRates, totalRecords: skillRecords.length }, null, 2)
|
|
448
|
+
);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
console.log(`Skill: ${name}`);
|
|
452
|
+
console.log(`Invocations: ${summary.invocations}`);
|
|
453
|
+
console.log(`Success rate: ${formatRate(summary.successRate)}`);
|
|
454
|
+
console.log(`Avg duration: ${formatDuration(summary.avgDuration)}`);
|
|
455
|
+
console.log(`Last used: ${summary.lastUsed.slice(0, 10)}`);
|
|
456
|
+
if (summary.tier != null) {
|
|
457
|
+
console.log(`Tier: ${summary.tier}`);
|
|
458
|
+
}
|
|
459
|
+
if (phaseRates.length > 0) {
|
|
460
|
+
console.log("\nPhase completion rates:");
|
|
461
|
+
for (const p of phaseRates) {
|
|
462
|
+
console.log(
|
|
463
|
+
` ${padRight(p.phase, 20)} ${formatRate(p.rate)} (${p.count}/${skillRecords.length})`
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
const outcomes = { completed: 0, failed: 0, abandoned: 0 };
|
|
468
|
+
for (const r of skillRecords) {
|
|
469
|
+
if (r.outcome in outcomes) {
|
|
470
|
+
outcomes[r.outcome]++;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
console.log("\nOutcome breakdown:");
|
|
474
|
+
console.log(` Completed: ${outcomes.completed}`);
|
|
475
|
+
console.log(` Failed: ${outcomes.failed}`);
|
|
476
|
+
console.log(` Abandoned: ${outcomes.abandoned}`);
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
function createAdoptionCommand() {
|
|
480
|
+
const adoption = new Command2("adoption").description("View skill adoption telemetry").option("--json", "Output in JSON format");
|
|
481
|
+
registerSkillsCommand(adoption);
|
|
482
|
+
registerRecentCommand(adoption);
|
|
483
|
+
registerSkillCommand(adoption);
|
|
484
|
+
return adoption;
|
|
485
|
+
}
|
|
486
|
+
|
|
327
487
|
// src/commands/agent/index.ts
|
|
328
|
-
import { Command as
|
|
488
|
+
import { Command as Command5 } from "commander";
|
|
329
489
|
|
|
330
490
|
// src/commands/agent/run.ts
|
|
331
|
-
import { Command as
|
|
491
|
+
import { Command as Command3 } from "commander";
|
|
332
492
|
import * as path2 from "path";
|
|
333
493
|
import * as childProcess from "child_process";
|
|
334
494
|
async function runAgentTask(task, options) {
|
|
@@ -425,7 +585,7 @@ async function runPersonaMode(opts, quiet) {
|
|
|
425
585
|
process.exit(report.status === "fail" ? ExitCode.ERROR : ExitCode.SUCCESS);
|
|
426
586
|
}
|
|
427
587
|
function createRunCommand() {
|
|
428
|
-
return new
|
|
588
|
+
return new Command3("run").description("Run an agent task").argument("[task]", "Task to run (review, doc-review, test-review)").option("--timeout <ms>", "Timeout in milliseconds", "300000").option("--persona <name>", "Run a persona by name").option("--trigger <context>", "Trigger context (auto, on_pr, on_commit, manual)", "auto").action(async (task, opts, cmd) => {
|
|
429
589
|
const globalOpts = cmd.optsWithGlobals();
|
|
430
590
|
if (opts.persona) {
|
|
431
591
|
await runPersonaMode(opts, globalOpts.quiet);
|
|
@@ -449,7 +609,7 @@ function createRunCommand() {
|
|
|
449
609
|
}
|
|
450
610
|
|
|
451
611
|
// src/commands/agent/review.ts
|
|
452
|
-
import { Command as
|
|
612
|
+
import { Command as Command4 } from "commander";
|
|
453
613
|
import { execSync } from "child_process";
|
|
454
614
|
async function runAgentReview(options) {
|
|
455
615
|
const configResult = resolveConfig(options.configPath);
|
|
@@ -543,7 +703,7 @@ function printReviewResult(result, mode) {
|
|
|
543
703
|
}
|
|
544
704
|
}
|
|
545
705
|
function createReviewCommand() {
|
|
546
|
-
return new
|
|
706
|
+
return new Command4("review").description("Run unified code review pipeline on current changes").option("--comment", "Post inline comments to GitHub PR").option("--ci", "Enable eligibility gate, non-interactive output").option("--deep", "Add threat modeling pass to security agent").option("--no-mechanical", "Skip mechanical checks").action(async (opts, cmd) => {
|
|
547
707
|
const globalOpts = cmd.optsWithGlobals();
|
|
548
708
|
const mode = resolveReviewMode(globalOpts);
|
|
549
709
|
const result = await runAgentReview({
|
|
@@ -571,17 +731,17 @@ function createReviewCommand() {
|
|
|
571
731
|
|
|
572
732
|
// src/commands/agent/index.ts
|
|
573
733
|
function createAgentCommand() {
|
|
574
|
-
const command = new
|
|
734
|
+
const command = new Command5("agent").description("Agent orchestration commands");
|
|
575
735
|
command.addCommand(createRunCommand());
|
|
576
736
|
command.addCommand(createReviewCommand());
|
|
577
737
|
return command;
|
|
578
738
|
}
|
|
579
739
|
|
|
580
740
|
// src/commands/blueprint.ts
|
|
581
|
-
import { Command as
|
|
741
|
+
import { Command as Command6 } from "commander";
|
|
582
742
|
import * as path3 from "path";
|
|
583
743
|
function createBlueprintCommand() {
|
|
584
|
-
return new
|
|
744
|
+
return new Command6("blueprint").description("Generate a self-contained, interactive blueprint of the codebase").argument("[path]", "Path to the project root", ".").option("-o, --output <dir>", "Output directory", "docs/blueprint").action(async (projectPath, options) => {
|
|
585
745
|
try {
|
|
586
746
|
const rootDir = path3.resolve(projectPath);
|
|
587
747
|
const outputDir = path3.resolve(options.output);
|
|
@@ -602,7 +762,7 @@ function createBlueprintCommand() {
|
|
|
602
762
|
}
|
|
603
763
|
|
|
604
764
|
// src/commands/check-arch.ts
|
|
605
|
-
import { Command as
|
|
765
|
+
import { Command as Command7 } from "commander";
|
|
606
766
|
import { execSync as execSync2 } from "child_process";
|
|
607
767
|
function getCommitHash(cwd) {
|
|
608
768
|
try {
|
|
@@ -732,7 +892,7 @@ function printArchResult(value, mode, formatter) {
|
|
|
732
892
|
if (output) console.log(output);
|
|
733
893
|
}
|
|
734
894
|
function createCheckArchCommand() {
|
|
735
|
-
const command = new
|
|
895
|
+
const command = new Command7("check-arch").description("Check architecture assertions against baseline and thresholds").option("--update-baseline", "Capture current state as new baseline").option("--module <path>", "Check a single module").action(async (opts, cmd) => {
|
|
736
896
|
const globalOpts = cmd.optsWithGlobals();
|
|
737
897
|
const mode = resolveOutputMode(globalOpts);
|
|
738
898
|
const formatter = new OutputFormatter(mode);
|
|
@@ -762,7 +922,7 @@ function createCheckArchCommand() {
|
|
|
762
922
|
}
|
|
763
923
|
|
|
764
924
|
// src/commands/check-deps.ts
|
|
765
|
-
import { Command as
|
|
925
|
+
import { Command as Command8 } from "commander";
|
|
766
926
|
import * as path4 from "path";
|
|
767
927
|
async function runCheckDeps(options) {
|
|
768
928
|
const cwd = options.cwd ?? process.cwd();
|
|
@@ -854,14 +1014,14 @@ async function runCheckDepsAction(globalOpts) {
|
|
|
854
1014
|
process.exit(result.value.valid ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
|
|
855
1015
|
}
|
|
856
1016
|
function createCheckDepsCommand() {
|
|
857
|
-
const command = new
|
|
1017
|
+
const command = new Command8("check-deps").description("Validate dependency layers and detect circular dependencies").action(async (_opts, cmd) => {
|
|
858
1018
|
await runCheckDepsAction(cmd.optsWithGlobals());
|
|
859
1019
|
});
|
|
860
1020
|
return command;
|
|
861
1021
|
}
|
|
862
1022
|
|
|
863
1023
|
// src/commands/check-docs.ts
|
|
864
|
-
import { Command as
|
|
1024
|
+
import { Command as Command9 } from "commander";
|
|
865
1025
|
import * as path5 from "path";
|
|
866
1026
|
|
|
867
1027
|
// src/utils/output.ts
|
|
@@ -949,7 +1109,7 @@ function printCheckDocsResult(value, mode, formatter) {
|
|
|
949
1109
|
}
|
|
950
1110
|
}
|
|
951
1111
|
function createCheckDocsCommand() {
|
|
952
|
-
const command = new
|
|
1112
|
+
const command = new Command9("check-docs").description("Check documentation coverage").option("--min-coverage <percent>", "Minimum coverage percentage", "80").action(async (opts, cmd) => {
|
|
953
1113
|
const globalOpts = cmd.optsWithGlobals();
|
|
954
1114
|
const mode = resolveOutputMode2(globalOpts);
|
|
955
1115
|
const formatter = new OutputFormatter(mode);
|
|
@@ -979,7 +1139,7 @@ function createCheckDocsCommand() {
|
|
|
979
1139
|
}
|
|
980
1140
|
|
|
981
1141
|
// src/commands/check-perf.ts
|
|
982
|
-
import { Command as
|
|
1142
|
+
import { Command as Command10 } from "commander";
|
|
983
1143
|
import * as path6 from "path";
|
|
984
1144
|
async function runCheckPerf(cwd, options) {
|
|
985
1145
|
const runAll2 = !options.structural && !options.size && !options.coupling;
|
|
@@ -1096,14 +1256,14 @@ async function runCheckPerfAction(opts, globalOpts) {
|
|
|
1096
1256
|
process.exit(result.value.valid ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
|
|
1097
1257
|
}
|
|
1098
1258
|
function createCheckPerfCommand() {
|
|
1099
|
-
const command = new
|
|
1259
|
+
const command = new Command10("check-perf").description("Run performance checks: structural complexity, coupling, and size budgets").option("--structural", "Run structural complexity checks only").option("--coupling", "Run coupling metric checks only").option("--size", "Run size budget checks only").action(async (opts, cmd) => {
|
|
1100
1260
|
await runCheckPerfAction(opts, cmd.optsWithGlobals());
|
|
1101
1261
|
});
|
|
1102
1262
|
return command;
|
|
1103
1263
|
}
|
|
1104
1264
|
|
|
1105
1265
|
// src/commands/check-security.ts
|
|
1106
|
-
import { Command as
|
|
1266
|
+
import { Command as Command11 } from "commander";
|
|
1107
1267
|
import * as path7 from "path";
|
|
1108
1268
|
import { execSync as execSync3 } from "child_process";
|
|
1109
1269
|
var SEVERITY_RANK = {
|
|
@@ -1126,10 +1286,10 @@ async function runCheckSecurity(cwd, options) {
|
|
|
1126
1286
|
const projectRoot = path7.resolve(cwd);
|
|
1127
1287
|
let configData = {};
|
|
1128
1288
|
try {
|
|
1129
|
-
const
|
|
1289
|
+
const fs36 = await import("fs");
|
|
1130
1290
|
const configPath = path7.join(projectRoot, "harness.config.json");
|
|
1131
|
-
if (
|
|
1132
|
-
const raw =
|
|
1291
|
+
if (fs36.existsSync(configPath)) {
|
|
1292
|
+
const raw = fs36.readFileSync(configPath, "utf-8");
|
|
1133
1293
|
const parsed = JSON.parse(raw);
|
|
1134
1294
|
configData = parsed.security ?? {};
|
|
1135
1295
|
}
|
|
@@ -1198,7 +1358,7 @@ async function runCheckSecurityAction(opts, globalOpts) {
|
|
|
1198
1358
|
process.exit(result.value.valid ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
|
|
1199
1359
|
}
|
|
1200
1360
|
function createCheckSecurityCommand() {
|
|
1201
|
-
const command = new
|
|
1361
|
+
const command = new Command11("check-security").description("Run lightweight security scan: secrets, injection, XSS, weak crypto").option("--severity <level>", "Minimum severity threshold", "warning").hook("preAction", (thisCommand) => {
|
|
1202
1362
|
const severity = thisCommand.opts().severity;
|
|
1203
1363
|
if (!["error", "warning", "info"].includes(severity)) {
|
|
1204
1364
|
logger.error(`Invalid severity: "${severity}". Must be one of: error, warning, info`);
|
|
@@ -1211,10 +1371,10 @@ function createCheckSecurityCommand() {
|
|
|
1211
1371
|
}
|
|
1212
1372
|
|
|
1213
1373
|
// src/commands/ci/index.ts
|
|
1214
|
-
import { Command as
|
|
1374
|
+
import { Command as Command14 } from "commander";
|
|
1215
1375
|
|
|
1216
1376
|
// src/commands/ci/check.ts
|
|
1217
|
-
import { Command as
|
|
1377
|
+
import { Command as Command12 } from "commander";
|
|
1218
1378
|
var VALID_CHECKS = [
|
|
1219
1379
|
"validate",
|
|
1220
1380
|
"deps",
|
|
@@ -1304,13 +1464,13 @@ async function runCheckAction(opts, globalOpts) {
|
|
|
1304
1464
|
process.exit(report.exitCode);
|
|
1305
1465
|
}
|
|
1306
1466
|
function createCheckCommand() {
|
|
1307
|
-
return new
|
|
1467
|
+
return new Command12("check").description("Run all harness checks for CI (validate, deps, docs, entropy, phase-gate, arch)").option("--skip <checks>", "Comma-separated checks to skip (e.g., entropy,docs)").option("--fail-on <severity>", "Fail on severity level: error (default) or warning", "error").action(async (opts, cmd) => {
|
|
1308
1468
|
await runCheckAction(opts, cmd.optsWithGlobals());
|
|
1309
1469
|
});
|
|
1310
1470
|
}
|
|
1311
1471
|
|
|
1312
1472
|
// src/commands/ci/init.ts
|
|
1313
|
-
import { Command as
|
|
1473
|
+
import { Command as Command13 } from "commander";
|
|
1314
1474
|
import * as fs2 from "fs";
|
|
1315
1475
|
import * as path8 from "path";
|
|
1316
1476
|
var ALL_CHECKS = [
|
|
@@ -1447,86 +1607,19 @@ async function runInitAction(opts, globalOpts) {
|
|
|
1447
1607
|
}
|
|
1448
1608
|
}
|
|
1449
1609
|
function createInitCommand() {
|
|
1450
|
-
return new
|
|
1610
|
+
return new Command13("init").description("Generate CI configuration for harness checks").option("--platform <platform>", "CI platform: github, gitlab, or generic").option("--checks <list>", "Comma-separated list of checks to include").action(async (opts, cmd) => {
|
|
1451
1611
|
await runInitAction(opts, cmd.optsWithGlobals());
|
|
1452
1612
|
});
|
|
1453
1613
|
}
|
|
1454
1614
|
|
|
1455
1615
|
// src/commands/ci/index.ts
|
|
1456
1616
|
function createCICommand() {
|
|
1457
|
-
const command = new
|
|
1617
|
+
const command = new Command14("ci").description("CI/CD integration commands");
|
|
1458
1618
|
command.addCommand(createCheckCommand());
|
|
1459
1619
|
command.addCommand(createInitCommand());
|
|
1460
1620
|
return command;
|
|
1461
1621
|
}
|
|
1462
1622
|
|
|
1463
|
-
// src/commands/dashboard.ts
|
|
1464
|
-
import { Command as Command14 } from "commander";
|
|
1465
|
-
import { spawn } from "child_process";
|
|
1466
|
-
import { existsSync as existsSync3 } from "fs";
|
|
1467
|
-
import { dirname as dirname2, join as join5, resolve as resolve8 } from "path";
|
|
1468
|
-
import { fileURLToPath } from "url";
|
|
1469
|
-
var __filename = fileURLToPath(import.meta.url);
|
|
1470
|
-
var __dirname = dirname2(__filename);
|
|
1471
|
-
var DEFAULT_CLIENT_PORT = 3700;
|
|
1472
|
-
var DEFAULT_API_PORT = 3701;
|
|
1473
|
-
function openBrowser(url) {
|
|
1474
|
-
const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
1475
|
-
spawn(cmd, [url], { detached: true, stdio: "ignore" }).unref();
|
|
1476
|
-
}
|
|
1477
|
-
function resolveServerScript() {
|
|
1478
|
-
const built = [
|
|
1479
|
-
join5(__dirname, "..", "..", "..", "dashboard", "dist", "server", "serve.js"),
|
|
1480
|
-
join5(__dirname, "..", "..", "..", "..", "packages", "dashboard", "dist", "server", "serve.js")
|
|
1481
|
-
].find((p) => existsSync3(p));
|
|
1482
|
-
if (built) return { script: built, dev: false };
|
|
1483
|
-
const dev = [
|
|
1484
|
-
join5(__dirname, "..", "..", "..", "dashboard", "src", "server", "serve.ts"),
|
|
1485
|
-
join5(__dirname, "..", "..", "..", "..", "packages", "dashboard", "src", "server", "serve.ts")
|
|
1486
|
-
].find((p) => existsSync3(p));
|
|
1487
|
-
return dev ? { script: dev, dev: true } : null;
|
|
1488
|
-
}
|
|
1489
|
-
function spawnDashboardServer(server, env) {
|
|
1490
|
-
const child = server.dev ? spawn("tsx", [server.script], { env, stdio: "inherit" }) : spawn("node", [server.script], { env, stdio: "inherit" });
|
|
1491
|
-
child.on("error", (e) => {
|
|
1492
|
-
console.error(`Failed to start dashboard: ${e.message}`);
|
|
1493
|
-
process.exit(1);
|
|
1494
|
-
});
|
|
1495
|
-
child.on("exit", (code) => {
|
|
1496
|
-
if (code !== 0 && code !== null) {
|
|
1497
|
-
console.error(`Dashboard server exited with code ${code}`);
|
|
1498
|
-
process.exit(code);
|
|
1499
|
-
}
|
|
1500
|
-
});
|
|
1501
|
-
return child;
|
|
1502
|
-
}
|
|
1503
|
-
function runDashboard(opts) {
|
|
1504
|
-
const clientPort = Number(opts.port ?? DEFAULT_CLIENT_PORT);
|
|
1505
|
-
const apiPort = Number(opts.apiPort ?? DEFAULT_API_PORT);
|
|
1506
|
-
const projectPath = resolve8(opts.cwd ?? process.cwd());
|
|
1507
|
-
const url = `http://localhost:${clientPort}`;
|
|
1508
|
-
const server = resolveServerScript();
|
|
1509
|
-
if (!server) {
|
|
1510
|
-
console.error("Could not locate the dashboard server. Run `pnpm build` in packages/dashboard.");
|
|
1511
|
-
process.exit(1);
|
|
1512
|
-
}
|
|
1513
|
-
const env = {
|
|
1514
|
-
...process.env,
|
|
1515
|
-
DASHBOARD_API_PORT: String(apiPort),
|
|
1516
|
-
DASHBOARD_CLIENT_PORT: String(clientPort),
|
|
1517
|
-
HARNESS_PROJECT_PATH: projectPath
|
|
1518
|
-
};
|
|
1519
|
-
spawnDashboardServer(server, env);
|
|
1520
|
-
console.log(`Dashboard API starting on http://localhost:${apiPort}`);
|
|
1521
|
-
console.log(`Open ${url} (pass --no-open to suppress)`);
|
|
1522
|
-
if (opts.noOpen !== true) {
|
|
1523
|
-
setTimeout(() => openBrowser(url), 1500);
|
|
1524
|
-
}
|
|
1525
|
-
}
|
|
1526
|
-
function createDashboardCommand() {
|
|
1527
|
-
return new Command14("dashboard").description("Start the Harness local web dashboard").option("--port <port>", "Client dev server port", String(DEFAULT_CLIENT_PORT)).option("--api-port <port>", "API server port", String(DEFAULT_API_PORT)).option("--no-open", "Do not automatically open browser").option("--cwd <path>", "Project directory (defaults to cwd)").action((opts) => runDashboard(opts));
|
|
1528
|
-
}
|
|
1529
|
-
|
|
1530
1623
|
// src/commands/cleanup.ts
|
|
1531
1624
|
import { Command as Command15 } from "commander";
|
|
1532
1625
|
import * as path9 from "path";
|
|
@@ -1646,11 +1739,197 @@ function createCleanupCommand() {
|
|
|
1646
1739
|
return command;
|
|
1647
1740
|
}
|
|
1648
1741
|
|
|
1649
|
-
// src/commands/
|
|
1742
|
+
// src/commands/cleanup-sessions.ts
|
|
1650
1743
|
import { Command as Command16 } from "commander";
|
|
1651
|
-
import * as
|
|
1744
|
+
import * as fs3 from "fs";
|
|
1745
|
+
import * as path10 from "path";
|
|
1746
|
+
var STALE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
1747
|
+
function getMostRecentMtime(dirPath) {
|
|
1748
|
+
let latest = 0;
|
|
1749
|
+
try {
|
|
1750
|
+
const entries = fs3.readdirSync(dirPath, { withFileTypes: true });
|
|
1751
|
+
for (const entry of entries) {
|
|
1752
|
+
const fullPath = path10.join(dirPath, entry.name);
|
|
1753
|
+
const stat = fs3.statSync(fullPath);
|
|
1754
|
+
if (stat.mtimeMs > latest) latest = stat.mtimeMs;
|
|
1755
|
+
}
|
|
1756
|
+
const dirStat = fs3.statSync(dirPath);
|
|
1757
|
+
if (dirStat.mtimeMs > latest) latest = dirStat.mtimeMs;
|
|
1758
|
+
} catch {
|
|
1759
|
+
}
|
|
1760
|
+
return latest;
|
|
1761
|
+
}
|
|
1762
|
+
async function runCleanupSessions(options) {
|
|
1763
|
+
const cwd = options.cwd ?? process.cwd();
|
|
1764
|
+
const dryRun = options.dryRun ?? false;
|
|
1765
|
+
const sessionsDir = path10.join(cwd, ".harness", "sessions");
|
|
1766
|
+
const result = { removed: [], kept: [] };
|
|
1767
|
+
if (!fs3.existsSync(sessionsDir)) {
|
|
1768
|
+
return Ok(result);
|
|
1769
|
+
}
|
|
1770
|
+
let entries;
|
|
1771
|
+
try {
|
|
1772
|
+
entries = fs3.readdirSync(sessionsDir, { withFileTypes: true });
|
|
1773
|
+
} catch (err) {
|
|
1774
|
+
return Err(
|
|
1775
|
+
new CLIError(
|
|
1776
|
+
`Failed to read sessions directory: ${err instanceof Error ? err.message : String(err)}`,
|
|
1777
|
+
ExitCode.ERROR
|
|
1778
|
+
)
|
|
1779
|
+
);
|
|
1780
|
+
}
|
|
1781
|
+
const now = Date.now();
|
|
1782
|
+
for (const entry of entries) {
|
|
1783
|
+
if (!entry.isDirectory()) continue;
|
|
1784
|
+
const sessionPath = path10.join(sessionsDir, entry.name);
|
|
1785
|
+
const mostRecent = getMostRecentMtime(sessionPath);
|
|
1786
|
+
const ageMs = now - mostRecent;
|
|
1787
|
+
if (ageMs > STALE_TTL_MS) {
|
|
1788
|
+
result.removed.push(entry.name);
|
|
1789
|
+
if (!dryRun) {
|
|
1790
|
+
try {
|
|
1791
|
+
fs3.rmSync(sessionPath, { recursive: true, force: true });
|
|
1792
|
+
} catch (err) {
|
|
1793
|
+
return Err(
|
|
1794
|
+
new CLIError(
|
|
1795
|
+
`Failed to remove session ${entry.name}: ${err instanceof Error ? err.message : String(err)}`,
|
|
1796
|
+
ExitCode.ERROR
|
|
1797
|
+
)
|
|
1798
|
+
);
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
} else {
|
|
1802
|
+
result.kept.push(entry.name);
|
|
1803
|
+
}
|
|
1804
|
+
}
|
|
1805
|
+
return Ok(result);
|
|
1806
|
+
}
|
|
1807
|
+
function printResult(result, dryRun, asJson) {
|
|
1808
|
+
const { removed, kept } = result;
|
|
1809
|
+
if (asJson) {
|
|
1810
|
+
console.log(JSON.stringify({ removed, kept, dryRun }, null, 2));
|
|
1811
|
+
return;
|
|
1812
|
+
}
|
|
1813
|
+
if (removed.length === 0 && kept.length === 0) {
|
|
1814
|
+
console.log("No sessions found.");
|
|
1815
|
+
return;
|
|
1816
|
+
}
|
|
1817
|
+
if (removed.length > 0) {
|
|
1818
|
+
const label = dryRun ? "Stale (would remove)" : "Removed";
|
|
1819
|
+
console.log(`
|
|
1820
|
+
${label} (${removed.length}):`);
|
|
1821
|
+
for (const s of removed) console.log(` - ${s}`);
|
|
1822
|
+
}
|
|
1823
|
+
if (kept.length > 0) {
|
|
1824
|
+
console.log(`
|
|
1825
|
+
Kept (${kept.length}):`);
|
|
1826
|
+
for (const s of kept) console.log(` - ${s}`);
|
|
1827
|
+
}
|
|
1828
|
+
if (!dryRun && removed.length > 0) {
|
|
1829
|
+
console.log(`
|
|
1830
|
+
Cleaned up ${removed.length} stale session(s).`);
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
function createCleanupSessionsCommand() {
|
|
1834
|
+
const command = new Command16("cleanup-sessions").description("Remove stale session directories from .harness/sessions/ (no write in 24h)").option("--dry-run", "List stale sessions without deleting them", false).option("--path <path>", "Project root path", ".").action(async (opts, cmd) => {
|
|
1835
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
1836
|
+
const cwd = path10.resolve(opts.path);
|
|
1837
|
+
const result = await runCleanupSessions({ cwd, dryRun: opts.dryRun });
|
|
1838
|
+
if (!result.ok) {
|
|
1839
|
+
logger.error(result.error.message);
|
|
1840
|
+
process.exit(result.error.exitCode);
|
|
1841
|
+
return;
|
|
1842
|
+
}
|
|
1843
|
+
printResult(result.value, opts.dryRun, globalOpts.json);
|
|
1844
|
+
process.exit(ExitCode.SUCCESS);
|
|
1845
|
+
});
|
|
1846
|
+
return command;
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
// src/commands/dashboard.ts
|
|
1850
|
+
import { Command as Command17 } from "commander";
|
|
1851
|
+
import { spawn } from "child_process";
|
|
1852
|
+
import { existsSync as existsSync4 } from "fs";
|
|
1853
|
+
import { createRequire } from "module";
|
|
1854
|
+
import { dirname as dirname2, join as join7, resolve as resolve10 } from "path";
|
|
1855
|
+
import { setTimeout } from "timers";
|
|
1856
|
+
import { fileURLToPath } from "url";
|
|
1857
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
1858
|
+
var __dirname = dirname2(__filename);
|
|
1859
|
+
var require2 = createRequire(import.meta.url);
|
|
1860
|
+
var DEFAULT_CLIENT_PORT = 3700;
|
|
1861
|
+
var DEFAULT_API_PORT = 3701;
|
|
1862
|
+
function openBrowser(url) {
|
|
1863
|
+
const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
1864
|
+
spawn(cmd, [url], { detached: true, stdio: "ignore" }).unref();
|
|
1865
|
+
}
|
|
1866
|
+
function resolveServerScript() {
|
|
1867
|
+
try {
|
|
1868
|
+
const pkgPath = require2.resolve("@harness-engineering/dashboard/package.json");
|
|
1869
|
+
const pkgDir = dirname2(pkgPath);
|
|
1870
|
+
const built2 = join7(pkgDir, "dist", "server", "serve.js");
|
|
1871
|
+
if (existsSync4(built2)) return { script: built2, dev: false };
|
|
1872
|
+
const dev2 = join7(pkgDir, "src", "server", "serve.ts");
|
|
1873
|
+
if (existsSync4(dev2)) return { script: dev2, dev: true };
|
|
1874
|
+
} catch {
|
|
1875
|
+
}
|
|
1876
|
+
const built = [
|
|
1877
|
+
join7(__dirname, "..", "..", "..", "dashboard", "dist", "server", "serve.js"),
|
|
1878
|
+
join7(__dirname, "..", "..", "..", "..", "packages", "dashboard", "dist", "server", "serve.js")
|
|
1879
|
+
].find((p) => existsSync4(p));
|
|
1880
|
+
if (built) return { script: built, dev: false };
|
|
1881
|
+
const dev = [
|
|
1882
|
+
join7(__dirname, "..", "..", "..", "dashboard", "src", "server", "serve.ts"),
|
|
1883
|
+
join7(__dirname, "..", "..", "..", "..", "packages", "dashboard", "src", "server", "serve.ts")
|
|
1884
|
+
].find((p) => existsSync4(p));
|
|
1885
|
+
return dev ? { script: dev, dev: true } : null;
|
|
1886
|
+
}
|
|
1887
|
+
function spawnDashboardServer(server, env) {
|
|
1888
|
+
const child = server.dev ? spawn("tsx", [server.script], { env, stdio: "inherit" }) : spawn("node", [server.script], { env, stdio: "inherit" });
|
|
1889
|
+
child.on("error", (e) => {
|
|
1890
|
+
console.error(`Failed to start dashboard: ${e.message}`);
|
|
1891
|
+
process.exit(1);
|
|
1892
|
+
});
|
|
1893
|
+
child.on("exit", (code) => {
|
|
1894
|
+
if (code !== 0 && code !== null) {
|
|
1895
|
+
console.error(`Dashboard server exited with code ${code}`);
|
|
1896
|
+
process.exit(code);
|
|
1897
|
+
}
|
|
1898
|
+
});
|
|
1899
|
+
return child;
|
|
1900
|
+
}
|
|
1901
|
+
function runDashboard(opts) {
|
|
1902
|
+
const clientPort = Number(opts.port ?? DEFAULT_CLIENT_PORT);
|
|
1903
|
+
const apiPort = Number(opts.apiPort ?? DEFAULT_API_PORT);
|
|
1904
|
+
const projectPath = resolve10(opts.cwd ?? process.cwd());
|
|
1905
|
+
const url = `http://localhost:${apiPort}`;
|
|
1906
|
+
const server = resolveServerScript();
|
|
1907
|
+
if (!server) {
|
|
1908
|
+
console.error("Could not locate the dashboard server. Run `pnpm build` in packages/dashboard.");
|
|
1909
|
+
process.exit(1);
|
|
1910
|
+
}
|
|
1911
|
+
const env = {
|
|
1912
|
+
...process.env,
|
|
1913
|
+
DASHBOARD_API_PORT: String(apiPort),
|
|
1914
|
+
DASHBOARD_CLIENT_PORT: String(clientPort),
|
|
1915
|
+
HARNESS_PROJECT_PATH: projectPath
|
|
1916
|
+
};
|
|
1917
|
+
spawnDashboardServer(server, env);
|
|
1918
|
+
console.log(`Dashboard API starting on http://localhost:${apiPort}`);
|
|
1919
|
+
console.log(`Open ${url} (pass --no-open to suppress)`);
|
|
1920
|
+
if (opts.noOpen !== true) {
|
|
1921
|
+
setTimeout(() => openBrowser(url), 1500);
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
function createDashboardCommand() {
|
|
1925
|
+
return new Command17("dashboard").description("Start the Harness local web dashboard").option("--port <port>", "Client dev server port", String(DEFAULT_CLIENT_PORT)).option("--api-port <port>", "API server port", String(DEFAULT_API_PORT)).option("--no-open", "Do not automatically open browser").option("--cwd <path>", "Project directory (defaults to cwd)").action((opts) => runDashboard(opts));
|
|
1926
|
+
}
|
|
1927
|
+
|
|
1928
|
+
// src/commands/doctor.ts
|
|
1929
|
+
import { Command as Command18 } from "commander";
|
|
1930
|
+
import * as fs5 from "fs";
|
|
1652
1931
|
import * as os from "os";
|
|
1653
|
-
import * as
|
|
1932
|
+
import * as path12 from "path";
|
|
1654
1933
|
import chalk from "chalk";
|
|
1655
1934
|
|
|
1656
1935
|
// src/utils/node-version.ts
|
|
@@ -1733,24 +2012,24 @@ var INTEGRATION_REGISTRY = [
|
|
|
1733
2012
|
];
|
|
1734
2013
|
|
|
1735
2014
|
// src/integrations/config.ts
|
|
1736
|
-
import * as
|
|
1737
|
-
import * as
|
|
2015
|
+
import * as fs4 from "fs";
|
|
2016
|
+
import * as path11 from "path";
|
|
1738
2017
|
function readJsonSafe(filePath) {
|
|
1739
|
-
if (!
|
|
2018
|
+
if (!fs4.existsSync(filePath)) return null;
|
|
1740
2019
|
try {
|
|
1741
|
-
return JSON.parse(
|
|
2020
|
+
return JSON.parse(fs4.readFileSync(filePath, "utf-8"));
|
|
1742
2021
|
} catch {
|
|
1743
2022
|
return null;
|
|
1744
2023
|
}
|
|
1745
2024
|
}
|
|
1746
2025
|
function writeJson(filePath, data) {
|
|
1747
|
-
const dir =
|
|
1748
|
-
if (!
|
|
1749
|
-
|
|
2026
|
+
const dir = path11.dirname(filePath);
|
|
2027
|
+
if (!fs4.existsSync(dir)) {
|
|
2028
|
+
fs4.mkdirSync(dir, { recursive: true });
|
|
1750
2029
|
}
|
|
1751
2030
|
const tmp = filePath + ".tmp";
|
|
1752
|
-
|
|
1753
|
-
|
|
2031
|
+
fs4.writeFileSync(tmp, JSON.stringify(data, null, 2) + "\n");
|
|
2032
|
+
fs4.renameSync(tmp, filePath);
|
|
1754
2033
|
}
|
|
1755
2034
|
function readMcpConfig(filePath) {
|
|
1756
2035
|
const config = readJsonSafe(filePath);
|
|
@@ -1764,7 +2043,7 @@ function writeMcpEntry(filePath, name, entry) {
|
|
|
1764
2043
|
writeJson(filePath, config);
|
|
1765
2044
|
}
|
|
1766
2045
|
function removeMcpEntry(filePath, name) {
|
|
1767
|
-
if (!
|
|
2046
|
+
if (!fs4.existsSync(filePath)) return;
|
|
1768
2047
|
const config = readMcpConfig(filePath);
|
|
1769
2048
|
delete config.mcpServers[name];
|
|
1770
2049
|
writeJson(filePath, config);
|
|
@@ -1803,7 +2082,7 @@ function checkNodeVersion2() {
|
|
|
1803
2082
|
}
|
|
1804
2083
|
function countCommandFiles(dir, ext) {
|
|
1805
2084
|
try {
|
|
1806
|
-
return
|
|
2085
|
+
return fs5.readdirSync(dir).filter((f) => f.endsWith(ext)).length;
|
|
1807
2086
|
} catch {
|
|
1808
2087
|
return 0;
|
|
1809
2088
|
}
|
|
@@ -1812,13 +2091,13 @@ function checkSlashCommands() {
|
|
|
1812
2091
|
const platforms = [
|
|
1813
2092
|
{
|
|
1814
2093
|
name: "Claude Code",
|
|
1815
|
-
dir:
|
|
2094
|
+
dir: path12.join(os.homedir(), ".claude", "commands", "harness"),
|
|
1816
2095
|
ext: ".md",
|
|
1817
2096
|
client: "claude-code"
|
|
1818
2097
|
},
|
|
1819
2098
|
{
|
|
1820
2099
|
name: "Gemini CLI",
|
|
1821
|
-
dir:
|
|
2100
|
+
dir: path12.join(os.homedir(), ".gemini", "commands", "harness"),
|
|
1822
2101
|
ext: ".toml",
|
|
1823
2102
|
client: "gemini-cli"
|
|
1824
2103
|
}
|
|
@@ -1842,7 +2121,7 @@ function checkSlashCommands() {
|
|
|
1842
2121
|
}
|
|
1843
2122
|
function checkMcpConfig(cwd) {
|
|
1844
2123
|
const results = [];
|
|
1845
|
-
const claudeConfig = readMcpConfig(
|
|
2124
|
+
const claudeConfig = readMcpConfig(path12.join(cwd, ".mcp.json"));
|
|
1846
2125
|
if (claudeConfig.mcpServers?.["harness"]) {
|
|
1847
2126
|
results.push({
|
|
1848
2127
|
name: "mcp-claude",
|
|
@@ -1857,9 +2136,9 @@ function checkMcpConfig(cwd) {
|
|
|
1857
2136
|
fix: "Run: harness setup-mcp --client claude"
|
|
1858
2137
|
});
|
|
1859
2138
|
}
|
|
1860
|
-
const geminiDir =
|
|
1861
|
-
if (
|
|
1862
|
-
const geminiConfig = readMcpConfig(
|
|
2139
|
+
const geminiDir = path12.join(cwd, ".gemini");
|
|
2140
|
+
if (fs5.existsSync(geminiDir)) {
|
|
2141
|
+
const geminiConfig = readMcpConfig(path12.join(geminiDir, "settings.json"));
|
|
1863
2142
|
if (geminiConfig.mcpServers?.["harness"]) {
|
|
1864
2143
|
results.push({
|
|
1865
2144
|
name: "mcp-gemini",
|
|
@@ -1878,12 +2157,12 @@ function checkMcpConfig(cwd) {
|
|
|
1878
2157
|
return results;
|
|
1879
2158
|
}
|
|
1880
2159
|
function loadMcpPresence(cwd) {
|
|
1881
|
-
const mcpPath =
|
|
1882
|
-
const geminiDir =
|
|
1883
|
-
const hasGemini =
|
|
2160
|
+
const mcpPath = path12.join(cwd, ".mcp.json");
|
|
2161
|
+
const geminiDir = path12.join(cwd, ".gemini");
|
|
2162
|
+
const hasGemini = fs5.existsSync(geminiDir);
|
|
1884
2163
|
return {
|
|
1885
2164
|
mcpConfig: readMcpConfig(mcpPath),
|
|
1886
|
-
geminiConfig: hasGemini ? readMcpConfig(
|
|
2165
|
+
geminiConfig: hasGemini ? readMcpConfig(path12.join(geminiDir, "settings.json")) : null,
|
|
1887
2166
|
hasGemini
|
|
1888
2167
|
};
|
|
1889
2168
|
}
|
|
@@ -1915,7 +2194,7 @@ function checkTier0Presence(def, presence) {
|
|
|
1915
2194
|
function checkIntegrations(cwd) {
|
|
1916
2195
|
const results = [];
|
|
1917
2196
|
const presence = loadMcpPresence(cwd);
|
|
1918
|
-
const configPath =
|
|
2197
|
+
const configPath = path12.join(cwd, "harness.config.json");
|
|
1919
2198
|
const integrationsConfig = readIntegrationsConfig(configPath);
|
|
1920
2199
|
for (const def of INTEGRATION_REGISTRY.filter((d) => d.tier === 0)) {
|
|
1921
2200
|
results.push(checkTier0Presence(def, presence));
|
|
@@ -1965,7 +2244,7 @@ function formatCheck(check) {
|
|
|
1965
2244
|
return line;
|
|
1966
2245
|
}
|
|
1967
2246
|
function createDoctorCommand() {
|
|
1968
|
-
return new
|
|
2247
|
+
return new Command18("doctor").description("Check environment health: Node version, slash commands, MCP configuration").action((_opts, cmd) => {
|
|
1969
2248
|
const globalOpts = cmd.optsWithGlobals();
|
|
1970
2249
|
const cwd = process.cwd();
|
|
1971
2250
|
const useJson = globalOpts.json;
|
|
@@ -1990,8 +2269,8 @@ function createDoctorCommand() {
|
|
|
1990
2269
|
}
|
|
1991
2270
|
|
|
1992
2271
|
// src/commands/fix-drift.ts
|
|
1993
|
-
import { Command as
|
|
1994
|
-
import * as
|
|
2272
|
+
import { Command as Command19 } from "commander";
|
|
2273
|
+
import * as path13 from "path";
|
|
1995
2274
|
async function runFixDrift(options) {
|
|
1996
2275
|
const cwd = options.cwd ?? process.cwd();
|
|
1997
2276
|
const dryRun = options.dryRun !== false;
|
|
@@ -2000,11 +2279,11 @@ async function runFixDrift(options) {
|
|
|
2000
2279
|
return Err(configResult.error);
|
|
2001
2280
|
}
|
|
2002
2281
|
const config = configResult.value;
|
|
2003
|
-
const rootDir =
|
|
2004
|
-
const docsDir =
|
|
2282
|
+
const rootDir = path13.resolve(cwd, config.rootDir);
|
|
2283
|
+
const docsDir = path13.resolve(cwd, config.docsDir);
|
|
2005
2284
|
const entropyConfig = {
|
|
2006
2285
|
rootDir,
|
|
2007
|
-
entryPoints: [
|
|
2286
|
+
entryPoints: [path13.join(rootDir, "src/index.ts")],
|
|
2008
2287
|
docPaths: [docsDir],
|
|
2009
2288
|
analyze: {
|
|
2010
2289
|
drift: true,
|
|
@@ -2123,7 +2402,7 @@ function printFixDriftResult(value, mode, formatter) {
|
|
|
2123
2402
|
}
|
|
2124
2403
|
}
|
|
2125
2404
|
function createFixDriftCommand() {
|
|
2126
|
-
const command = new
|
|
2405
|
+
const command = new Command19("fix-drift").description("Auto-fix entropy issues (doc drift, dead code)").option("--no-dry-run", "Actually apply fixes (default is dry-run mode)").action(async (opts, cmd) => {
|
|
2127
2406
|
const globalOpts = cmd.optsWithGlobals();
|
|
2128
2407
|
const mode = resolveOutputMode2(globalOpts);
|
|
2129
2408
|
const formatter = new OutputFormatter(mode);
|
|
@@ -2153,7 +2432,7 @@ function createFixDriftCommand() {
|
|
|
2153
2432
|
}
|
|
2154
2433
|
|
|
2155
2434
|
// src/commands/generate.ts
|
|
2156
|
-
import { Command as
|
|
2435
|
+
import { Command as Command20 } from "commander";
|
|
2157
2436
|
function validatePlatforms(platforms) {
|
|
2158
2437
|
for (const p of platforms) {
|
|
2159
2438
|
if (!VALID_PLATFORMS.includes(p)) {
|
|
@@ -2213,27 +2492,27 @@ async function runGenerateAction(opts, globalOpts) {
|
|
|
2213
2492
|
}
|
|
2214
2493
|
}
|
|
2215
2494
|
function createGenerateCommand() {
|
|
2216
|
-
return new
|
|
2495
|
+
return new Command20("generate").description("Generate all platform integrations (slash commands + agent definitions)").option("--platforms <list>", "Target platforms (comma-separated)", "claude-code,gemini-cli").option("--global", "Write to global directories", false).option("--include-global", "Include built-in global skills", false).option("--output <dir>", "Custom output directory").option("--dry-run", "Show what would change without writing", false).option("--yes", "Skip deletion confirmation prompts", false).action(async (opts, cmd) => {
|
|
2217
2496
|
await runGenerateAction(opts, cmd.optsWithGlobals());
|
|
2218
2497
|
});
|
|
2219
2498
|
}
|
|
2220
2499
|
|
|
2221
2500
|
// src/commands/graph/index.ts
|
|
2222
|
-
import { Command as
|
|
2501
|
+
import { Command as Command23 } from "commander";
|
|
2223
2502
|
|
|
2224
2503
|
// src/commands/graph/status.ts
|
|
2225
|
-
import * as
|
|
2504
|
+
import * as path14 from "path";
|
|
2226
2505
|
async function runGraphStatus(projectPath) {
|
|
2227
|
-
const { GraphStore } = await import("./dist-
|
|
2228
|
-
const graphDir =
|
|
2506
|
+
const { GraphStore } = await import("./dist-QW5G3GX3.js");
|
|
2507
|
+
const graphDir = path14.join(projectPath, ".harness", "graph");
|
|
2229
2508
|
const store = new GraphStore();
|
|
2230
2509
|
const loaded = await store.load(graphDir);
|
|
2231
2510
|
if (!loaded) return { status: "no_graph", message: "No graph found. Run `harness scan` first." };
|
|
2232
|
-
const
|
|
2233
|
-
const metaPath =
|
|
2511
|
+
const fs36 = await import("fs/promises");
|
|
2512
|
+
const metaPath = path14.join(graphDir, "metadata.json");
|
|
2234
2513
|
let lastScan = "unknown";
|
|
2235
2514
|
try {
|
|
2236
|
-
const meta = JSON.parse(await
|
|
2515
|
+
const meta = JSON.parse(await fs36.readFile(metaPath, "utf-8"));
|
|
2237
2516
|
lastScan = meta.lastScanTimestamp;
|
|
2238
2517
|
} catch {
|
|
2239
2518
|
}
|
|
@@ -2244,8 +2523,8 @@ async function runGraphStatus(projectPath) {
|
|
|
2244
2523
|
}
|
|
2245
2524
|
let connectorSyncStatus = {};
|
|
2246
2525
|
try {
|
|
2247
|
-
const syncMetaPath =
|
|
2248
|
-
const syncMeta = JSON.parse(await
|
|
2526
|
+
const syncMetaPath = path14.join(graphDir, "sync-metadata.json");
|
|
2527
|
+
const syncMeta = JSON.parse(await fs36.readFile(syncMetaPath, "utf-8"));
|
|
2249
2528
|
for (const [name, data] of Object.entries(syncMeta.connectors ?? {})) {
|
|
2250
2529
|
connectorSyncStatus[name] = data.lastSyncTimestamp;
|
|
2251
2530
|
}
|
|
@@ -2262,10 +2541,10 @@ async function runGraphStatus(projectPath) {
|
|
|
2262
2541
|
}
|
|
2263
2542
|
|
|
2264
2543
|
// src/commands/graph/export.ts
|
|
2265
|
-
import * as
|
|
2544
|
+
import * as path15 from "path";
|
|
2266
2545
|
async function runGraphExport(projectPath, format) {
|
|
2267
|
-
const { GraphStore } = await import("./dist-
|
|
2268
|
-
const graphDir =
|
|
2546
|
+
const { GraphStore } = await import("./dist-QW5G3GX3.js");
|
|
2547
|
+
const graphDir = path15.join(projectPath, ".harness", "graph");
|
|
2269
2548
|
const store = new GraphStore();
|
|
2270
2549
|
const loaded = await store.load(graphDir);
|
|
2271
2550
|
if (!loaded) throw new Error("No graph found. Run `harness scan` first.");
|
|
@@ -2296,50 +2575,11 @@ async function runGraphExport(projectPath, format) {
|
|
|
2296
2575
|
// src/commands/graph/index.ts
|
|
2297
2576
|
import * as path18 from "path";
|
|
2298
2577
|
|
|
2299
|
-
// src/commands/graph/scan.ts
|
|
2300
|
-
import { Command as Command19 } from "commander";
|
|
2301
|
-
import * as path15 from "path";
|
|
2302
|
-
async function runScan(projectPath) {
|
|
2303
|
-
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-M6FBUXZD.js");
|
|
2304
|
-
const store = new GraphStore();
|
|
2305
|
-
const start = Date.now();
|
|
2306
|
-
await new CodeIngestor(store).ingest(projectPath);
|
|
2307
|
-
new TopologicalLinker(store).link();
|
|
2308
|
-
const knowledgeIngestor = new KnowledgeIngestor(store);
|
|
2309
|
-
await knowledgeIngestor.ingestAll(projectPath);
|
|
2310
|
-
try {
|
|
2311
|
-
await new GitIngestor(store).ingest(projectPath);
|
|
2312
|
-
} catch {
|
|
2313
|
-
}
|
|
2314
|
-
const graphDir = path15.join(projectPath, ".harness", "graph");
|
|
2315
|
-
await store.save(graphDir);
|
|
2316
|
-
return { nodeCount: store.nodeCount, edgeCount: store.edgeCount, durationMs: Date.now() - start };
|
|
2317
|
-
}
|
|
2318
|
-
function createScanCommand() {
|
|
2319
|
-
return new Command19("scan").description("Scan project and build knowledge graph").argument("[path]", "Project root path", ".").action(async (inputPath, _opts, cmd) => {
|
|
2320
|
-
const projectPath = path15.resolve(inputPath);
|
|
2321
|
-
const globalOpts = cmd.optsWithGlobals();
|
|
2322
|
-
try {
|
|
2323
|
-
const result = await runScan(projectPath);
|
|
2324
|
-
if (globalOpts.json) {
|
|
2325
|
-
console.log(JSON.stringify(result));
|
|
2326
|
-
} else {
|
|
2327
|
-
console.log(
|
|
2328
|
-
`Graph built: ${result.nodeCount} nodes, ${result.edgeCount} edges (${result.durationMs}ms)`
|
|
2329
|
-
);
|
|
2330
|
-
}
|
|
2331
|
-
} catch (err) {
|
|
2332
|
-
console.error("Scan failed:", err instanceof Error ? err.message : err);
|
|
2333
|
-
process.exit(2);
|
|
2334
|
-
}
|
|
2335
|
-
});
|
|
2336
|
-
}
|
|
2337
|
-
|
|
2338
2578
|
// src/commands/graph/query.ts
|
|
2339
|
-
import { Command as
|
|
2579
|
+
import { Command as Command21 } from "commander";
|
|
2340
2580
|
import * as path16 from "path";
|
|
2341
2581
|
async function runQuery(projectPath, rootNodeId, opts) {
|
|
2342
|
-
const { GraphStore, ContextQL } = await import("./dist-
|
|
2582
|
+
const { GraphStore, ContextQL } = await import("./dist-QW5G3GX3.js");
|
|
2343
2583
|
const store = new GraphStore();
|
|
2344
2584
|
const graphDir = path16.join(projectPath, ".harness", "graph");
|
|
2345
2585
|
const loaded = await store.load(graphDir);
|
|
@@ -2382,23 +2622,21 @@ async function runQueryAction(rootNodeId, opts, globalOpts) {
|
|
|
2382
2622
|
}
|
|
2383
2623
|
}
|
|
2384
2624
|
function createQueryCommand() {
|
|
2385
|
-
return new
|
|
2625
|
+
return new Command21("query").description("Query the knowledge graph").argument("<rootNodeId>", "Starting node ID").option("--depth <n>", "Max traversal depth", "3").option("--types <types>", "Comma-separated node types to include").option("--edges <edges>", "Comma-separated edge types to include").option("--bidirectional", "Traverse both directions").action(async (rootNodeId, opts, cmd) => {
|
|
2386
2626
|
await runQueryAction(rootNodeId, opts, cmd.optsWithGlobals());
|
|
2387
2627
|
});
|
|
2388
2628
|
}
|
|
2389
2629
|
|
|
2390
2630
|
// src/commands/graph/ingest.ts
|
|
2391
|
-
import { Command as
|
|
2631
|
+
import { Command as Command22 } from "commander";
|
|
2392
2632
|
import * as path17 from "path";
|
|
2393
2633
|
async function loadConnectorConfig(projectPath, source) {
|
|
2394
2634
|
try {
|
|
2395
|
-
const
|
|
2635
|
+
const fs36 = await import("fs/promises");
|
|
2396
2636
|
const configPath = path17.join(projectPath, "harness.config.json");
|
|
2397
|
-
const config = JSON.parse(await
|
|
2398
|
-
const connector = config.graph?.connectors?.
|
|
2399
|
-
|
|
2400
|
-
);
|
|
2401
|
-
return connector?.config ?? {};
|
|
2637
|
+
const config = JSON.parse(await fs36.readFile(configPath, "utf-8"));
|
|
2638
|
+
const connector = config.graph?.connectors?.[source];
|
|
2639
|
+
return connector ?? {};
|
|
2402
2640
|
} catch {
|
|
2403
2641
|
return {};
|
|
2404
2642
|
}
|
|
@@ -2432,8 +2670,10 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2432
2670
|
GitIngestor,
|
|
2433
2671
|
SyncManager,
|
|
2434
2672
|
JiraConnector,
|
|
2435
|
-
SlackConnector
|
|
2436
|
-
|
|
2673
|
+
SlackConnector,
|
|
2674
|
+
CIConnector,
|
|
2675
|
+
ConfluenceConnector
|
|
2676
|
+
} = await import("./dist-QW5G3GX3.js");
|
|
2437
2677
|
const graphDir = path17.join(projectPath, ".harness", "graph");
|
|
2438
2678
|
const store = new GraphStore();
|
|
2439
2679
|
await store.load(graphDir);
|
|
@@ -2446,7 +2686,9 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2446
2686
|
const syncManager = new SyncManager(store, graphDir);
|
|
2447
2687
|
const connectorMap = {
|
|
2448
2688
|
jira: () => new JiraConnector(),
|
|
2449
|
-
slack: () => new SlackConnector()
|
|
2689
|
+
slack: () => new SlackConnector(),
|
|
2690
|
+
ci: () => new CIConnector(),
|
|
2691
|
+
confluence: () => new ConfluenceConnector()
|
|
2450
2692
|
};
|
|
2451
2693
|
for (const [name, factory] of Object.entries(connectorMap)) {
|
|
2452
2694
|
const config = await loadConnectorConfig(projectPath, name);
|
|
@@ -2470,9 +2712,11 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2470
2712
|
result = await new GitIngestor(store).ingest(projectPath);
|
|
2471
2713
|
break;
|
|
2472
2714
|
default: {
|
|
2473
|
-
const knownConnectors = ["jira", "slack"];
|
|
2715
|
+
const knownConnectors = ["jira", "slack", "ci", "confluence"];
|
|
2474
2716
|
if (!knownConnectors.includes(source)) {
|
|
2475
|
-
throw new Error(
|
|
2717
|
+
throw new Error(
|
|
2718
|
+
`Unknown source: ${source}. Available: code, knowledge, git, jira, slack, ci, confluence`
|
|
2719
|
+
);
|
|
2476
2720
|
}
|
|
2477
2721
|
if (!SyncManager) {
|
|
2478
2722
|
throw new Error(
|
|
@@ -2482,7 +2726,9 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2482
2726
|
const syncManager = new SyncManager(store, graphDir);
|
|
2483
2727
|
const extConnectorMap = {
|
|
2484
2728
|
jira: () => new JiraConnector(),
|
|
2485
|
-
slack: () => new SlackConnector()
|
|
2729
|
+
slack: () => new SlackConnector(),
|
|
2730
|
+
ci: () => new CIConnector(),
|
|
2731
|
+
confluence: () => new ConfluenceConnector()
|
|
2486
2732
|
};
|
|
2487
2733
|
const factory = extConnectorMap[source];
|
|
2488
2734
|
const config = await loadConnectorConfig(projectPath, source);
|
|
@@ -2495,7 +2741,10 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2495
2741
|
return result;
|
|
2496
2742
|
}
|
|
2497
2743
|
function createIngestCommand() {
|
|
2498
|
-
return new
|
|
2744
|
+
return new Command22("ingest").description("Ingest data into the knowledge graph").option(
|
|
2745
|
+
"--source <name>",
|
|
2746
|
+
"Source to ingest (code, knowledge, git, jira, slack, ci, confluence)"
|
|
2747
|
+
).option("--all", "Run all sources (code, knowledge, git, and configured connectors)").option("--full", "Force full re-ingestion").action(async (opts, cmd) => {
|
|
2499
2748
|
if (!opts.source && !opts.all) {
|
|
2500
2749
|
console.error("Error: --source or --all is required");
|
|
2501
2750
|
process.exit(1);
|
|
@@ -2568,18 +2817,18 @@ async function runExportAction(opts, cmd) {
|
|
|
2568
2817
|
}
|
|
2569
2818
|
}
|
|
2570
2819
|
function createGraphCommand() {
|
|
2571
|
-
const graph = new
|
|
2820
|
+
const graph = new Command23("graph").description("Knowledge graph management");
|
|
2572
2821
|
graph.command("status").description("Show graph statistics").action(runStatusAction);
|
|
2573
2822
|
graph.command("export").description("Export graph").requiredOption("--format <format>", "Output format (json, mermaid)").action(runExportAction);
|
|
2574
2823
|
return graph;
|
|
2575
2824
|
}
|
|
2576
2825
|
|
|
2577
2826
|
// src/commands/hooks/index.ts
|
|
2578
|
-
import { Command as
|
|
2827
|
+
import { Command as Command28 } from "commander";
|
|
2579
2828
|
|
|
2580
2829
|
// src/commands/hooks/init.ts
|
|
2581
|
-
import { Command as
|
|
2582
|
-
import * as
|
|
2830
|
+
import { Command as Command24 } from "commander";
|
|
2831
|
+
import * as fs6 from "fs";
|
|
2583
2832
|
import * as path19 from "path";
|
|
2584
2833
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
2585
2834
|
|
|
@@ -2589,6 +2838,8 @@ var HOOK_SCRIPTS = [
|
|
|
2589
2838
|
{ name: "protect-config", event: "PreToolUse", matcher: "Write|Edit", minProfile: "standard" },
|
|
2590
2839
|
{ name: "quality-gate", event: "PostToolUse", matcher: "Edit|Write", minProfile: "standard" },
|
|
2591
2840
|
{ name: "pre-compact-state", event: "PreCompact", matcher: "*", minProfile: "standard" },
|
|
2841
|
+
{ name: "adoption-tracker", event: "Stop", matcher: "*", minProfile: "standard" },
|
|
2842
|
+
{ name: "telemetry-reporter", event: "Stop", matcher: "*", minProfile: "standard" },
|
|
2592
2843
|
{ name: "cost-tracker", event: "Stop", matcher: "*", minProfile: "strict" },
|
|
2593
2844
|
{ name: "sentinel-pre", event: "PreToolUse", matcher: "*", minProfile: "strict" },
|
|
2594
2845
|
{ name: "sentinel-post", event: "PostToolUse", matcher: "*", minProfile: "strict" }
|
|
@@ -2612,7 +2863,7 @@ var __dirname2 = path19.dirname(__filename2);
|
|
|
2612
2863
|
var VALID_PROFILES = ["minimal", "standard", "strict"];
|
|
2613
2864
|
function resolveHookSourceDir() {
|
|
2614
2865
|
const candidate = path19.resolve(__dirname2, "..", "..", "hooks");
|
|
2615
|
-
if (
|
|
2866
|
+
if (fs6.existsSync(candidate)) {
|
|
2616
2867
|
return candidate;
|
|
2617
2868
|
}
|
|
2618
2869
|
throw new Error(`Cannot locate hook scripts directory. Expected at: ${candidate}`);
|
|
@@ -2641,11 +2892,11 @@ function mergeSettings(existing, hooksConfig) {
|
|
|
2641
2892
|
function initHooks(options) {
|
|
2642
2893
|
const { profile, projectDir } = options;
|
|
2643
2894
|
const hooksDestDir = path19.join(projectDir, ".harness", "hooks");
|
|
2644
|
-
|
|
2645
|
-
if (
|
|
2646
|
-
for (const entry of
|
|
2895
|
+
fs6.mkdirSync(hooksDestDir, { recursive: true });
|
|
2896
|
+
if (fs6.existsSync(hooksDestDir)) {
|
|
2897
|
+
for (const entry of fs6.readdirSync(hooksDestDir)) {
|
|
2647
2898
|
if (entry.endsWith(".js")) {
|
|
2648
|
-
|
|
2899
|
+
fs6.unlinkSync(path19.join(hooksDestDir, entry));
|
|
2649
2900
|
}
|
|
2650
2901
|
}
|
|
2651
2902
|
}
|
|
@@ -2656,20 +2907,20 @@ function initHooks(options) {
|
|
|
2656
2907
|
for (const script of activeScripts) {
|
|
2657
2908
|
const srcFile = path19.join(sourceDir, `${script.name}.js`);
|
|
2658
2909
|
const destFile = path19.join(hooksDestDir, `${script.name}.js`);
|
|
2659
|
-
if (
|
|
2660
|
-
|
|
2910
|
+
if (fs6.existsSync(srcFile)) {
|
|
2911
|
+
fs6.copyFileSync(srcFile, destFile);
|
|
2661
2912
|
copiedScripts.push(script.name);
|
|
2662
2913
|
}
|
|
2663
2914
|
}
|
|
2664
2915
|
const profilePath = path19.join(hooksDestDir, "profile.json");
|
|
2665
|
-
|
|
2916
|
+
fs6.writeFileSync(profilePath, JSON.stringify({ profile }, null, 2) + "\n");
|
|
2666
2917
|
const claudeDir = path19.join(projectDir, ".claude");
|
|
2667
|
-
|
|
2918
|
+
fs6.mkdirSync(claudeDir, { recursive: true });
|
|
2668
2919
|
const settingsPath = path19.join(claudeDir, "settings.json");
|
|
2669
2920
|
let existing = {};
|
|
2670
|
-
if (
|
|
2921
|
+
if (fs6.existsSync(settingsPath)) {
|
|
2671
2922
|
try {
|
|
2672
|
-
existing = JSON.parse(
|
|
2923
|
+
existing = JSON.parse(fs6.readFileSync(settingsPath, "utf-8"));
|
|
2673
2924
|
} catch (e) {
|
|
2674
2925
|
throw new Error(
|
|
2675
2926
|
`Malformed .claude/settings.json \u2014 fix the JSON syntax before running hooks init. Parse error: ${e instanceof Error ? e.message : String(e)}`,
|
|
@@ -2679,11 +2930,11 @@ function initHooks(options) {
|
|
|
2679
2930
|
}
|
|
2680
2931
|
const hooksConfig = buildSettingsHooks(profile);
|
|
2681
2932
|
const merged = mergeSettings(existing, hooksConfig);
|
|
2682
|
-
|
|
2933
|
+
fs6.writeFileSync(settingsPath, JSON.stringify(merged, null, 2) + "\n");
|
|
2683
2934
|
return { copiedScripts, settingsPath, profilePath };
|
|
2684
2935
|
}
|
|
2685
2936
|
function createInitCommand2() {
|
|
2686
|
-
return new
|
|
2937
|
+
return new Command24("init").description("Install Claude Code hook configurations into the current project").option("--profile <profile>", "Hook profile: minimal, standard, or strict", "standard").action(async (opts, cmd) => {
|
|
2687
2938
|
const globalOpts = cmd.optsWithGlobals();
|
|
2688
2939
|
const profile = opts.profile;
|
|
2689
2940
|
if (!VALID_PROFILES.includes(profile)) {
|
|
@@ -2719,19 +2970,19 @@ function createInitCommand2() {
|
|
|
2719
2970
|
}
|
|
2720
2971
|
|
|
2721
2972
|
// src/commands/hooks/list.ts
|
|
2722
|
-
import { Command as
|
|
2723
|
-
import * as
|
|
2973
|
+
import { Command as Command25 } from "commander";
|
|
2974
|
+
import * as fs7 from "fs";
|
|
2724
2975
|
import * as path20 from "path";
|
|
2725
2976
|
function listHooks(projectDir) {
|
|
2726
2977
|
const hooksDir = path20.join(projectDir, ".harness", "hooks");
|
|
2727
2978
|
const profilePath = path20.join(hooksDir, "profile.json");
|
|
2728
|
-
if (!
|
|
2979
|
+
if (!fs7.existsSync(profilePath)) {
|
|
2729
2980
|
return { installed: false, profile: null, hooks: [] };
|
|
2730
2981
|
}
|
|
2731
2982
|
let profile = "standard";
|
|
2732
2983
|
let warning;
|
|
2733
2984
|
try {
|
|
2734
|
-
const data = JSON.parse(
|
|
2985
|
+
const data = JSON.parse(fs7.readFileSync(profilePath, "utf-8"));
|
|
2735
2986
|
if (data.profile && ["minimal", "standard", "strict"].includes(data.profile)) {
|
|
2736
2987
|
profile = data.profile;
|
|
2737
2988
|
}
|
|
@@ -2752,7 +3003,7 @@ function listHooks(projectDir) {
|
|
|
2752
3003
|
return result;
|
|
2753
3004
|
}
|
|
2754
3005
|
function createListCommand() {
|
|
2755
|
-
return new
|
|
3006
|
+
return new Command25("list").description("Show installed hooks and active profile").action(async (_opts, cmd) => {
|
|
2756
3007
|
const globalOpts = cmd.optsWithGlobals();
|
|
2757
3008
|
const projectDir = process.cwd();
|
|
2758
3009
|
const result = listHooks(projectDir);
|
|
@@ -2773,28 +3024,28 @@ function createListCommand() {
|
|
|
2773
3024
|
}
|
|
2774
3025
|
|
|
2775
3026
|
// src/commands/hooks/remove.ts
|
|
2776
|
-
import { Command as
|
|
2777
|
-
import * as
|
|
3027
|
+
import { Command as Command26 } from "commander";
|
|
3028
|
+
import * as fs8 from "fs";
|
|
2778
3029
|
import * as path21 from "path";
|
|
2779
3030
|
function removeHooks(projectDir) {
|
|
2780
3031
|
const hooksDir = path21.join(projectDir, ".harness", "hooks");
|
|
2781
3032
|
const settingsPath = path21.join(projectDir, ".claude", "settings.json");
|
|
2782
3033
|
let removed = false;
|
|
2783
3034
|
let settingsCleaned = false;
|
|
2784
|
-
if (
|
|
2785
|
-
|
|
3035
|
+
if (fs8.existsSync(hooksDir)) {
|
|
3036
|
+
fs8.rmSync(hooksDir, { recursive: true, force: true });
|
|
2786
3037
|
removed = true;
|
|
2787
3038
|
}
|
|
2788
|
-
if (
|
|
3039
|
+
if (fs8.existsSync(settingsPath)) {
|
|
2789
3040
|
try {
|
|
2790
|
-
const settings = JSON.parse(
|
|
3041
|
+
const settings = JSON.parse(fs8.readFileSync(settingsPath, "utf-8"));
|
|
2791
3042
|
if (settings.hooks !== void 0) {
|
|
2792
3043
|
delete settings.hooks;
|
|
2793
3044
|
settingsCleaned = true;
|
|
2794
3045
|
if (Object.keys(settings).length === 0) {
|
|
2795
|
-
|
|
3046
|
+
fs8.unlinkSync(settingsPath);
|
|
2796
3047
|
} else {
|
|
2797
|
-
|
|
3048
|
+
fs8.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
2798
3049
|
}
|
|
2799
3050
|
}
|
|
2800
3051
|
} catch {
|
|
@@ -2803,7 +3054,7 @@ function removeHooks(projectDir) {
|
|
|
2803
3054
|
return { removed, hooksDir, settingsCleaned };
|
|
2804
3055
|
}
|
|
2805
3056
|
function createRemoveCommand() {
|
|
2806
|
-
return new
|
|
3057
|
+
return new Command26("remove").description("Remove harness-managed hooks from the current project").action(async (_opts, cmd) => {
|
|
2807
3058
|
const globalOpts = cmd.optsWithGlobals();
|
|
2808
3059
|
const projectDir = process.cwd();
|
|
2809
3060
|
const result = removeHooks(projectDir);
|
|
@@ -2825,8 +3076,8 @@ function createRemoveCommand() {
|
|
|
2825
3076
|
}
|
|
2826
3077
|
|
|
2827
3078
|
// src/commands/hooks/add.ts
|
|
2828
|
-
import { Command as
|
|
2829
|
-
import * as
|
|
3079
|
+
import { Command as Command27 } from "commander";
|
|
3080
|
+
import * as fs9 from "fs";
|
|
2830
3081
|
import * as path22 from "path";
|
|
2831
3082
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
2832
3083
|
var __dirname3 = path22.dirname(fileURLToPath3(import.meta.url));
|
|
@@ -2835,11 +3086,11 @@ var ALIASES = {
|
|
|
2835
3086
|
};
|
|
2836
3087
|
function hookSourceDir() {
|
|
2837
3088
|
const d = path22.resolve(__dirname3, "..", "..", "hooks");
|
|
2838
|
-
if (
|
|
3089
|
+
if (fs9.existsSync(d)) return d;
|
|
2839
3090
|
throw new Error(`Hook scripts not found: ${d}`);
|
|
2840
3091
|
}
|
|
2841
3092
|
function readJson(p) {
|
|
2842
|
-
return
|
|
3093
|
+
return fs9.existsSync(p) ? JSON.parse(fs9.readFileSync(p, "utf-8")) : {};
|
|
2843
3094
|
}
|
|
2844
3095
|
function registerHook(s, ev, matcher, name) {
|
|
2845
3096
|
if (!s.hooks[ev]) s.hooks[ev] = [];
|
|
@@ -2853,9 +3104,9 @@ function addHooks(hookName, projectDir) {
|
|
|
2853
3104
|
const result = { added: [], alreadyInstalled: [], notFound: [] };
|
|
2854
3105
|
const srcDir = hookSourceDir();
|
|
2855
3106
|
const destDir = path22.join(projectDir, ".harness", "hooks");
|
|
2856
|
-
|
|
3107
|
+
fs9.mkdirSync(destDir, { recursive: true });
|
|
2857
3108
|
const claudeDir = path22.join(projectDir, ".claude");
|
|
2858
|
-
|
|
3109
|
+
fs9.mkdirSync(claudeDir, { recursive: true });
|
|
2859
3110
|
const settingsPath = path22.join(claudeDir, "settings.json");
|
|
2860
3111
|
const settings = readJson(settingsPath);
|
|
2861
3112
|
if (!settings.hooks) settings.hooks = {};
|
|
@@ -2867,22 +3118,22 @@ function addHooks(hookName, projectDir) {
|
|
|
2867
3118
|
}
|
|
2868
3119
|
const src = path22.join(srcDir, `${name}.js`);
|
|
2869
3120
|
const dest = path22.join(destDir, `${name}.js`);
|
|
2870
|
-
if (
|
|
3121
|
+
if (fs9.existsSync(dest)) {
|
|
2871
3122
|
result.alreadyInstalled.push(name);
|
|
2872
|
-
} else if (!
|
|
3123
|
+
} else if (!fs9.existsSync(src)) {
|
|
2873
3124
|
result.notFound.push(name);
|
|
2874
3125
|
continue;
|
|
2875
3126
|
} else {
|
|
2876
|
-
|
|
3127
|
+
fs9.copyFileSync(src, dest);
|
|
2877
3128
|
result.added.push(name);
|
|
2878
3129
|
}
|
|
2879
3130
|
registerHook(settings, def.event, def.matcher, name);
|
|
2880
3131
|
}
|
|
2881
|
-
|
|
3132
|
+
fs9.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
2882
3133
|
return result;
|
|
2883
3134
|
}
|
|
2884
3135
|
function createAddCommand2() {
|
|
2885
|
-
return new
|
|
3136
|
+
return new Command27("add").argument("<hook-name>", "Hook name or alias (e.g., sentinel)").description("Add a hook without changing the profile").action(async (hookName, _opts, cmd) => {
|
|
2886
3137
|
const projectDir = process.cwd();
|
|
2887
3138
|
try {
|
|
2888
3139
|
const res = addHooks(hookName, projectDir);
|
|
@@ -2907,7 +3158,7 @@ function createAddCommand2() {
|
|
|
2907
3158
|
|
|
2908
3159
|
// src/commands/hooks/index.ts
|
|
2909
3160
|
function createHooksCommand() {
|
|
2910
|
-
const command = new
|
|
3161
|
+
const command = new Command28("hooks").description("Manage Claude Code hook configurations");
|
|
2911
3162
|
command.addCommand(createInitCommand2());
|
|
2912
3163
|
command.addCommand(createListCommand());
|
|
2913
3164
|
command.addCommand(createRemoveCommand());
|
|
@@ -2916,10 +3167,10 @@ function createHooksCommand() {
|
|
|
2916
3167
|
}
|
|
2917
3168
|
|
|
2918
3169
|
// src/commands/impact-preview.ts
|
|
2919
|
-
import { Command as
|
|
3170
|
+
import { Command as Command29 } from "commander";
|
|
2920
3171
|
import { execSync as execSync4 } from "child_process";
|
|
2921
3172
|
import * as path23 from "path";
|
|
2922
|
-
import * as
|
|
3173
|
+
import * as fs10 from "fs";
|
|
2923
3174
|
function getStagedFiles(cwd) {
|
|
2924
3175
|
try {
|
|
2925
3176
|
const output = execSync4("git diff --cached --name-only", {
|
|
@@ -2933,7 +3184,7 @@ function getStagedFiles(cwd) {
|
|
|
2933
3184
|
}
|
|
2934
3185
|
function graphExists(projectPath) {
|
|
2935
3186
|
try {
|
|
2936
|
-
return
|
|
3187
|
+
return fs10.existsSync(path23.join(projectPath, ".harness", "graph", "graph.json"));
|
|
2937
3188
|
} catch {
|
|
2938
3189
|
return false;
|
|
2939
3190
|
}
|
|
@@ -3115,7 +3366,7 @@ async function runImpactPreview(options) {
|
|
|
3115
3366
|
return formatImpactOutput(stagedFiles, acc, options);
|
|
3116
3367
|
}
|
|
3117
3368
|
function createImpactPreviewCommand() {
|
|
3118
|
-
const command = new
|
|
3369
|
+
const command = new Command29("impact-preview").description("Show blast radius of staged changes using the knowledge graph").option("--detailed", "Show all affected files instead of top items").option("--per-file", "Show impact per staged file instead of aggregate").option("--path <dir>", "Project root (default: cwd)").action(async (opts) => {
|
|
3119
3370
|
const output = await runImpactPreview({
|
|
3120
3371
|
detailed: opts.detailed,
|
|
3121
3372
|
perFile: opts.perFile,
|
|
@@ -3128,28 +3379,28 @@ function createImpactPreviewCommand() {
|
|
|
3128
3379
|
}
|
|
3129
3380
|
|
|
3130
3381
|
// src/commands/init.ts
|
|
3131
|
-
import { Command as
|
|
3382
|
+
import { Command as Command31 } from "commander";
|
|
3132
3383
|
import chalk3 from "chalk";
|
|
3133
|
-
import * as
|
|
3384
|
+
import * as fs13 from "fs";
|
|
3134
3385
|
import * as path26 from "path";
|
|
3135
3386
|
|
|
3136
3387
|
// src/commands/setup-mcp.ts
|
|
3137
|
-
import { Command as
|
|
3138
|
-
import * as
|
|
3388
|
+
import { Command as Command30 } from "commander";
|
|
3389
|
+
import * as fs12 from "fs";
|
|
3139
3390
|
import * as path25 from "path";
|
|
3140
3391
|
import * as os2 from "os";
|
|
3141
3392
|
import chalk2 from "chalk";
|
|
3142
3393
|
import * as clack from "@clack/prompts";
|
|
3143
3394
|
|
|
3144
3395
|
// src/integrations/toml.ts
|
|
3145
|
-
import * as
|
|
3396
|
+
import * as fs11 from "fs";
|
|
3146
3397
|
import * as path24 from "path";
|
|
3147
3398
|
function writeTomlMcpEntry(filePath, name, entry) {
|
|
3148
3399
|
const dir = path24.dirname(filePath);
|
|
3149
|
-
if (!
|
|
3150
|
-
|
|
3400
|
+
if (!fs11.existsSync(dir)) {
|
|
3401
|
+
fs11.mkdirSync(dir, { recursive: true });
|
|
3151
3402
|
}
|
|
3152
|
-
const existing =
|
|
3403
|
+
const existing = fs11.existsSync(filePath) ? fs11.readFileSync(filePath, "utf-8") : "";
|
|
3153
3404
|
const blockHeader = `[mcp_servers.${name}]`;
|
|
3154
3405
|
const newBlock = serializeTomlMcpBlock(name, entry);
|
|
3155
3406
|
let updated;
|
|
@@ -3160,8 +3411,8 @@ function writeTomlMcpEntry(filePath, name, entry) {
|
|
|
3160
3411
|
updated = existing + separator + newBlock;
|
|
3161
3412
|
}
|
|
3162
3413
|
const tmp = filePath + ".tmp";
|
|
3163
|
-
|
|
3164
|
-
|
|
3414
|
+
fs11.writeFileSync(tmp, updated);
|
|
3415
|
+
fs11.renameSync(tmp, filePath);
|
|
3165
3416
|
}
|
|
3166
3417
|
function serializeTomlMcpBlock(name, entry) {
|
|
3167
3418
|
const lines = [`[mcp_servers.${name}]`];
|
|
@@ -3288,7 +3539,8 @@ var ALL_MCP_TOOLS = [
|
|
|
3288
3539
|
"predict_failures",
|
|
3289
3540
|
"recommend_skills",
|
|
3290
3541
|
"compute_blast_radius",
|
|
3291
|
-
"dispatch_skills"
|
|
3542
|
+
"dispatch_skills",
|
|
3543
|
+
"compact"
|
|
3292
3544
|
];
|
|
3293
3545
|
async function runCursorToolPicker() {
|
|
3294
3546
|
try {
|
|
@@ -3316,20 +3568,20 @@ function writeCursorMcpEntryWithTools(configPath, tools) {
|
|
|
3316
3568
|
});
|
|
3317
3569
|
}
|
|
3318
3570
|
function readJsonFile(filePath) {
|
|
3319
|
-
if (!
|
|
3571
|
+
if (!fs12.existsSync(filePath)) return null;
|
|
3320
3572
|
try {
|
|
3321
|
-
return JSON.parse(
|
|
3573
|
+
return JSON.parse(fs12.readFileSync(filePath, "utf-8"));
|
|
3322
3574
|
} catch {
|
|
3323
|
-
|
|
3575
|
+
fs12.copyFileSync(filePath, filePath + ".bak");
|
|
3324
3576
|
return null;
|
|
3325
3577
|
}
|
|
3326
3578
|
}
|
|
3327
3579
|
function writeJsonFile(filePath, data) {
|
|
3328
|
-
const dir = path25.dirname(filePath);
|
|
3329
|
-
if (!
|
|
3330
|
-
|
|
3580
|
+
const dir = path25.dirname(filePath);
|
|
3581
|
+
if (!fs12.existsSync(dir)) {
|
|
3582
|
+
fs12.mkdirSync(dir, { recursive: true });
|
|
3331
3583
|
}
|
|
3332
|
-
|
|
3584
|
+
fs12.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n");
|
|
3333
3585
|
}
|
|
3334
3586
|
function configureMcpServer(configPath) {
|
|
3335
3587
|
const config = readJsonFile(configPath) ?? {};
|
|
@@ -3377,8 +3629,8 @@ function setupMcp(cwd, client) {
|
|
|
3377
3629
|
if (client === "all" || client === "codex") {
|
|
3378
3630
|
const configPath = path25.join(cwd, ".codex", "config.toml");
|
|
3379
3631
|
const alreadyConfigured = (() => {
|
|
3380
|
-
if (!
|
|
3381
|
-
const content =
|
|
3632
|
+
if (!fs12.existsSync(configPath)) return false;
|
|
3633
|
+
const content = fs12.readFileSync(configPath, "utf-8");
|
|
3382
3634
|
return content.includes("[mcp_servers.harness]");
|
|
3383
3635
|
})();
|
|
3384
3636
|
if (alreadyConfigured) {
|
|
@@ -3451,7 +3703,7 @@ function printMcpResult(configured, skipped, trustedFolder) {
|
|
|
3451
3703
|
console.log("");
|
|
3452
3704
|
}
|
|
3453
3705
|
function createSetupMcpCommand() {
|
|
3454
|
-
return new
|
|
3706
|
+
return new Command30("setup-mcp").description("Configure MCP server for AI agent integration").option("--client <client>", "Client to configure (claude, gemini, codex, cursor, all)", "all").option("--pick", "Launch interactive tool picker (Cursor only)").option("--yes", "Bypass interactive picker and use curated 25-tool set (Cursor only)").action(async (opts, cmd) => {
|
|
3455
3707
|
const globalOpts = cmd.optsWithGlobals();
|
|
3456
3708
|
const cwd = process.cwd();
|
|
3457
3709
|
let configured;
|
|
@@ -3483,7 +3735,7 @@ function resolveInitDefaults(options) {
|
|
|
3483
3735
|
async function runInit(options) {
|
|
3484
3736
|
const { cwd, name, force } = resolveInitDefaults(options);
|
|
3485
3737
|
const configPath = path26.join(cwd, "harness.config.json");
|
|
3486
|
-
if (!force &&
|
|
3738
|
+
if (!force && fs13.existsSync(configPath)) {
|
|
3487
3739
|
return Err(
|
|
3488
3740
|
new CLIError("Project already initialized. Use --force to overwrite.", ExitCode.ERROR)
|
|
3489
3741
|
);
|
|
@@ -3549,6 +3801,7 @@ function scaffoldProject(engine, ctx) {
|
|
|
3549
3801
|
}
|
|
3550
3802
|
persistToolingConfig(cwd, resolveResult.value, options.framework);
|
|
3551
3803
|
appendFrameworkAgents(cwd, options.framework, language);
|
|
3804
|
+
ensureHarnessGitignore(cwd);
|
|
3552
3805
|
return Ok({
|
|
3553
3806
|
filesCreated: writeResult.value.written,
|
|
3554
3807
|
skippedConfigs: writeResult.value.skippedConfigs
|
|
@@ -3590,7 +3843,7 @@ async function runInitAction2(opts) {
|
|
|
3590
3843
|
process.exit(ExitCode.SUCCESS);
|
|
3591
3844
|
}
|
|
3592
3845
|
function createInitCommand3() {
|
|
3593
|
-
const command = new
|
|
3846
|
+
const command = new Command31("init").description("Initialize a new harness-engineering project").option("-n, --name <name>", "Project name").option("-l, --level <level>", "Adoption level (basic, intermediate, advanced)", "basic").option("--framework <framework>", "Framework overlay (nextjs)").option("--language <language>", "Target language (typescript, python, go, rust, java)").option("-f, --force", "Overwrite existing files").option("-y, --yes", "Use defaults without prompting").action(async (opts, cmd) => {
|
|
3594
3847
|
const globalOpts = cmd.optsWithGlobals();
|
|
3595
3848
|
await runInitAction2({
|
|
3596
3849
|
name: opts.name,
|
|
@@ -3605,15 +3858,15 @@ function createInitCommand3() {
|
|
|
3605
3858
|
}
|
|
3606
3859
|
|
|
3607
3860
|
// src/commands/install.ts
|
|
3608
|
-
import * as
|
|
3861
|
+
import * as fs18 from "fs";
|
|
3609
3862
|
import * as os5 from "os";
|
|
3610
3863
|
import * as path31 from "path";
|
|
3611
3864
|
import { execFileSync as execFileSync3 } from "child_process";
|
|
3612
|
-
import { Command as
|
|
3865
|
+
import { Command as Command32 } from "commander";
|
|
3613
3866
|
import { parse as yamlParse } from "yaml";
|
|
3614
3867
|
|
|
3615
3868
|
// src/registry/npm-client.ts
|
|
3616
|
-
import * as
|
|
3869
|
+
import * as fs14 from "fs";
|
|
3617
3870
|
import * as path27 from "path";
|
|
3618
3871
|
import * as os3 from "os";
|
|
3619
3872
|
var NPM_REGISTRY = "https://registry.npmjs.org";
|
|
@@ -3640,7 +3893,7 @@ function readNpmrcToken(registryUrl) {
|
|
|
3640
3893
|
const candidates = [path27.join(process.cwd(), ".npmrc"), path27.join(os3.homedir(), ".npmrc")];
|
|
3641
3894
|
for (const npmrcPath of candidates) {
|
|
3642
3895
|
try {
|
|
3643
|
-
const content =
|
|
3896
|
+
const content = fs14.readFileSync(npmrcPath, "utf-8");
|
|
3644
3897
|
for (const line of content.split("\n")) {
|
|
3645
3898
|
const trimmed = line.trim();
|
|
3646
3899
|
if (trimmed.startsWith(registryPath)) {
|
|
@@ -3735,19 +3988,19 @@ async function searchNpmRegistry(query, registryUrl) {
|
|
|
3735
3988
|
}
|
|
3736
3989
|
|
|
3737
3990
|
// src/registry/tarball.ts
|
|
3738
|
-
import * as
|
|
3991
|
+
import * as fs15 from "fs";
|
|
3739
3992
|
import * as path28 from "path";
|
|
3740
3993
|
import * as os4 from "os";
|
|
3741
3994
|
import { execFileSync as execFileSync2 } from "child_process";
|
|
3742
3995
|
function extractTarball(tarballBuffer) {
|
|
3743
|
-
const tmpDir =
|
|
3996
|
+
const tmpDir = fs15.mkdtempSync(path28.join(os4.tmpdir(), "harness-skill-install-"));
|
|
3744
3997
|
const tarballPath = path28.join(tmpDir, "package.tgz");
|
|
3745
3998
|
try {
|
|
3746
|
-
|
|
3999
|
+
fs15.writeFileSync(tarballPath, tarballBuffer);
|
|
3747
4000
|
execFileSync2("tar", ["-xzf", tarballPath, "-C", tmpDir], {
|
|
3748
4001
|
timeout: 3e4
|
|
3749
4002
|
});
|
|
3750
|
-
|
|
4003
|
+
fs15.unlinkSync(tarballPath);
|
|
3751
4004
|
} catch (err) {
|
|
3752
4005
|
cleanupTempDir(tmpDir);
|
|
3753
4006
|
throw new Error(
|
|
@@ -3758,22 +4011,22 @@ function extractTarball(tarballBuffer) {
|
|
|
3758
4011
|
return tmpDir;
|
|
3759
4012
|
}
|
|
3760
4013
|
function placeSkillContent(extractedPkgDir, communityBaseDir, skillName, platforms) {
|
|
3761
|
-
const files =
|
|
4014
|
+
const files = fs15.readdirSync(extractedPkgDir);
|
|
3762
4015
|
for (const platform of platforms) {
|
|
3763
4016
|
const targetDir = path28.join(communityBaseDir, platform, skillName);
|
|
3764
|
-
if (
|
|
3765
|
-
|
|
4017
|
+
if (fs15.existsSync(targetDir)) {
|
|
4018
|
+
fs15.rmSync(targetDir, { recursive: true, force: true });
|
|
3766
4019
|
}
|
|
3767
|
-
|
|
4020
|
+
fs15.mkdirSync(targetDir, { recursive: true });
|
|
3768
4021
|
for (const file of files) {
|
|
3769
4022
|
if (file === "package.json" || file === "node_modules") continue;
|
|
3770
4023
|
const srcPath = path28.join(extractedPkgDir, file);
|
|
3771
4024
|
const destPath = path28.join(targetDir, file);
|
|
3772
|
-
const stat =
|
|
4025
|
+
const stat = fs15.statSync(srcPath);
|
|
3773
4026
|
if (stat.isDirectory()) {
|
|
3774
|
-
|
|
4027
|
+
fs15.cpSync(srcPath, destPath, { recursive: true });
|
|
3775
4028
|
} else {
|
|
3776
|
-
|
|
4029
|
+
fs15.copyFileSync(srcPath, destPath);
|
|
3777
4030
|
}
|
|
3778
4031
|
}
|
|
3779
4032
|
}
|
|
@@ -3781,14 +4034,14 @@ function placeSkillContent(extractedPkgDir, communityBaseDir, skillName, platfor
|
|
|
3781
4034
|
function removeSkillContent(communityBaseDir, skillName, platforms) {
|
|
3782
4035
|
for (const platform of platforms) {
|
|
3783
4036
|
const targetDir = path28.join(communityBaseDir, platform, skillName);
|
|
3784
|
-
if (
|
|
3785
|
-
|
|
4037
|
+
if (fs15.existsSync(targetDir)) {
|
|
4038
|
+
fs15.rmSync(targetDir, { recursive: true, force: true });
|
|
3786
4039
|
}
|
|
3787
4040
|
}
|
|
3788
4041
|
}
|
|
3789
4042
|
function cleanupTempDir(dirPath) {
|
|
3790
4043
|
try {
|
|
3791
|
-
|
|
4044
|
+
fs15.rmSync(dirPath, { recursive: true, force: true });
|
|
3792
4045
|
} catch {
|
|
3793
4046
|
}
|
|
3794
4047
|
}
|
|
@@ -3830,7 +4083,7 @@ function findDependentsOf(lockfile, targetPackageName) {
|
|
|
3830
4083
|
}
|
|
3831
4084
|
|
|
3832
4085
|
// src/registry/lockfile.ts
|
|
3833
|
-
import * as
|
|
4086
|
+
import * as fs16 from "fs";
|
|
3834
4087
|
import * as path29 from "path";
|
|
3835
4088
|
function createEmptyLockfile() {
|
|
3836
4089
|
return { version: 1, skills: {} };
|
|
@@ -3851,10 +4104,10 @@ function sortedStringify(obj) {
|
|
|
3851
4104
|
);
|
|
3852
4105
|
}
|
|
3853
4106
|
function readLockfile2(filePath) {
|
|
3854
|
-
if (!
|
|
4107
|
+
if (!fs16.existsSync(filePath)) {
|
|
3855
4108
|
return createEmptyLockfile();
|
|
3856
4109
|
}
|
|
3857
|
-
const raw =
|
|
4110
|
+
const raw = fs16.readFileSync(filePath, "utf-8");
|
|
3858
4111
|
let parsed;
|
|
3859
4112
|
try {
|
|
3860
4113
|
parsed = JSON.parse(raw);
|
|
@@ -3872,8 +4125,8 @@ function readLockfile2(filePath) {
|
|
|
3872
4125
|
}
|
|
3873
4126
|
function writeLockfile2(filePath, lockfile) {
|
|
3874
4127
|
const dir = path29.dirname(filePath);
|
|
3875
|
-
|
|
3876
|
-
|
|
4128
|
+
fs16.mkdirSync(dir, { recursive: true });
|
|
4129
|
+
fs16.writeFileSync(filePath, sortedStringify(lockfile) + "\n", "utf-8");
|
|
3877
4130
|
}
|
|
3878
4131
|
function updateLockfileEntry(lockfile, name, entry) {
|
|
3879
4132
|
return {
|
|
@@ -3896,17 +4149,17 @@ function removeLockfileEntry(lockfile, name) {
|
|
|
3896
4149
|
}
|
|
3897
4150
|
|
|
3898
4151
|
// src/registry/bundled-skills.ts
|
|
3899
|
-
import * as
|
|
4152
|
+
import * as fs17 from "fs";
|
|
3900
4153
|
import * as path30 from "path";
|
|
3901
4154
|
function getBundledSkillNames(bundledSkillsDir) {
|
|
3902
|
-
if (!
|
|
4155
|
+
if (!fs17.existsSync(bundledSkillsDir)) {
|
|
3903
4156
|
return /* @__PURE__ */ new Set();
|
|
3904
4157
|
}
|
|
3905
|
-
const entries =
|
|
4158
|
+
const entries = fs17.readdirSync(bundledSkillsDir);
|
|
3906
4159
|
const names = /* @__PURE__ */ new Set();
|
|
3907
4160
|
for (const entry of entries) {
|
|
3908
4161
|
try {
|
|
3909
|
-
const stat =
|
|
4162
|
+
const stat = fs17.statSync(path30.join(bundledSkillsDir, String(entry)));
|
|
3910
4163
|
if (stat.isDirectory()) {
|
|
3911
4164
|
names.add(String(entry));
|
|
3912
4165
|
}
|
|
@@ -3954,7 +4207,7 @@ function parseGitHubRef(from) {
|
|
|
3954
4207
|
return null;
|
|
3955
4208
|
}
|
|
3956
4209
|
function cloneGitHubRepo(owner, repo, ref) {
|
|
3957
|
-
const tmpDir =
|
|
4210
|
+
const tmpDir = fs18.mkdtempSync(path31.join(os5.tmpdir(), "harness-gh-install-"));
|
|
3958
4211
|
const url = `https://github.com/${owner}/${repo}.git`;
|
|
3959
4212
|
try {
|
|
3960
4213
|
const cloneArgs = ["clone", "--depth", "1"];
|
|
@@ -3975,12 +4228,12 @@ function discoverSkillDirs(rootDir) {
|
|
|
3975
4228
|
const skillDirs = [];
|
|
3976
4229
|
function scan(dir, depth) {
|
|
3977
4230
|
if (depth > 3) return;
|
|
3978
|
-
if (!
|
|
3979
|
-
if (
|
|
4231
|
+
if (!fs18.existsSync(dir)) return;
|
|
4232
|
+
if (fs18.existsSync(path31.join(dir, "skill.yaml"))) {
|
|
3980
4233
|
skillDirs.push(dir);
|
|
3981
4234
|
return;
|
|
3982
4235
|
}
|
|
3983
|
-
const entries =
|
|
4236
|
+
const entries = fs18.readdirSync(dir, { withFileTypes: true });
|
|
3984
4237
|
for (const entry of entries) {
|
|
3985
4238
|
if (!entry.isDirectory()) continue;
|
|
3986
4239
|
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
@@ -3992,15 +4245,15 @@ function discoverSkillDirs(rootDir) {
|
|
|
3992
4245
|
}
|
|
3993
4246
|
function resolveLocalPkgDir(fromPath) {
|
|
3994
4247
|
const resolvedPath = path31.resolve(fromPath);
|
|
3995
|
-
if (!
|
|
4248
|
+
if (!fs18.existsSync(resolvedPath)) {
|
|
3996
4249
|
throw new Error(`--from path does not exist: ${resolvedPath}`);
|
|
3997
4250
|
}
|
|
3998
|
-
const stat =
|
|
4251
|
+
const stat = fs18.statSync(resolvedPath);
|
|
3999
4252
|
if (stat.isDirectory()) {
|
|
4000
4253
|
return { pkgDir: resolvedPath, extractDir: null };
|
|
4001
4254
|
}
|
|
4002
4255
|
if (resolvedPath.endsWith(".tgz") || resolvedPath.endsWith(".tar.gz")) {
|
|
4003
|
-
const tarballBuffer =
|
|
4256
|
+
const tarballBuffer = fs18.readFileSync(resolvedPath);
|
|
4004
4257
|
const extractDir = extractTarball(tarballBuffer);
|
|
4005
4258
|
return { pkgDir: path31.join(extractDir, "package"), extractDir };
|
|
4006
4259
|
}
|
|
@@ -4008,10 +4261,10 @@ function resolveLocalPkgDir(fromPath) {
|
|
|
4008
4261
|
}
|
|
4009
4262
|
function installSkillDir(pkgDir, resolvedPath, options) {
|
|
4010
4263
|
const skillYamlPath = path31.join(pkgDir, "skill.yaml");
|
|
4011
|
-
if (!
|
|
4264
|
+
if (!fs18.existsSync(skillYamlPath)) {
|
|
4012
4265
|
throw new Error(`No skill.yaml found at ${skillYamlPath}`);
|
|
4013
4266
|
}
|
|
4014
|
-
const skillYaml = validateSkillYaml(yamlParse(
|
|
4267
|
+
const skillYaml = validateSkillYaml(yamlParse(fs18.readFileSync(skillYamlPath, "utf-8")));
|
|
4015
4268
|
const shortName = skillYaml.name;
|
|
4016
4269
|
const { communityBase, lockfilePath } = resolveCommunityBase(options.global ?? false);
|
|
4017
4270
|
if (!options.global) {
|
|
@@ -4083,7 +4336,7 @@ async function runInstall(skillName, options) {
|
|
|
4083
4336
|
};
|
|
4084
4337
|
}
|
|
4085
4338
|
const resolvedFrom = path31.resolve(options.from);
|
|
4086
|
-
if (
|
|
4339
|
+
if (fs18.existsSync(resolvedFrom) && fs18.statSync(resolvedFrom).isDirectory() && !fs18.existsSync(path31.join(resolvedFrom, "skill.yaml"))) {
|
|
4087
4340
|
const results = await runBulkInstall(resolvedFrom, options);
|
|
4088
4341
|
const installed = results.filter((r) => r.installed);
|
|
4089
4342
|
return {
|
|
@@ -4126,10 +4379,10 @@ async function runInstall(skillName, options) {
|
|
|
4126
4379
|
try {
|
|
4127
4380
|
const extractedPkgDir = path31.join(extractDir, "package");
|
|
4128
4381
|
const skillYamlPath = path31.join(extractedPkgDir, "skill.yaml");
|
|
4129
|
-
if (!
|
|
4382
|
+
if (!fs18.existsSync(skillYamlPath)) {
|
|
4130
4383
|
throw new Error(`contains invalid skill.yaml: file not found in package`);
|
|
4131
4384
|
}
|
|
4132
|
-
const rawYaml =
|
|
4385
|
+
const rawYaml = fs18.readFileSync(skillYamlPath, "utf-8");
|
|
4133
4386
|
const parsed = yamlParse(rawYaml);
|
|
4134
4387
|
skillYaml = validateSkillYaml(parsed);
|
|
4135
4388
|
placeSkillContent(extractedPkgDir, communityBase, shortName, skillYaml.platforms);
|
|
@@ -4169,7 +4422,7 @@ async function runInstall(skillName, options) {
|
|
|
4169
4422
|
return result;
|
|
4170
4423
|
}
|
|
4171
4424
|
function createInstallCommand() {
|
|
4172
|
-
const cmd = new
|
|
4425
|
+
const cmd = new Command32("install");
|
|
4173
4426
|
cmd.description("Install skills from npm registry, local directory, or GitHub repository").argument("<skill>", 'Skill name, @harness-skills/scoped package, or "." for bulk install').option("--version <range>", "Semver range or exact version to install").option("--force", "Force reinstall even if same version is already installed").option(
|
|
4174
4427
|
"--from <source>",
|
|
4175
4428
|
"Install from local path, directory, or GitHub (github:owner/repo, https://github.com/owner/repo)"
|
|
@@ -4187,6 +4440,12 @@ function createInstallCommand() {
|
|
|
4187
4440
|
} else if (result.installed) {
|
|
4188
4441
|
logger.success(`Installed ${result.name}@${result.version}`);
|
|
4189
4442
|
}
|
|
4443
|
+
if (result.installed || result.upgraded) {
|
|
4444
|
+
const globalFlag = opts.global ? " --global --include-global" : "";
|
|
4445
|
+
logger.info(
|
|
4446
|
+
`Run \`harness generate-slash-commands${globalFlag}\` to register slash commands.`
|
|
4447
|
+
);
|
|
4448
|
+
}
|
|
4190
4449
|
} catch (err) {
|
|
4191
4450
|
logger.error(err instanceof Error ? err.message : String(err));
|
|
4192
4451
|
process.exit(1);
|
|
@@ -4196,15 +4455,15 @@ function createInstallCommand() {
|
|
|
4196
4455
|
}
|
|
4197
4456
|
|
|
4198
4457
|
// src/commands/install-constraints.ts
|
|
4199
|
-
import * as
|
|
4458
|
+
import * as fs19 from "fs/promises";
|
|
4200
4459
|
import * as path32 from "path";
|
|
4201
|
-
import { Command as
|
|
4460
|
+
import { Command as Command33 } from "commander";
|
|
4202
4461
|
import semver3 from "semver";
|
|
4203
4462
|
async function runInstallConstraints(options) {
|
|
4204
4463
|
const { source, configPath, lockfilePath } = options;
|
|
4205
4464
|
let rawBundle;
|
|
4206
4465
|
try {
|
|
4207
|
-
rawBundle = await
|
|
4466
|
+
rawBundle = await fs19.readFile(source, "utf-8");
|
|
4208
4467
|
} catch (err) {
|
|
4209
4468
|
if (isNodeError(err) && err.code === "ENOENT") {
|
|
4210
4469
|
return { ok: false, error: `Bundle file not found: ${source}` };
|
|
@@ -4247,7 +4506,7 @@ async function runInstallConstraints(options) {
|
|
|
4247
4506
|
}
|
|
4248
4507
|
let localConfig;
|
|
4249
4508
|
try {
|
|
4250
|
-
const raw = await
|
|
4509
|
+
const raw = await fs19.readFile(configPath, "utf-8");
|
|
4251
4510
|
localConfig = JSON.parse(raw);
|
|
4252
4511
|
} catch (err) {
|
|
4253
4512
|
return {
|
|
@@ -4452,17 +4711,17 @@ async function handleInstallConstraints(source, opts) {
|
|
|
4452
4711
|
logInstallResult(result.value, opts);
|
|
4453
4712
|
}
|
|
4454
4713
|
function createInstallConstraintsCommand() {
|
|
4455
|
-
const cmd = new
|
|
4714
|
+
const cmd = new Command33("install-constraints");
|
|
4456
4715
|
cmd.description("Install a constraints bundle into the local harness config").argument("<source>", "Path to a .harness-constraints.json bundle file").option("--force-local", "Resolve all conflicts by keeping local values").option("--force-package", "Resolve all conflicts by using package values").option("--dry-run", "Show what would change without writing files").option("-c, --config <path>", "Path to harness.config.json").action(handleInstallConstraints);
|
|
4457
4716
|
return cmd;
|
|
4458
4717
|
}
|
|
4459
4718
|
|
|
4460
4719
|
// src/commands/integrations/index.ts
|
|
4461
|
-
import { Command as
|
|
4720
|
+
import { Command as Command38 } from "commander";
|
|
4462
4721
|
|
|
4463
4722
|
// src/commands/integrations/add.ts
|
|
4464
|
-
import { Command as
|
|
4465
|
-
import * as
|
|
4723
|
+
import { Command as Command34 } from "commander";
|
|
4724
|
+
import * as fs20 from "fs";
|
|
4466
4725
|
import * as path33 from "path";
|
|
4467
4726
|
import chalk4 from "chalk";
|
|
4468
4727
|
function buildMcpEntry(def) {
|
|
@@ -4474,7 +4733,7 @@ function buildMcpEntry(def) {
|
|
|
4474
4733
|
function writeMcpEntries(cwd, defName, mcpEntry) {
|
|
4475
4734
|
writeMcpEntry(path33.join(cwd, ".mcp.json"), defName, mcpEntry);
|
|
4476
4735
|
const geminiDir = path33.join(cwd, ".gemini");
|
|
4477
|
-
if (
|
|
4736
|
+
if (fs20.existsSync(geminiDir)) {
|
|
4478
4737
|
writeMcpEntry(path33.join(geminiDir, "settings.json"), defName, mcpEntry);
|
|
4479
4738
|
}
|
|
4480
4739
|
}
|
|
@@ -4525,7 +4784,7 @@ function printAddSuccess(value) {
|
|
|
4525
4784
|
}
|
|
4526
4785
|
}
|
|
4527
4786
|
function createAddIntegrationCommand() {
|
|
4528
|
-
return new
|
|
4787
|
+
return new Command34("add").description("Enable an MCP integration").argument("<name>", "Integration name (e.g. perplexity, augment-code)").action(async (name, _opts, cmd) => {
|
|
4529
4788
|
const globalOpts = cmd.optsWithGlobals();
|
|
4530
4789
|
const result = addIntegration(process.cwd(), name);
|
|
4531
4790
|
if (!result.ok) {
|
|
@@ -4539,7 +4798,7 @@ function createAddIntegrationCommand() {
|
|
|
4539
4798
|
}
|
|
4540
4799
|
|
|
4541
4800
|
// src/commands/integrations/list.ts
|
|
4542
|
-
import { Command as
|
|
4801
|
+
import { Command as Command35 } from "commander";
|
|
4543
4802
|
import * as path34 from "path";
|
|
4544
4803
|
import chalk5 from "chalk";
|
|
4545
4804
|
function printTier0Integrations(tier0, mcpServers) {
|
|
@@ -4596,12 +4855,12 @@ async function runListIntegrations(globalOpts) {
|
|
|
4596
4855
|
process.exit(ExitCode.SUCCESS);
|
|
4597
4856
|
}
|
|
4598
4857
|
function createListIntegrationsCommand() {
|
|
4599
|
-
return new
|
|
4858
|
+
return new Command35("list").description("Show all MCP integrations with status").action(async (_opts, cmd) => runListIntegrations(cmd.optsWithGlobals()));
|
|
4600
4859
|
}
|
|
4601
4860
|
|
|
4602
4861
|
// src/commands/integrations/remove.ts
|
|
4603
|
-
import { Command as
|
|
4604
|
-
import * as
|
|
4862
|
+
import { Command as Command36 } from "commander";
|
|
4863
|
+
import * as fs21 from "fs";
|
|
4605
4864
|
import * as path35 from "path";
|
|
4606
4865
|
function removeIntegration(cwd, name) {
|
|
4607
4866
|
const def = INTEGRATION_REGISTRY.find((i) => i.name === name);
|
|
@@ -4616,7 +4875,7 @@ function removeIntegration(cwd, name) {
|
|
|
4616
4875
|
const mcpPath = path35.join(cwd, ".mcp.json");
|
|
4617
4876
|
removeMcpEntry(mcpPath, def.name);
|
|
4618
4877
|
const geminiDir = path35.join(cwd, ".gemini");
|
|
4619
|
-
if (
|
|
4878
|
+
if (fs21.existsSync(geminiDir)) {
|
|
4620
4879
|
const geminiPath = path35.join(geminiDir, "settings.json");
|
|
4621
4880
|
removeMcpEntry(geminiPath, def.name);
|
|
4622
4881
|
}
|
|
@@ -4627,7 +4886,7 @@ function removeIntegration(cwd, name) {
|
|
|
4627
4886
|
return Ok(def.displayName);
|
|
4628
4887
|
}
|
|
4629
4888
|
function createRemoveIntegrationCommand() {
|
|
4630
|
-
return new
|
|
4889
|
+
return new Command36("remove").description("Remove an MCP integration").argument("<name>", "Integration name (e.g. perplexity, augment-code)").action(async (name, _opts, cmd) => {
|
|
4631
4890
|
const globalOpts = cmd.optsWithGlobals();
|
|
4632
4891
|
const cwd = process.cwd();
|
|
4633
4892
|
const result = removeIntegration(cwd, name);
|
|
@@ -4648,7 +4907,7 @@ function createRemoveIntegrationCommand() {
|
|
|
4648
4907
|
}
|
|
4649
4908
|
|
|
4650
4909
|
// src/commands/integrations/dismiss.ts
|
|
4651
|
-
import { Command as
|
|
4910
|
+
import { Command as Command37 } from "commander";
|
|
4652
4911
|
import * as path36 from "path";
|
|
4653
4912
|
function dismissIntegration(cwd, name) {
|
|
4654
4913
|
const def = INTEGRATION_REGISTRY.find((i) => i.name === name);
|
|
@@ -4670,7 +4929,7 @@ function dismissIntegration(cwd, name) {
|
|
|
4670
4929
|
return Ok(def.displayName);
|
|
4671
4930
|
}
|
|
4672
4931
|
function createDismissIntegrationCommand() {
|
|
4673
|
-
return new
|
|
4932
|
+
return new Command37("dismiss").description("Suppress doctor recommendations for an integration").argument("<name>", "Integration name (e.g. perplexity, augment-code)").action(async (name, _opts, cmd) => {
|
|
4674
4933
|
const globalOpts = cmd.optsWithGlobals();
|
|
4675
4934
|
const cwd = process.cwd();
|
|
4676
4935
|
const result = dismissIntegration(cwd, name);
|
|
@@ -4694,7 +4953,7 @@ function createDismissIntegrationCommand() {
|
|
|
4694
4953
|
|
|
4695
4954
|
// src/commands/integrations/index.ts
|
|
4696
4955
|
function createIntegrationsCommand() {
|
|
4697
|
-
const command = new
|
|
4956
|
+
const command = new Command38("integrations").description(
|
|
4698
4957
|
"Manage MCP peer integrations (add, list, remove, dismiss)"
|
|
4699
4958
|
);
|
|
4700
4959
|
command.addCommand(createListIntegrationsCommand());
|
|
@@ -4705,10 +4964,10 @@ function createIntegrationsCommand() {
|
|
|
4705
4964
|
}
|
|
4706
4965
|
|
|
4707
4966
|
// src/commands/learnings/index.ts
|
|
4708
|
-
import { Command as
|
|
4967
|
+
import { Command as Command40 } from "commander";
|
|
4709
4968
|
|
|
4710
4969
|
// src/commands/learnings/prune.ts
|
|
4711
|
-
import { Command as
|
|
4970
|
+
import { Command as Command39 } from "commander";
|
|
4712
4971
|
import * as path37 from "path";
|
|
4713
4972
|
async function handlePrune(opts) {
|
|
4714
4973
|
const projectPath = path37.resolve(opts.path);
|
|
@@ -4750,23 +5009,23 @@ function printPatternProposals(patterns) {
|
|
|
4750
5009
|
);
|
|
4751
5010
|
}
|
|
4752
5011
|
function createPruneCommand() {
|
|
4753
|
-
return new
|
|
5012
|
+
return new Command39("prune").description(
|
|
4754
5013
|
"Analyze global learnings for patterns, present improvement proposals, and archive old entries"
|
|
4755
5014
|
).option("--path <path>", "Project root path", ".").option("--stream <name>", "Target a specific stream").action(handlePrune);
|
|
4756
5015
|
}
|
|
4757
5016
|
|
|
4758
5017
|
// src/commands/learnings/index.ts
|
|
4759
5018
|
function createLearningsCommand() {
|
|
4760
|
-
const command = new
|
|
5019
|
+
const command = new Command40("learnings").description("Learnings management commands");
|
|
4761
5020
|
command.addCommand(createPruneCommand());
|
|
4762
5021
|
return command;
|
|
4763
5022
|
}
|
|
4764
5023
|
|
|
4765
5024
|
// src/commands/linter/index.ts
|
|
4766
|
-
import { Command as
|
|
5025
|
+
import { Command as Command43 } from "commander";
|
|
4767
5026
|
|
|
4768
5027
|
// src/commands/linter/generate.ts
|
|
4769
|
-
import { Command as
|
|
5028
|
+
import { Command as Command41 } from "commander";
|
|
4770
5029
|
function formatGenerateError(e) {
|
|
4771
5030
|
switch (e.type) {
|
|
4772
5031
|
case "parse":
|
|
@@ -4810,7 +5069,7 @@ function handleSuccess(result, useJson) {
|
|
|
4810
5069
|
Generated ${result.rulesGenerated.length} rules to ${result.outputDir}`);
|
|
4811
5070
|
}
|
|
4812
5071
|
function createGenerateCommand2() {
|
|
4813
|
-
return new
|
|
5072
|
+
return new Command41("generate").description("Generate ESLint rules from harness-linter.yml").option("-c, --config <path>", "Path to harness-linter.yml", "./harness-linter.yml").option("-o, --output <dir>", "Override output directory").option("--clean", "Remove existing files before generating").option("--dry-run", "Preview without writing files").option("--json", "Output as JSON").option("--verbose", "Show detailed output").action(async (options) => {
|
|
4814
5073
|
try {
|
|
4815
5074
|
if (options.verbose) logger.info(`Parsing config: ${options.config}`);
|
|
4816
5075
|
const result = await generate({
|
|
@@ -4832,9 +5091,9 @@ function createGenerateCommand2() {
|
|
|
4832
5091
|
}
|
|
4833
5092
|
|
|
4834
5093
|
// src/commands/linter/validate.ts
|
|
4835
|
-
import { Command as
|
|
5094
|
+
import { Command as Command42 } from "commander";
|
|
4836
5095
|
function createValidateCommand() {
|
|
4837
|
-
return new
|
|
5096
|
+
return new Command42("validate").description("Validate harness-linter.yml config").option("-c, --config <path>", "Path to harness-linter.yml", "./harness-linter.yml").option("--json", "Output as JSON").action(async (options) => {
|
|
4838
5097
|
try {
|
|
4839
5098
|
const result = await validate({ configPath: options.config });
|
|
4840
5099
|
if (options.json) {
|
|
@@ -4853,7 +5112,7 @@ function createValidateCommand() {
|
|
|
4853
5112
|
|
|
4854
5113
|
// src/commands/linter/index.ts
|
|
4855
5114
|
function createLinterCommand() {
|
|
4856
|
-
const linter = new
|
|
5115
|
+
const linter = new Command43("linter").description(
|
|
4857
5116
|
"Generate and validate ESLint rules from YAML config"
|
|
4858
5117
|
);
|
|
4859
5118
|
linter.addCommand(createGenerateCommand2());
|
|
@@ -4862,20 +5121,20 @@ function createLinterCommand() {
|
|
|
4862
5121
|
}
|
|
4863
5122
|
|
|
4864
5123
|
// src/commands/mcp.ts
|
|
4865
|
-
import { Command as
|
|
5124
|
+
import { Command as Command44 } from "commander";
|
|
4866
5125
|
function createMcpCommand() {
|
|
4867
|
-
return new
|
|
4868
|
-
const { startServer: startServer2 } = await import("./mcp-
|
|
5126
|
+
return new Command44("mcp").description("Start the MCP (Model Context Protocol) server on stdio").option("--tools <tools...>", "Only register the specified tools (used by Cursor integration)").action(async (opts) => {
|
|
5127
|
+
const { startServer: startServer2 } = await import("./mcp-LCHC4NZ5.js");
|
|
4869
5128
|
await startServer2(opts.tools);
|
|
4870
5129
|
});
|
|
4871
5130
|
}
|
|
4872
5131
|
|
|
4873
5132
|
// src/commands/orchestrator.ts
|
|
4874
|
-
import { Command as
|
|
5133
|
+
import { Command as Command45 } from "commander";
|
|
4875
5134
|
import * as path38 from "path";
|
|
4876
5135
|
import { Orchestrator, WorkflowLoader, launchTUI } from "@harness-engineering/orchestrator";
|
|
4877
5136
|
function createOrchestratorCommand() {
|
|
4878
|
-
const orchestrator = new
|
|
5137
|
+
const orchestrator = new Command45("orchestrator");
|
|
4879
5138
|
orchestrator.command("run").description("Run the orchestrator daemon").option("-w, --workflow <path>", "Path to WORKFLOW.md", "WORKFLOW.md").action(async (opts) => {
|
|
4880
5139
|
const workflowPath = path38.resolve(process.cwd(), opts.workflow);
|
|
4881
5140
|
const loader = new WorkflowLoader();
|
|
@@ -4901,13 +5160,13 @@ function createOrchestratorCommand() {
|
|
|
4901
5160
|
}
|
|
4902
5161
|
|
|
4903
5162
|
// src/commands/perf.ts
|
|
4904
|
-
import { Command as
|
|
5163
|
+
import { Command as Command46 } from "commander";
|
|
4905
5164
|
import * as path39 from "path";
|
|
4906
5165
|
function registerBenchCommand(perf) {
|
|
4907
5166
|
perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob, _opts, cmd) => {
|
|
4908
5167
|
const globalOpts = cmd.optsWithGlobals();
|
|
4909
5168
|
const cwd = process.cwd();
|
|
4910
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
5169
|
+
const { BenchmarkRunner } = await import("./dist-7EBSGAHX.js");
|
|
4911
5170
|
const runner = new BenchmarkRunner();
|
|
4912
5171
|
const benchFiles = runner.discover(cwd, glob);
|
|
4913
5172
|
if (benchFiles.length === 0) {
|
|
@@ -4971,7 +5230,7 @@ async function runBaselinesShow(globalOpts) {
|
|
|
4971
5230
|
}
|
|
4972
5231
|
async function runBaselinesUpdate(globalOpts) {
|
|
4973
5232
|
const cwd = process.cwd();
|
|
4974
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
5233
|
+
const { BenchmarkRunner } = await import("./dist-7EBSGAHX.js");
|
|
4975
5234
|
const runner = new BenchmarkRunner();
|
|
4976
5235
|
const manager = new BaselineManager(cwd);
|
|
4977
5236
|
logger.info("Running benchmarks to update baselines...");
|
|
@@ -5012,7 +5271,7 @@ function registerReportCommand(perf) {
|
|
|
5012
5271
|
perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
|
|
5013
5272
|
const globalOpts = cmd.optsWithGlobals();
|
|
5014
5273
|
const cwd = process.cwd();
|
|
5015
|
-
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-
|
|
5274
|
+
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-7EBSGAHX.js");
|
|
5016
5275
|
const analyzer = new EntropyAnalyzer2({
|
|
5017
5276
|
rootDir: path39.resolve(cwd),
|
|
5018
5277
|
analyze: { complexity: true, coupling: true }
|
|
@@ -5073,7 +5332,7 @@ function registerCriticalPathsCommand(perf) {
|
|
|
5073
5332
|
});
|
|
5074
5333
|
}
|
|
5075
5334
|
function createPerfCommand() {
|
|
5076
|
-
const perf = new
|
|
5335
|
+
const perf = new Command46("perf").description("Performance benchmark and baseline management");
|
|
5077
5336
|
registerBenchCommand(perf);
|
|
5078
5337
|
registerBaselinesCommands(perf);
|
|
5079
5338
|
registerReportCommand(perf);
|
|
@@ -5082,10 +5341,10 @@ function createPerfCommand() {
|
|
|
5082
5341
|
}
|
|
5083
5342
|
|
|
5084
5343
|
// src/commands/persona/index.ts
|
|
5085
|
-
import { Command as
|
|
5344
|
+
import { Command as Command49 } from "commander";
|
|
5086
5345
|
|
|
5087
5346
|
// src/commands/persona/list.ts
|
|
5088
|
-
import { Command as
|
|
5347
|
+
import { Command as Command47 } from "commander";
|
|
5089
5348
|
function printPersonaList(personas) {
|
|
5090
5349
|
if (personas.length === 0) {
|
|
5091
5350
|
logger.info("No personas found.");
|
|
@@ -5099,7 +5358,7 @@ function printPersonaList(personas) {
|
|
|
5099
5358
|
}
|
|
5100
5359
|
}
|
|
5101
5360
|
function createListCommand2() {
|
|
5102
|
-
return new
|
|
5361
|
+
return new Command47("list").description("List available agent personas").action(async (_opts, cmd) => {
|
|
5103
5362
|
const globalOpts = cmd.optsWithGlobals();
|
|
5104
5363
|
const personasDir = resolvePersonasDir();
|
|
5105
5364
|
const result = listPersonas(personasDir);
|
|
@@ -5119,8 +5378,8 @@ function createListCommand2() {
|
|
|
5119
5378
|
}
|
|
5120
5379
|
|
|
5121
5380
|
// src/commands/persona/generate.ts
|
|
5122
|
-
import { Command as
|
|
5123
|
-
import * as
|
|
5381
|
+
import { Command as Command48 } from "commander";
|
|
5382
|
+
import * as fs22 from "fs";
|
|
5124
5383
|
import * as path40 from "path";
|
|
5125
5384
|
function generatePersonaArtifacts(persona, outputDir, only) {
|
|
5126
5385
|
const slug = toKebabCase(persona.name);
|
|
@@ -5129,8 +5388,8 @@ function generatePersonaArtifacts(persona, outputDir, only) {
|
|
|
5129
5388
|
const result = generateRuntime(persona);
|
|
5130
5389
|
if (result.ok) {
|
|
5131
5390
|
const outPath = path40.join(outputDir, `${slug}.runtime.json`);
|
|
5132
|
-
|
|
5133
|
-
|
|
5391
|
+
fs22.mkdirSync(path40.dirname(outPath), { recursive: true });
|
|
5392
|
+
fs22.writeFileSync(outPath, result.value);
|
|
5134
5393
|
generated.push(outPath);
|
|
5135
5394
|
}
|
|
5136
5395
|
}
|
|
@@ -5138,7 +5397,7 @@ function generatePersonaArtifacts(persona, outputDir, only) {
|
|
|
5138
5397
|
const result = generateAgentsMd(persona);
|
|
5139
5398
|
if (result.ok) {
|
|
5140
5399
|
const outPath = path40.join(outputDir, `${slug}.agents.md`);
|
|
5141
|
-
|
|
5400
|
+
fs22.writeFileSync(outPath, result.value);
|
|
5142
5401
|
generated.push(outPath);
|
|
5143
5402
|
}
|
|
5144
5403
|
}
|
|
@@ -5146,15 +5405,15 @@ function generatePersonaArtifacts(persona, outputDir, only) {
|
|
|
5146
5405
|
const result = generateCIWorkflow(persona, "github");
|
|
5147
5406
|
if (result.ok) {
|
|
5148
5407
|
const outPath = path40.join(outputDir, ".github", "workflows", `${slug}.yml`);
|
|
5149
|
-
|
|
5150
|
-
|
|
5408
|
+
fs22.mkdirSync(path40.dirname(outPath), { recursive: true });
|
|
5409
|
+
fs22.writeFileSync(outPath, result.value);
|
|
5151
5410
|
generated.push(outPath);
|
|
5152
5411
|
}
|
|
5153
5412
|
}
|
|
5154
5413
|
return generated;
|
|
5155
5414
|
}
|
|
5156
5415
|
function createGenerateCommand3() {
|
|
5157
|
-
return new
|
|
5416
|
+
return new Command48("generate").description("Generate artifacts from a persona config").argument("<name>", "Persona name (e.g., architecture-enforcer)").option("--output-dir <dir>", "Output directory", ".").option("--only <type>", "Generate only: ci, agents-md, runtime").action(async (name, opts, cmd) => {
|
|
5158
5417
|
const globalOpts = cmd.optsWithGlobals();
|
|
5159
5418
|
const personaResult = loadPersona(path40.join(resolvePersonasDir(), `${name}.yaml`));
|
|
5160
5419
|
if (!personaResult.ok) {
|
|
@@ -5176,14 +5435,14 @@ function createGenerateCommand3() {
|
|
|
5176
5435
|
|
|
5177
5436
|
// src/commands/persona/index.ts
|
|
5178
5437
|
function createPersonaCommand() {
|
|
5179
|
-
const command = new
|
|
5438
|
+
const command = new Command49("persona").description("Agent persona management commands");
|
|
5180
5439
|
command.addCommand(createListCommand2());
|
|
5181
5440
|
command.addCommand(createGenerateCommand3());
|
|
5182
5441
|
return command;
|
|
5183
5442
|
}
|
|
5184
5443
|
|
|
5185
5444
|
// src/commands/predict.ts
|
|
5186
|
-
import { Command as
|
|
5445
|
+
import { Command as Command50 } from "commander";
|
|
5187
5446
|
import chalk6 from "chalk";
|
|
5188
5447
|
var CATEGORY_ORDER = [
|
|
5189
5448
|
"circular-deps",
|
|
@@ -5289,7 +5548,7 @@ function handlePredictError(err, mode) {
|
|
|
5289
5548
|
process.exit(ExitCode.ERROR);
|
|
5290
5549
|
}
|
|
5291
5550
|
function createPredictCommand() {
|
|
5292
|
-
const command = new
|
|
5551
|
+
const command = new Command50("predict").description("Predict which architectural constraints will break and when").option("--category <name>", "Filter to a single metric category").option("--no-roadmap", "Baseline only \u2014 skip roadmap spec impact").option("--horizon <weeks>", "Forecast horizon in weeks (default: 12)", "12").action(async (opts, cmd) => {
|
|
5293
5552
|
const globalOpts = cmd.optsWithGlobals();
|
|
5294
5553
|
const mode = globalOpts.json ? OutputMode.JSON : OutputMode.TEXT;
|
|
5295
5554
|
try {
|
|
@@ -5312,7 +5571,7 @@ function createPredictCommand() {
|
|
|
5312
5571
|
}
|
|
5313
5572
|
|
|
5314
5573
|
// src/commands/recommend.ts
|
|
5315
|
-
import { Command as
|
|
5574
|
+
import { Command as Command51 } from "commander";
|
|
5316
5575
|
import chalk7 from "chalk";
|
|
5317
5576
|
async function resolveSnapshot(cwd, noCache) {
|
|
5318
5577
|
if (!noCache) {
|
|
@@ -5376,7 +5635,7 @@ function printRecommendations(result) {
|
|
|
5376
5635
|
console.log("");
|
|
5377
5636
|
}
|
|
5378
5637
|
function createRecommendCommand() {
|
|
5379
|
-
const command = new
|
|
5638
|
+
const command = new Command51("recommend").description("Recommend skills based on codebase health analysis").option("--no-cache", "Force fresh health snapshot").option("--top <n>", "Max recommendations (default 5)", "5").action(async (opts, cmd) => {
|
|
5380
5639
|
const globalOpts = cmd.optsWithGlobals();
|
|
5381
5640
|
const mode = globalOpts.json ? OutputMode.JSON : OutputMode.TEXT;
|
|
5382
5641
|
try {
|
|
@@ -5412,8 +5671,8 @@ function createRecommendCommand() {
|
|
|
5412
5671
|
}
|
|
5413
5672
|
|
|
5414
5673
|
// src/commands/scan-config.ts
|
|
5415
|
-
import { Command as
|
|
5416
|
-
import { existsSync as
|
|
5674
|
+
import { Command as Command52 } from "commander";
|
|
5675
|
+
import { existsSync as existsSync21, readFileSync as readFileSync11, writeFileSync as writeFileSync12 } from "fs";
|
|
5417
5676
|
import { join as join31, relative as relative2 } from "path";
|
|
5418
5677
|
var CONFIG_FILES = ["CLAUDE.md", "AGENTS.md", ".gemini/settings.json", "skill.yaml"];
|
|
5419
5678
|
function stripHighSeverityPatterns(content, injectionFindings) {
|
|
@@ -5447,7 +5706,7 @@ function applyFix(filePath, targetDir, content, injectionFindings) {
|
|
|
5447
5706
|
}
|
|
5448
5707
|
}
|
|
5449
5708
|
function scanSingleFile(filePath, targetDir, scanner, options) {
|
|
5450
|
-
if (!
|
|
5709
|
+
if (!existsSync21(filePath)) return null;
|
|
5451
5710
|
let content;
|
|
5452
5711
|
try {
|
|
5453
5712
|
content = readFileSync11(filePath, "utf8");
|
|
@@ -5501,7 +5760,7 @@ function formatTextOutput(result) {
|
|
|
5501
5760
|
}
|
|
5502
5761
|
}
|
|
5503
5762
|
function createScanConfigCommand() {
|
|
5504
|
-
const command = new
|
|
5763
|
+
const command = new Command52("scan-config").description(
|
|
5505
5764
|
"Scan CLAUDE.md, AGENTS.md, .gemini/settings.json, and skill.yaml for prompt injection patterns"
|
|
5506
5765
|
).option("--path <dir>", "Target directory to scan (default: cwd)").option("--fix", "Strip high-severity patterns from files in-place").action(async (opts, cmd) => {
|
|
5507
5766
|
const globalOpts = cmd.optsWithGlobals();
|
|
@@ -5518,24 +5777,24 @@ function createScanConfigCommand() {
|
|
|
5518
5777
|
}
|
|
5519
5778
|
|
|
5520
5779
|
// src/commands/setup.ts
|
|
5521
|
-
import { Command as
|
|
5522
|
-
import * as
|
|
5780
|
+
import { Command as Command53 } from "commander";
|
|
5781
|
+
import * as fs24 from "fs";
|
|
5523
5782
|
import * as os7 from "os";
|
|
5524
5783
|
import * as path42 from "path";
|
|
5525
5784
|
import chalk8 from "chalk";
|
|
5526
5785
|
|
|
5527
5786
|
// src/utils/first-run.ts
|
|
5528
|
-
import * as
|
|
5787
|
+
import * as fs23 from "fs";
|
|
5529
5788
|
import * as os6 from "os";
|
|
5530
5789
|
import * as path41 from "path";
|
|
5531
5790
|
var HARNESS_DIR = path41.join(os6.homedir(), ".harness");
|
|
5532
5791
|
var MARKER_FILE = path41.join(HARNESS_DIR, ".setup-complete");
|
|
5533
5792
|
function isFirstRun() {
|
|
5534
|
-
return !
|
|
5793
|
+
return !fs23.existsSync(MARKER_FILE);
|
|
5535
5794
|
}
|
|
5536
5795
|
function markSetupComplete() {
|
|
5537
|
-
|
|
5538
|
-
|
|
5796
|
+
fs23.mkdirSync(HARNESS_DIR, { recursive: true });
|
|
5797
|
+
fs23.writeFileSync(MARKER_FILE, "", "utf-8");
|
|
5539
5798
|
}
|
|
5540
5799
|
function printFirstRunWelcome() {
|
|
5541
5800
|
try {
|
|
@@ -5573,7 +5832,7 @@ function runSlashCommandGeneration() {
|
|
|
5573
5832
|
}
|
|
5574
5833
|
}
|
|
5575
5834
|
function detectClient(dirName) {
|
|
5576
|
-
return
|
|
5835
|
+
return fs24.existsSync(path42.join(os7.homedir(), dirName));
|
|
5577
5836
|
}
|
|
5578
5837
|
async function runMcpSetup(cwd) {
|
|
5579
5838
|
const results = [];
|
|
@@ -5625,7 +5884,7 @@ function configureTier0Integrations(cwd) {
|
|
|
5625
5884
|
added.push(integration.displayName);
|
|
5626
5885
|
}
|
|
5627
5886
|
const geminiDir = path42.join(cwd, ".gemini");
|
|
5628
|
-
if (
|
|
5887
|
+
if (fs24.existsSync(geminiDir)) {
|
|
5629
5888
|
const geminiPath = path42.join(geminiDir, "settings.json");
|
|
5630
5889
|
const geminiConfig = readMcpConfig(geminiPath);
|
|
5631
5890
|
for (const integration of tier0) {
|
|
@@ -5646,6 +5905,44 @@ function configureTier0Integrations(cwd) {
|
|
|
5646
5905
|
return { status: "fail", message: `Tier 0 integration configuration failed \u2014 ${msg}` };
|
|
5647
5906
|
}
|
|
5648
5907
|
}
|
|
5908
|
+
function ensureHooks(cwd) {
|
|
5909
|
+
const configPath = path42.join(cwd, "harness.config.json");
|
|
5910
|
+
if (!fs24.existsSync(configPath)) {
|
|
5911
|
+
return { status: "warn", message: "Not a harness project \u2014 skipped hook installation" };
|
|
5912
|
+
}
|
|
5913
|
+
let profile = "standard";
|
|
5914
|
+
const profilePath = path42.join(cwd, ".harness", "hooks", "profile.json");
|
|
5915
|
+
try {
|
|
5916
|
+
const data = JSON.parse(fs24.readFileSync(profilePath, "utf-8"));
|
|
5917
|
+
if (data.profile && ["minimal", "standard", "strict"].includes(data.profile)) {
|
|
5918
|
+
profile = data.profile;
|
|
5919
|
+
}
|
|
5920
|
+
} catch {
|
|
5921
|
+
}
|
|
5922
|
+
try {
|
|
5923
|
+
const result = initHooks({ profile, projectDir: cwd });
|
|
5924
|
+
return {
|
|
5925
|
+
status: "pass",
|
|
5926
|
+
message: `Installed ${result.copiedScripts.length} hooks (${profile} profile)`
|
|
5927
|
+
};
|
|
5928
|
+
} catch (error) {
|
|
5929
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
5930
|
+
return { status: "warn", message: `Hook installation skipped \u2014 ${msg}` };
|
|
5931
|
+
}
|
|
5932
|
+
}
|
|
5933
|
+
async function runInitialGraphScan(cwd) {
|
|
5934
|
+
try {
|
|
5935
|
+
const { runScan: runScan2 } = await import("./scan-U67OKDRS.js");
|
|
5936
|
+
const result = await runScan2(cwd);
|
|
5937
|
+
return {
|
|
5938
|
+
status: "pass",
|
|
5939
|
+
message: `Built knowledge graph: ${result.nodeCount} nodes, ${result.edgeCount} edges`
|
|
5940
|
+
};
|
|
5941
|
+
} catch (error) {
|
|
5942
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
5943
|
+
return { status: "warn", message: `Knowledge graph creation skipped \u2014 ${msg}` };
|
|
5944
|
+
}
|
|
5945
|
+
}
|
|
5649
5946
|
async function runSetup(cwd) {
|
|
5650
5947
|
const steps = [];
|
|
5651
5948
|
const nodeResult = checkNodeVersion3();
|
|
@@ -5659,6 +5956,10 @@ async function runSetup(cwd) {
|
|
|
5659
5956
|
steps.push(...mcpResults);
|
|
5660
5957
|
const tier0Result = configureTier0Integrations(cwd);
|
|
5661
5958
|
steps.push(tier0Result);
|
|
5959
|
+
const hooksResult = ensureHooks(cwd);
|
|
5960
|
+
steps.push(hooksResult);
|
|
5961
|
+
const graphResult = await runInitialGraphScan(cwd);
|
|
5962
|
+
steps.push(graphResult);
|
|
5662
5963
|
const success = steps.every((s) => s.status !== "fail");
|
|
5663
5964
|
if (success) {
|
|
5664
5965
|
markSetupComplete();
|
|
@@ -5666,7 +5967,7 @@ async function runSetup(cwd) {
|
|
|
5666
5967
|
return { steps, success };
|
|
5667
5968
|
}
|
|
5668
5969
|
function createSetupCommand() {
|
|
5669
|
-
return new
|
|
5970
|
+
return new Command53("setup").description("Configure harness environment: slash commands, MCP, and more").action(async () => {
|
|
5670
5971
|
const cwd = process.cwd();
|
|
5671
5972
|
console.log("");
|
|
5672
5973
|
console.log(` ${chalk8.bold("harness setup")}`);
|
|
@@ -5688,15 +5989,15 @@ function createSetupCommand() {
|
|
|
5688
5989
|
}
|
|
5689
5990
|
|
|
5690
5991
|
// src/commands/share.ts
|
|
5691
|
-
import { Command as
|
|
5692
|
-
import * as
|
|
5992
|
+
import { Command as Command54 } from "commander";
|
|
5993
|
+
import * as fs25 from "fs";
|
|
5693
5994
|
import * as path43 from "path";
|
|
5694
5995
|
import { parse as parseYaml } from "yaml";
|
|
5695
5996
|
var MANIFEST_FILENAME = "constraints.yaml";
|
|
5696
5997
|
async function runShareAction(projectPath, options) {
|
|
5697
5998
|
const rootDir = path43.resolve(projectPath);
|
|
5698
5999
|
const manifestPath = path43.join(rootDir, MANIFEST_FILENAME);
|
|
5699
|
-
if (!
|
|
6000
|
+
if (!fs25.existsSync(manifestPath)) {
|
|
5700
6001
|
logger.error(
|
|
5701
6002
|
`No ${MANIFEST_FILENAME} found at ${manifestPath}.
|
|
5702
6003
|
Create a constraints.yaml in your project root to define what to share.`
|
|
@@ -5705,7 +6006,7 @@ Create a constraints.yaml in your project root to define what to share.`
|
|
|
5705
6006
|
}
|
|
5706
6007
|
let parsed;
|
|
5707
6008
|
try {
|
|
5708
|
-
const raw =
|
|
6009
|
+
const raw = fs25.readFileSync(manifestPath, "utf-8");
|
|
5709
6010
|
parsed = parseYaml(raw);
|
|
5710
6011
|
} catch (err) {
|
|
5711
6012
|
logger.error(
|
|
@@ -5747,28 +6048,28 @@ Create a constraints.yaml in your project root to define what to share.`
|
|
|
5747
6048
|
logger.success(`Bundle written to ${outputPath}`);
|
|
5748
6049
|
}
|
|
5749
6050
|
function createShareCommand() {
|
|
5750
|
-
return new
|
|
6051
|
+
return new Command54("share").description("Extract and publish a constraints bundle from constraints.yaml").argument("[path]", "Path to the project root", ".").option("-o, --output <dir>", "Output directory for the bundle", ".").action(async (projectPath, options) => {
|
|
5751
6052
|
await runShareAction(projectPath, options);
|
|
5752
6053
|
});
|
|
5753
6054
|
}
|
|
5754
6055
|
|
|
5755
6056
|
// src/commands/skill/index.ts
|
|
5756
|
-
import { Command as
|
|
6057
|
+
import { Command as Command62 } from "commander";
|
|
5757
6058
|
|
|
5758
6059
|
// src/commands/skill/list.ts
|
|
5759
|
-
import { Command as
|
|
5760
|
-
import * as
|
|
6060
|
+
import { Command as Command55 } from "commander";
|
|
6061
|
+
import * as fs26 from "fs";
|
|
5761
6062
|
import * as path44 from "path";
|
|
5762
6063
|
import { parse } from "yaml";
|
|
5763
6064
|
function scanDirectory(dirPath, source) {
|
|
5764
|
-
if (!
|
|
5765
|
-
const entries =
|
|
6065
|
+
if (!fs26.existsSync(dirPath)) return [];
|
|
6066
|
+
const entries = fs26.readdirSync(dirPath, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
5766
6067
|
const skills = [];
|
|
5767
6068
|
for (const name of entries) {
|
|
5768
6069
|
const yamlPath = path44.join(dirPath, name, "skill.yaml");
|
|
5769
|
-
if (!
|
|
6070
|
+
if (!fs26.existsSync(yamlPath)) continue;
|
|
5770
6071
|
try {
|
|
5771
|
-
const raw =
|
|
6072
|
+
const raw = fs26.readFileSync(yamlPath, "utf-8");
|
|
5772
6073
|
const parsed = parse(raw);
|
|
5773
6074
|
const result = SkillMetadataSchema.safeParse(parsed);
|
|
5774
6075
|
if (result.success) {
|
|
@@ -5859,7 +6160,7 @@ function printSkillsVerbose(skills) {
|
|
|
5859
6160
|
for (const s of skills) printSkillEntry(s);
|
|
5860
6161
|
}
|
|
5861
6162
|
function createListCommand3() {
|
|
5862
|
-
return new
|
|
6163
|
+
return new Command55("list").description("List available skills").option("--installed", "Show only community-installed skills").option("--local", "Show only project-local skills").option("--all", "Show all skills (default)").action(async (opts, cmd) => {
|
|
5863
6164
|
const globalOpts = cmd.optsWithGlobals();
|
|
5864
6165
|
const skills = collectSkills({ filter: resolveFilter(opts) });
|
|
5865
6166
|
if (globalOpts.json) {
|
|
@@ -5874,8 +6175,8 @@ function createListCommand3() {
|
|
|
5874
6175
|
}
|
|
5875
6176
|
|
|
5876
6177
|
// src/commands/skill/run.ts
|
|
5877
|
-
import { Command as
|
|
5878
|
-
import * as
|
|
6178
|
+
import { Command as Command56 } from "commander";
|
|
6179
|
+
import * as fs27 from "fs";
|
|
5879
6180
|
import * as path45 from "path";
|
|
5880
6181
|
import { parse as parse2 } from "yaml";
|
|
5881
6182
|
|
|
@@ -5973,9 +6274,9 @@ ${options.principles}`);
|
|
|
5973
6274
|
// src/commands/skill/run.ts
|
|
5974
6275
|
function loadSkillMetadata(skillDir) {
|
|
5975
6276
|
const yamlPath = path45.join(skillDir, "skill.yaml");
|
|
5976
|
-
if (!
|
|
6277
|
+
if (!fs27.existsSync(yamlPath)) return null;
|
|
5977
6278
|
try {
|
|
5978
|
-
const result = SkillMetadataSchema.safeParse(parse2(
|
|
6279
|
+
const result = SkillMetadataSchema.safeParse(parse2(fs27.readFileSync(yamlPath, "utf-8")));
|
|
5979
6280
|
return result.success ? result.data : null;
|
|
5980
6281
|
} catch {
|
|
5981
6282
|
return null;
|
|
@@ -5988,21 +6289,21 @@ function resolveComplexity(metadata, requested, projectPath) {
|
|
|
5988
6289
|
}
|
|
5989
6290
|
function loadPrinciples(projectPath) {
|
|
5990
6291
|
const principlesPath = path45.join(projectPath, "docs", "principles.md");
|
|
5991
|
-
return
|
|
6292
|
+
return fs27.existsSync(principlesPath) ? fs27.readFileSync(principlesPath, "utf-8") : void 0;
|
|
5992
6293
|
}
|
|
5993
6294
|
function readMostRecentFileInDir(dirPath) {
|
|
5994
|
-
const files =
|
|
5995
|
-
if (files.length > 0) return
|
|
6295
|
+
const files = fs27.readdirSync(dirPath).map((f) => ({ name: f, mtime: fs27.statSync(path45.join(dirPath, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
|
|
6296
|
+
if (files.length > 0) return fs27.readFileSync(path45.join(dirPath, files[0].name), "utf-8");
|
|
5996
6297
|
return void 0;
|
|
5997
6298
|
}
|
|
5998
6299
|
function loadPriorState(metadata, projectPath) {
|
|
5999
6300
|
if (!metadata?.state.persistent || metadata.state.files.length === 0) return void 0;
|
|
6000
6301
|
for (const stateFilePath of metadata.state.files) {
|
|
6001
6302
|
const fullPath = path45.join(projectPath, stateFilePath);
|
|
6002
|
-
if (!
|
|
6003
|
-
const stat =
|
|
6303
|
+
if (!fs27.existsSync(fullPath)) continue;
|
|
6304
|
+
const stat = fs27.statSync(fullPath);
|
|
6004
6305
|
if (stat.isDirectory()) return readMostRecentFileInDir(fullPath);
|
|
6005
|
-
return
|
|
6306
|
+
return fs27.readFileSync(fullPath, "utf-8");
|
|
6006
6307
|
}
|
|
6007
6308
|
return void 0;
|
|
6008
6309
|
}
|
|
@@ -6023,8 +6324,8 @@ function resolvePhaseState(metadata, projectPath, phase) {
|
|
|
6023
6324
|
function appendProjectState(content, metadata, projectPath, hasPathOpt) {
|
|
6024
6325
|
if (!metadata?.state.persistent || !hasPathOpt) return content;
|
|
6025
6326
|
const stateFile = path45.join(projectPath, ".harness", "state.json");
|
|
6026
|
-
if (!
|
|
6027
|
-
const stateContent =
|
|
6327
|
+
if (!fs27.existsSync(stateFile)) return content;
|
|
6328
|
+
const stateContent = fs27.readFileSync(stateFile, "utf-8");
|
|
6028
6329
|
return content + `
|
|
6029
6330
|
|
|
6030
6331
|
---
|
|
@@ -6037,7 +6338,7 @@ ${stateContent}
|
|
|
6037
6338
|
async function runSkill(name, opts) {
|
|
6038
6339
|
const skillsDir = resolveSkillsDir();
|
|
6039
6340
|
const skillDir = path45.join(skillsDir, name);
|
|
6040
|
-
if (!
|
|
6341
|
+
if (!fs27.existsSync(skillDir)) {
|
|
6041
6342
|
logger.error(`Skill not found: ${name}`);
|
|
6042
6343
|
process.exit(ExitCode.ERROR);
|
|
6043
6344
|
return;
|
|
@@ -6071,13 +6372,13 @@ async function runSkill(name, opts) {
|
|
|
6071
6372
|
...opts.party !== void 0 && { party: opts.party }
|
|
6072
6373
|
});
|
|
6073
6374
|
const skillMdPath = path45.join(skillDir, "SKILL.md");
|
|
6074
|
-
if (!
|
|
6375
|
+
if (!fs27.existsSync(skillMdPath)) {
|
|
6075
6376
|
logger.error(`SKILL.md not found for skill: ${name}`);
|
|
6076
6377
|
process.exit(ExitCode.ERROR);
|
|
6077
6378
|
return;
|
|
6078
6379
|
}
|
|
6079
6380
|
const content = appendProjectState(
|
|
6080
|
-
|
|
6381
|
+
fs27.readFileSync(skillMdPath, "utf-8"),
|
|
6081
6382
|
metadata,
|
|
6082
6383
|
projectPath,
|
|
6083
6384
|
!!opts.path
|
|
@@ -6086,12 +6387,12 @@ async function runSkill(name, opts) {
|
|
|
6086
6387
|
process.exit(ExitCode.SUCCESS);
|
|
6087
6388
|
}
|
|
6088
6389
|
function createRunCommand2() {
|
|
6089
|
-
return new
|
|
6390
|
+
return new Command56("run").description("Run a skill (outputs SKILL.md content with context preamble)").argument("<name>", "Skill name (e.g., harness-tdd)").option("--path <path>", "Project root path for context injection").option("--complexity <level>", "Rigor level: fast, standard, thorough", "standard").option("--phase <name>", "Start at a specific phase (for re-entry)").option("--party", "Enable multi-perspective evaluation").action(async (name, opts) => runSkill(name, opts));
|
|
6090
6391
|
}
|
|
6091
6392
|
|
|
6092
6393
|
// src/commands/skill/validate.ts
|
|
6093
|
-
import { Command as
|
|
6094
|
-
import * as
|
|
6394
|
+
import { Command as Command57 } from "commander";
|
|
6395
|
+
import * as fs28 from "fs";
|
|
6095
6396
|
import * as path46 from "path";
|
|
6096
6397
|
import { parse as parse3 } from "yaml";
|
|
6097
6398
|
var BEHAVIORAL_REQUIRED_SECTIONS = [
|
|
@@ -6104,11 +6405,11 @@ var BEHAVIORAL_REQUIRED_SECTIONS = [
|
|
|
6104
6405
|
];
|
|
6105
6406
|
var KNOWLEDGE_REQUIRED_SECTIONS = ["## Instructions"];
|
|
6106
6407
|
function validateSkillMd(name, skillMdPath, skillType, errors) {
|
|
6107
|
-
if (!
|
|
6408
|
+
if (!fs28.existsSync(skillMdPath)) {
|
|
6108
6409
|
errors.push(`${name}: missing SKILL.md`);
|
|
6109
6410
|
return;
|
|
6110
6411
|
}
|
|
6111
|
-
const mdContent =
|
|
6412
|
+
const mdContent = fs28.readFileSync(skillMdPath, "utf-8");
|
|
6112
6413
|
if (!mdContent.trim().startsWith("# ")) {
|
|
6113
6414
|
errors.push(`${name}/SKILL.md: must start with an h1 heading`);
|
|
6114
6415
|
}
|
|
@@ -6135,12 +6436,12 @@ function validateSkillMd(name, skillMdPath, skillType, errors) {
|
|
|
6135
6436
|
function validateSkillEntry(name, skillsDir, errors) {
|
|
6136
6437
|
const skillDir = path46.join(skillsDir, name);
|
|
6137
6438
|
const yamlPath = path46.join(skillDir, "skill.yaml");
|
|
6138
|
-
if (!
|
|
6439
|
+
if (!fs28.existsSync(yamlPath)) {
|
|
6139
6440
|
errors.push(`${name}: missing skill.yaml`);
|
|
6140
6441
|
return false;
|
|
6141
6442
|
}
|
|
6142
6443
|
try {
|
|
6143
|
-
const raw =
|
|
6444
|
+
const raw = fs28.readFileSync(yamlPath, "utf-8");
|
|
6144
6445
|
const result = SkillMetadataSchema.safeParse(parse3(raw));
|
|
6145
6446
|
if (!result.success) {
|
|
6146
6447
|
errors.push(`${name}/skill.yaml: ${result.error.message}`);
|
|
@@ -6154,15 +6455,15 @@ function validateSkillEntry(name, skillsDir, errors) {
|
|
|
6154
6455
|
}
|
|
6155
6456
|
}
|
|
6156
6457
|
function createValidateCommand2() {
|
|
6157
|
-
return new
|
|
6458
|
+
return new Command57("validate").description("Validate all skill.yaml files and SKILL.md structure").action(async (_opts, cmd) => {
|
|
6158
6459
|
const globalOpts = cmd.optsWithGlobals();
|
|
6159
6460
|
const skillsDir = resolveSkillsDir();
|
|
6160
|
-
if (!
|
|
6461
|
+
if (!fs28.existsSync(skillsDir)) {
|
|
6161
6462
|
logger.info("No skills directory found.");
|
|
6162
6463
|
process.exit(ExitCode.SUCCESS);
|
|
6163
6464
|
return;
|
|
6164
6465
|
}
|
|
6165
|
-
const entries =
|
|
6466
|
+
const entries = fs28.readdirSync(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
6166
6467
|
const errors = [];
|
|
6167
6468
|
let validated = 0;
|
|
6168
6469
|
for (const name of entries) {
|
|
@@ -6184,24 +6485,24 @@ function createValidateCommand2() {
|
|
|
6184
6485
|
}
|
|
6185
6486
|
|
|
6186
6487
|
// src/commands/skill/info.ts
|
|
6187
|
-
import { Command as
|
|
6188
|
-
import * as
|
|
6488
|
+
import { Command as Command58 } from "commander";
|
|
6489
|
+
import * as fs29 from "fs";
|
|
6189
6490
|
import * as path47 from "path";
|
|
6190
6491
|
import { parse as parse4 } from "yaml";
|
|
6191
6492
|
function loadSkillMetadata2(name) {
|
|
6192
6493
|
const skillsDir = resolveSkillsDir();
|
|
6193
6494
|
const skillDir = path47.join(skillsDir, name);
|
|
6194
|
-
if (!
|
|
6495
|
+
if (!fs29.existsSync(skillDir)) {
|
|
6195
6496
|
logger.error(`Skill not found: ${name}`);
|
|
6196
6497
|
return { ok: false, exitCode: ExitCode.ERROR };
|
|
6197
6498
|
}
|
|
6198
6499
|
const yamlPath = path47.join(skillDir, "skill.yaml");
|
|
6199
|
-
if (!
|
|
6500
|
+
if (!fs29.existsSync(yamlPath)) {
|
|
6200
6501
|
logger.error(`skill.yaml not found for skill: ${name}`);
|
|
6201
6502
|
return { ok: false, exitCode: ExitCode.ERROR };
|
|
6202
6503
|
}
|
|
6203
6504
|
try {
|
|
6204
|
-
const raw =
|
|
6505
|
+
const raw = fs29.readFileSync(yamlPath, "utf-8");
|
|
6205
6506
|
const parsed = parse4(raw);
|
|
6206
6507
|
const result = SkillMetadataSchema.safeParse(parsed);
|
|
6207
6508
|
if (!result.success) {
|
|
@@ -6230,7 +6531,7 @@ function printSkillInfo(skill) {
|
|
|
6230
6531
|
console.log(`Persistent: ${skill.state.persistent}`);
|
|
6231
6532
|
}
|
|
6232
6533
|
function createInfoCommand() {
|
|
6233
|
-
return new
|
|
6534
|
+
return new Command58("info").description("Show metadata for a skill").argument("<name>", "Skill name (e.g., harness-tdd)").action(async (name, _opts, cmd) => {
|
|
6234
6535
|
const globalOpts = cmd.optsWithGlobals();
|
|
6235
6536
|
const loaded = loadSkillMetadata2(name);
|
|
6236
6537
|
if (!loaded.ok) {
|
|
@@ -6247,7 +6548,7 @@ function createInfoCommand() {
|
|
|
6247
6548
|
}
|
|
6248
6549
|
|
|
6249
6550
|
// src/commands/skill/search.ts
|
|
6250
|
-
import { Command as
|
|
6551
|
+
import { Command as Command59 } from "commander";
|
|
6251
6552
|
async function runSearch(query, opts) {
|
|
6252
6553
|
const results = await searchNpmRegistry(query, opts.registry);
|
|
6253
6554
|
return results.filter((r) => {
|
|
@@ -6292,15 +6593,15 @@ async function runSearchAction(query, opts, globalOpts) {
|
|
|
6292
6593
|
}
|
|
6293
6594
|
}
|
|
6294
6595
|
function createSearchCommand() {
|
|
6295
|
-
return new
|
|
6596
|
+
return new Command59("search").description("Search for community skills on the @harness-skills registry").argument("<query>", "Search query").option("--platform <platform>", "Filter by platform (e.g., claude-code)").option("--trigger <trigger>", "Filter by trigger type (e.g., manual, automatic)").option("--registry <url>", "Use a custom npm registry URL").action(async (query, opts, cmd) => {
|
|
6296
6597
|
await runSearchAction(query, opts, cmd.optsWithGlobals());
|
|
6297
6598
|
});
|
|
6298
6599
|
}
|
|
6299
6600
|
|
|
6300
6601
|
// src/commands/skill/create.ts
|
|
6301
|
-
import { Command as
|
|
6602
|
+
import { Command as Command60 } from "commander";
|
|
6302
6603
|
import * as path48 from "path";
|
|
6303
|
-
import * as
|
|
6604
|
+
import * as fs30 from "fs";
|
|
6304
6605
|
import YAML from "yaml";
|
|
6305
6606
|
var KEBAB_CASE_RE = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
|
|
6306
6607
|
function buildReadme(name, description) {
|
|
@@ -6386,20 +6687,20 @@ function runCreate(name, opts) {
|
|
|
6386
6687
|
}
|
|
6387
6688
|
const baseDir = opts.outputDir ?? path48.join(process.cwd(), "agents", "skills", "claude-code");
|
|
6388
6689
|
const skillDir = path48.join(baseDir, name);
|
|
6389
|
-
if (
|
|
6690
|
+
if (fs30.existsSync(skillDir)) {
|
|
6390
6691
|
throw new Error(`Skill directory already exists: ${skillDir}`);
|
|
6391
6692
|
}
|
|
6392
|
-
|
|
6693
|
+
fs30.mkdirSync(skillDir, { recursive: true });
|
|
6393
6694
|
const description = opts.description || `A community skill: ${name}`;
|
|
6394
6695
|
const skillYaml = buildSkillYaml(name, opts);
|
|
6395
6696
|
const skillYamlPath = path48.join(skillDir, "skill.yaml");
|
|
6396
|
-
|
|
6697
|
+
fs30.writeFileSync(skillYamlPath, YAML.stringify(skillYaml));
|
|
6397
6698
|
const skillMd = buildSkillMd(name, description);
|
|
6398
6699
|
const skillMdPath = path48.join(skillDir, "SKILL.md");
|
|
6399
|
-
|
|
6700
|
+
fs30.writeFileSync(skillMdPath, skillMd);
|
|
6400
6701
|
const readme = buildReadme(name, description);
|
|
6401
6702
|
const readmePath = path48.join(skillDir, "README.md");
|
|
6402
|
-
|
|
6703
|
+
fs30.writeFileSync(readmePath, readme);
|
|
6403
6704
|
return {
|
|
6404
6705
|
name,
|
|
6405
6706
|
directory: skillDir,
|
|
@@ -6418,7 +6719,7 @@ Next steps:`);
|
|
|
6418
6719
|
logger.info(` 3. Run: harness skills publish`);
|
|
6419
6720
|
}
|
|
6420
6721
|
function createCreateCommand() {
|
|
6421
|
-
return new
|
|
6722
|
+
return new Command60("create").description("Scaffold a new community skill").argument("<name>", "Skill name (kebab-case)").option("--description <desc>", "Skill description").option("--type <type>", "Skill type: rigid or flexible", "flexible").option("--platforms <platforms>", "Comma-separated platforms (default: claude-code)").option("--triggers <triggers>", "Comma-separated triggers (default: manual)").option("--output-dir <dir>", "Output directory (default: agents/skills/claude-code/)").action(async (name, opts, cmd) => {
|
|
6422
6723
|
const globalOpts = cmd.optsWithGlobals();
|
|
6423
6724
|
try {
|
|
6424
6725
|
const result = runCreate(name, {
|
|
@@ -6441,26 +6742,26 @@ function createCreateCommand() {
|
|
|
6441
6742
|
}
|
|
6442
6743
|
|
|
6443
6744
|
// src/commands/skill/publish.ts
|
|
6444
|
-
import { Command as
|
|
6445
|
-
import * as
|
|
6745
|
+
import { Command as Command61 } from "commander";
|
|
6746
|
+
import * as fs32 from "fs";
|
|
6446
6747
|
import * as path50 from "path";
|
|
6447
6748
|
import { execFileSync as execFileSync5 } from "child_process";
|
|
6448
6749
|
|
|
6449
6750
|
// src/registry/validator.ts
|
|
6450
|
-
import * as
|
|
6751
|
+
import * as fs31 from "fs";
|
|
6451
6752
|
import * as path49 from "path";
|
|
6452
6753
|
import { parse as parse5 } from "yaml";
|
|
6453
6754
|
import semver4 from "semver";
|
|
6454
6755
|
async function validateForPublish(skillDir, registryUrl) {
|
|
6455
6756
|
const errors = [];
|
|
6456
6757
|
const skillYamlPath = path49.join(skillDir, "skill.yaml");
|
|
6457
|
-
if (!
|
|
6758
|
+
if (!fs31.existsSync(skillYamlPath)) {
|
|
6458
6759
|
errors.push("skill.yaml not found. Create one with: harness skill create <name>");
|
|
6459
6760
|
return { valid: false, errors };
|
|
6460
6761
|
}
|
|
6461
6762
|
let skillMeta;
|
|
6462
6763
|
try {
|
|
6463
|
-
const raw =
|
|
6764
|
+
const raw = fs31.readFileSync(skillYamlPath, "utf-8");
|
|
6464
6765
|
const parsed = parse5(raw);
|
|
6465
6766
|
const result = SkillMetadataSchema.safeParse(parsed);
|
|
6466
6767
|
if (!result.success) {
|
|
@@ -6483,10 +6784,10 @@ async function validateForPublish(skillDir, registryUrl) {
|
|
|
6483
6784
|
errors.push("At least one trigger is required. Add triggers to skill.yaml.");
|
|
6484
6785
|
}
|
|
6485
6786
|
const skillMdPath = path49.join(skillDir, "SKILL.md");
|
|
6486
|
-
if (!
|
|
6787
|
+
if (!fs31.existsSync(skillMdPath)) {
|
|
6487
6788
|
errors.push("SKILL.md not found. Create it with content describing your skill.");
|
|
6488
6789
|
} else {
|
|
6489
|
-
const content =
|
|
6790
|
+
const content = fs31.readFileSync(skillMdPath, "utf-8");
|
|
6490
6791
|
if (!content.includes("## When to Use")) {
|
|
6491
6792
|
errors.push('SKILL.md must contain a "## When to Use" section.');
|
|
6492
6793
|
}
|
|
@@ -6567,10 +6868,10 @@ ${errorList}`);
|
|
|
6567
6868
|
const meta = validation.skillMeta;
|
|
6568
6869
|
const pkg = derivePackageJson(meta);
|
|
6569
6870
|
const pkgPath = path50.join(skillDir, "package.json");
|
|
6570
|
-
|
|
6871
|
+
fs32.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
6571
6872
|
const readmePath = path50.join(skillDir, "README.md");
|
|
6572
|
-
if (!
|
|
6573
|
-
const skillMdContent =
|
|
6873
|
+
if (!fs32.existsSync(readmePath)) {
|
|
6874
|
+
const skillMdContent = fs32.readFileSync(path50.join(skillDir, "SKILL.md"), "utf-8");
|
|
6574
6875
|
const readme = `# ${pkg.name}
|
|
6575
6876
|
|
|
6576
6877
|
${meta.description}
|
|
@@ -6584,7 +6885,7 @@ harness install ${meta.name}
|
|
|
6584
6885
|
---
|
|
6585
6886
|
|
|
6586
6887
|
${skillMdContent}`;
|
|
6587
|
-
|
|
6888
|
+
fs32.writeFileSync(readmePath, readme);
|
|
6588
6889
|
}
|
|
6589
6890
|
if (opts.dryRun) {
|
|
6590
6891
|
return {
|
|
@@ -6610,7 +6911,7 @@ ${skillMdContent}`;
|
|
|
6610
6911
|
};
|
|
6611
6912
|
}
|
|
6612
6913
|
function createPublishCommand() {
|
|
6613
|
-
return new
|
|
6914
|
+
return new Command61("publish").description("Validate and publish a skill to @harness-skills on npm").option("--dry-run", "Run validation and generate package.json without publishing").option("--dir <dir>", "Skill directory (default: current directory)").option("--registry <url>", "Use a custom npm registry URL").action(async (opts, cmd) => {
|
|
6614
6915
|
const globalOpts = cmd.optsWithGlobals();
|
|
6615
6916
|
const skillDir = opts.dir || process.cwd();
|
|
6616
6917
|
try {
|
|
@@ -6635,7 +6936,7 @@ function createPublishCommand() {
|
|
|
6635
6936
|
|
|
6636
6937
|
// src/commands/skill/index.ts
|
|
6637
6938
|
function createSkillCommand() {
|
|
6638
|
-
const command = new
|
|
6939
|
+
const command = new Command62("skill").description("Skill management commands");
|
|
6639
6940
|
command.addCommand(createListCommand3());
|
|
6640
6941
|
command.addCommand(createRunCommand2());
|
|
6641
6942
|
command.addCommand(createValidateCommand2());
|
|
@@ -6647,7 +6948,7 @@ function createSkillCommand() {
|
|
|
6647
6948
|
}
|
|
6648
6949
|
|
|
6649
6950
|
// src/commands/snapshot.ts
|
|
6650
|
-
import { Command as
|
|
6951
|
+
import { Command as Command63 } from "commander";
|
|
6651
6952
|
import { execSync as execSync5 } from "child_process";
|
|
6652
6953
|
import chalk9 from "chalk";
|
|
6653
6954
|
function getCommitHash3(cwd) {
|
|
@@ -6829,7 +7130,7 @@ function registerListCommand(parent) {
|
|
|
6829
7130
|
});
|
|
6830
7131
|
}
|
|
6831
7132
|
function createSnapshotCommand() {
|
|
6832
|
-
const command = new
|
|
7133
|
+
const command = new Command63("snapshot").description("Architecture timeline snapshot commands");
|
|
6833
7134
|
registerCaptureCommand(command);
|
|
6834
7135
|
registerTrendsCommand(command);
|
|
6835
7136
|
registerListCommand(command);
|
|
@@ -6837,10 +7138,10 @@ function createSnapshotCommand() {
|
|
|
6837
7138
|
}
|
|
6838
7139
|
|
|
6839
7140
|
// src/commands/state/index.ts
|
|
6840
|
-
import { Command as
|
|
7141
|
+
import { Command as Command68 } from "commander";
|
|
6841
7142
|
|
|
6842
7143
|
// src/commands/state/show.ts
|
|
6843
|
-
import { Command as
|
|
7144
|
+
import { Command as Command64 } from "commander";
|
|
6844
7145
|
import * as path51 from "path";
|
|
6845
7146
|
function printStateText(state, stream) {
|
|
6846
7147
|
if (stream) console.log(`Stream: ${stream}`);
|
|
@@ -6865,7 +7166,7 @@ function printStateProgress(progress) {
|
|
|
6865
7166
|
}
|
|
6866
7167
|
}
|
|
6867
7168
|
function createShowCommand() {
|
|
6868
|
-
return new
|
|
7169
|
+
return new Command64("show").description("Show current project state").option("--path <path>", "Project root path", ".").option("--stream <name>", "Target a specific stream").action(async (opts, cmd) => {
|
|
6869
7170
|
const globalOpts = cmd.optsWithGlobals();
|
|
6870
7171
|
const result = await loadState(path51.resolve(opts.path), opts.stream);
|
|
6871
7172
|
if (!result.ok) {
|
|
@@ -6882,8 +7183,8 @@ function createShowCommand() {
|
|
|
6882
7183
|
}
|
|
6883
7184
|
|
|
6884
7185
|
// src/commands/state/reset.ts
|
|
6885
|
-
import { Command as
|
|
6886
|
-
import * as
|
|
7186
|
+
import { Command as Command65 } from "commander";
|
|
7187
|
+
import * as fs33 from "fs";
|
|
6887
7188
|
import * as path52 from "path";
|
|
6888
7189
|
import * as readline from "readline";
|
|
6889
7190
|
async function resolveStatePath(projectPath, stream) {
|
|
@@ -6908,7 +7209,7 @@ async function confirmReset() {
|
|
|
6908
7209
|
async function runReset(opts) {
|
|
6909
7210
|
const projectPath = path52.resolve(opts.path);
|
|
6910
7211
|
const statePath = await resolveStatePath(projectPath, opts.stream);
|
|
6911
|
-
if (!
|
|
7212
|
+
if (!fs33.existsSync(statePath)) {
|
|
6912
7213
|
logger.info("No state file found. Nothing to reset.");
|
|
6913
7214
|
process.exit(ExitCode.SUCCESS);
|
|
6914
7215
|
}
|
|
@@ -6917,7 +7218,7 @@ async function runReset(opts) {
|
|
|
6917
7218
|
process.exit(ExitCode.SUCCESS);
|
|
6918
7219
|
}
|
|
6919
7220
|
try {
|
|
6920
|
-
|
|
7221
|
+
fs33.unlinkSync(statePath);
|
|
6921
7222
|
logger.success("Project state reset.");
|
|
6922
7223
|
} catch (e) {
|
|
6923
7224
|
logger.error(`Failed to reset state: ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -6926,14 +7227,14 @@ async function runReset(opts) {
|
|
|
6926
7227
|
process.exit(ExitCode.SUCCESS);
|
|
6927
7228
|
}
|
|
6928
7229
|
function createResetCommand() {
|
|
6929
|
-
return new
|
|
7230
|
+
return new Command65("reset").description("Reset project state (deletes .harness/state.json)").option("--path <path>", "Project root path", ".").option("--stream <name>", "Target a specific stream").option("--yes", "Skip confirmation prompt").action(async (opts) => runReset(opts));
|
|
6930
7231
|
}
|
|
6931
7232
|
|
|
6932
7233
|
// src/commands/state/learn.ts
|
|
6933
|
-
import { Command as
|
|
7234
|
+
import { Command as Command66 } from "commander";
|
|
6934
7235
|
import * as path53 from "path";
|
|
6935
7236
|
function createLearnCommand() {
|
|
6936
|
-
return new
|
|
7237
|
+
return new Command66("learn").description("Append a learning to .harness/learnings.md").argument("<message>", "The learning to record").option("--path <path>", "Project root path", ".").option("--stream <name>", "Target a specific stream").action(async (message, opts, _cmd) => {
|
|
6937
7238
|
const projectPath = path53.resolve(opts.path);
|
|
6938
7239
|
const result = await appendLearning(projectPath, message, void 0, void 0, opts.stream);
|
|
6939
7240
|
if (!result.ok) {
|
|
@@ -6947,7 +7248,7 @@ function createLearnCommand() {
|
|
|
6947
7248
|
}
|
|
6948
7249
|
|
|
6949
7250
|
// src/commands/state/streams.ts
|
|
6950
|
-
import { Command as
|
|
7251
|
+
import { Command as Command67 } from "commander";
|
|
6951
7252
|
import * as path54 from "path";
|
|
6952
7253
|
async function runListStreams(opts, globalOpts) {
|
|
6953
7254
|
const projectPath = path54.resolve(opts.path);
|
|
@@ -6998,7 +7299,7 @@ async function runActivateStream(name, opts) {
|
|
|
6998
7299
|
process.exit(ExitCode.SUCCESS);
|
|
6999
7300
|
}
|
|
7000
7301
|
function createStreamsCommand() {
|
|
7001
|
-
const command = new
|
|
7302
|
+
const command = new Command67("streams").description("Manage state streams");
|
|
7002
7303
|
command.command("list").description("List all known streams").option("--path <path>", "Project root path", ".").action(async (opts, cmd) => runListStreams(opts, cmd.optsWithGlobals()));
|
|
7003
7304
|
command.command("create <name>").description("Create a new stream").option("--path <path>", "Project root path", ".").option("--branch <branch>", "Associate with a git branch").action(async (name, opts) => runCreateStream(name, opts));
|
|
7004
7305
|
command.command("archive <name>").description("Archive a stream").option("--path <path>", "Project root path", ".").action(async (name, opts) => runArchiveStream(name, opts));
|
|
@@ -7008,7 +7309,7 @@ function createStreamsCommand() {
|
|
|
7008
7309
|
|
|
7009
7310
|
// src/commands/state/index.ts
|
|
7010
7311
|
function createStateCommand() {
|
|
7011
|
-
const command = new
|
|
7312
|
+
const command = new Command68("state").description("Project state management commands");
|
|
7012
7313
|
command.addCommand(createShowCommand());
|
|
7013
7314
|
command.addCommand(createResetCommand());
|
|
7014
7315
|
command.addCommand(createLearnCommand());
|
|
@@ -7017,7 +7318,7 @@ function createStateCommand() {
|
|
|
7017
7318
|
}
|
|
7018
7319
|
|
|
7019
7320
|
// src/commands/taint.ts
|
|
7020
|
-
import { Command as
|
|
7321
|
+
import { Command as Command69 } from "commander";
|
|
7021
7322
|
function getProjectRoot() {
|
|
7022
7323
|
return process.cwd();
|
|
7023
7324
|
}
|
|
@@ -7089,14 +7390,143 @@ function registerStatusCommand(taint) {
|
|
|
7089
7390
|
});
|
|
7090
7391
|
}
|
|
7091
7392
|
function createTaintCommand() {
|
|
7092
|
-
const taint = new
|
|
7393
|
+
const taint = new Command69("taint").description("Manage sentinel session taint state");
|
|
7093
7394
|
registerClearCommand(taint);
|
|
7094
7395
|
registerStatusCommand(taint);
|
|
7095
7396
|
return taint;
|
|
7096
7397
|
}
|
|
7097
7398
|
|
|
7399
|
+
// src/commands/telemetry/index.ts
|
|
7400
|
+
import { Command as Command72 } from "commander";
|
|
7401
|
+
|
|
7402
|
+
// src/commands/telemetry/identify.ts
|
|
7403
|
+
import { Command as Command70 } from "commander";
|
|
7404
|
+
import * as fs34 from "fs";
|
|
7405
|
+
import * as path55 from "path";
|
|
7406
|
+
function telemetryFilePath(cwd) {
|
|
7407
|
+
return path55.join(cwd, ".harness", "telemetry.json");
|
|
7408
|
+
}
|
|
7409
|
+
function writeTelemetryFile(cwd, data) {
|
|
7410
|
+
const filePath = telemetryFilePath(cwd);
|
|
7411
|
+
const dir = path55.dirname(filePath);
|
|
7412
|
+
fs34.mkdirSync(dir, { recursive: true });
|
|
7413
|
+
fs34.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8");
|
|
7414
|
+
}
|
|
7415
|
+
var IDENTITY_FIELDS = ["project", "team", "alias"];
|
|
7416
|
+
function applyIdentityFields(opts, identity) {
|
|
7417
|
+
for (const field of IDENTITY_FIELDS) {
|
|
7418
|
+
if (opts[field]) identity[field] = opts[field];
|
|
7419
|
+
}
|
|
7420
|
+
}
|
|
7421
|
+
function printIdentity(identity) {
|
|
7422
|
+
for (const field of IDENTITY_FIELDS) {
|
|
7423
|
+
if (identity[field]) logger.info(` ${field.padEnd(7)}: ${identity[field]}`);
|
|
7424
|
+
}
|
|
7425
|
+
}
|
|
7426
|
+
function createIdentifyCommand() {
|
|
7427
|
+
const cmd = new Command70("identify").description("Set or clear telemetry identity fields in .harness/telemetry.json").option("--project <name>", "Project name").option("--team <name>", "Team name").option("--alias <name>", "User alias").option("--clear", "Remove all identity fields").action((opts) => {
|
|
7428
|
+
const cwd = process.cwd();
|
|
7429
|
+
if (opts.clear) {
|
|
7430
|
+
writeTelemetryFile(cwd, { identity: {} });
|
|
7431
|
+
logger.success("Telemetry identity cleared.");
|
|
7432
|
+
return;
|
|
7433
|
+
}
|
|
7434
|
+
const hasField = IDENTITY_FIELDS.some((f) => opts[f]);
|
|
7435
|
+
if (!hasField) {
|
|
7436
|
+
logger.error("Provide at least one of --project, --team, --alias, or --clear.");
|
|
7437
|
+
process.exitCode = 1;
|
|
7438
|
+
return;
|
|
7439
|
+
}
|
|
7440
|
+
const existingIdentity = readIdentity(cwd);
|
|
7441
|
+
const existing = { identity: { ...existingIdentity } };
|
|
7442
|
+
applyIdentityFields(opts, existing.identity);
|
|
7443
|
+
writeTelemetryFile(cwd, existing);
|
|
7444
|
+
logger.success("Telemetry identity updated:");
|
|
7445
|
+
printIdentity(existing.identity);
|
|
7446
|
+
});
|
|
7447
|
+
return cmd;
|
|
7448
|
+
}
|
|
7449
|
+
|
|
7450
|
+
// src/commands/telemetry/status.ts
|
|
7451
|
+
import { Command as Command71 } from "commander";
|
|
7452
|
+
function gatherEnvOverrides() {
|
|
7453
|
+
const overrides = {};
|
|
7454
|
+
if (process.env.DO_NOT_TRACK) overrides.DO_NOT_TRACK = process.env.DO_NOT_TRACK;
|
|
7455
|
+
if (process.env.HARNESS_TELEMETRY_OPTOUT)
|
|
7456
|
+
overrides.HARNESS_TELEMETRY_OPTOUT = process.env.HARNESS_TELEMETRY_OPTOUT;
|
|
7457
|
+
return overrides;
|
|
7458
|
+
}
|
|
7459
|
+
function resolveDisabledReason() {
|
|
7460
|
+
if (process.env.DO_NOT_TRACK === "1") return "DO_NOT_TRACK=1";
|
|
7461
|
+
if (process.env.HARNESS_TELEMETRY_OPTOUT === "1") return "HARNESS_TELEMETRY_OPTOUT=1";
|
|
7462
|
+
return "telemetry.enabled is false in config";
|
|
7463
|
+
}
|
|
7464
|
+
function printHumanStatus(result) {
|
|
7465
|
+
logger.info(`Telemetry: ${result.consent.allowed ? "enabled" : "disabled"}`);
|
|
7466
|
+
if (!result.consent.allowed && result.consent.reason) {
|
|
7467
|
+
logger.info(` Reason: ${result.consent.reason}`);
|
|
7468
|
+
}
|
|
7469
|
+
logger.info(`Install ID: ${result.installId ?? "not yet created"}`);
|
|
7470
|
+
const { identity } = result;
|
|
7471
|
+
const hasIdentity = identity.project || identity.team || identity.alias;
|
|
7472
|
+
if (hasIdentity) {
|
|
7473
|
+
logger.info("Identity:");
|
|
7474
|
+
for (const [key, value] of Object.entries(identity)) {
|
|
7475
|
+
if (value) logger.info(` ${key.padEnd(7)}: ${value}`);
|
|
7476
|
+
}
|
|
7477
|
+
} else {
|
|
7478
|
+
logger.info("Identity: not configured");
|
|
7479
|
+
}
|
|
7480
|
+
const overrideKeys = Object.keys(result.envOverrides);
|
|
7481
|
+
if (overrideKeys.length > 0) {
|
|
7482
|
+
logger.info("Env overrides:");
|
|
7483
|
+
for (const key of overrideKeys) {
|
|
7484
|
+
logger.info(` ${key}=${result.envOverrides[key]}`);
|
|
7485
|
+
}
|
|
7486
|
+
}
|
|
7487
|
+
}
|
|
7488
|
+
function createStatusCommand() {
|
|
7489
|
+
const cmd = new Command71("status").description("Show current telemetry consent state, install ID, and identity").option("--json", "Output as JSON").action((opts) => {
|
|
7490
|
+
const cwd = process.cwd();
|
|
7491
|
+
const envOverrides = gatherEnvOverrides();
|
|
7492
|
+
const consent = resolveConsent(cwd, void 0);
|
|
7493
|
+
let installId = null;
|
|
7494
|
+
let identity = {};
|
|
7495
|
+
if (consent.allowed) {
|
|
7496
|
+
identity = readIdentity(cwd);
|
|
7497
|
+
try {
|
|
7498
|
+
installId = getOrCreateInstallId(cwd);
|
|
7499
|
+
} catch {
|
|
7500
|
+
}
|
|
7501
|
+
}
|
|
7502
|
+
const result = {
|
|
7503
|
+
consent: {
|
|
7504
|
+
allowed: consent.allowed,
|
|
7505
|
+
...!consent.allowed ? { reason: resolveDisabledReason() } : {}
|
|
7506
|
+
},
|
|
7507
|
+
installId,
|
|
7508
|
+
identity,
|
|
7509
|
+
envOverrides
|
|
7510
|
+
};
|
|
7511
|
+
if (opts.json) {
|
|
7512
|
+
console.log(JSON.stringify(result, null, 2));
|
|
7513
|
+
return;
|
|
7514
|
+
}
|
|
7515
|
+
printHumanStatus(result);
|
|
7516
|
+
});
|
|
7517
|
+
return cmd;
|
|
7518
|
+
}
|
|
7519
|
+
|
|
7520
|
+
// src/commands/telemetry/index.ts
|
|
7521
|
+
function createTelemetryCommand() {
|
|
7522
|
+
const command = new Command72("telemetry").description("Telemetry identity and status management");
|
|
7523
|
+
command.addCommand(createIdentifyCommand());
|
|
7524
|
+
command.addCommand(createStatusCommand());
|
|
7525
|
+
return command;
|
|
7526
|
+
}
|
|
7527
|
+
|
|
7098
7528
|
// src/commands/traceability.ts
|
|
7099
|
-
import { Command as
|
|
7529
|
+
import { Command as Command73 } from "commander";
|
|
7100
7530
|
import chalk10 from "chalk";
|
|
7101
7531
|
function confidenceLabel(maxConfidence) {
|
|
7102
7532
|
if (maxConfidence >= 0.8) return "explicit";
|
|
@@ -7212,7 +7642,7 @@ async function runTraceability(options) {
|
|
|
7212
7642
|
const projectPath = process.cwd();
|
|
7213
7643
|
const store = await loadGraphStore(projectPath);
|
|
7214
7644
|
if (!store) handleNoStore(mode);
|
|
7215
|
-
const graphModule = await import("./dist-
|
|
7645
|
+
const graphModule = await import("./dist-QW5G3GX3.js");
|
|
7216
7646
|
const filterOptions = buildFilterOptions(options);
|
|
7217
7647
|
const results = graphModule.queryTraceability(store, filterOptions);
|
|
7218
7648
|
if (results.length === 0) handleEmptyResults(mode);
|
|
@@ -7227,7 +7657,7 @@ async function runTraceability(options) {
|
|
|
7227
7657
|
process.exit(ExitCode.SUCCESS);
|
|
7228
7658
|
}
|
|
7229
7659
|
function createTraceabilityCommand() {
|
|
7230
|
-
return new
|
|
7660
|
+
return new Command73("traceability").description("Show spec-to-implementation traceability from the knowledge graph").option("--spec <path>", "Filter by spec file path").option("--feature <name>", "Filter by feature name").action(async (opts, cmd) => {
|
|
7231
7661
|
const globalOpts = cmd.optsWithGlobals();
|
|
7232
7662
|
await runTraceability({
|
|
7233
7663
|
spec: opts.spec,
|
|
@@ -7240,15 +7670,15 @@ function createTraceabilityCommand() {
|
|
|
7240
7670
|
}
|
|
7241
7671
|
|
|
7242
7672
|
// src/commands/uninstall.ts
|
|
7243
|
-
import * as
|
|
7244
|
-
import { Command as
|
|
7673
|
+
import * as path56 from "path";
|
|
7674
|
+
import { Command as Command74 } from "commander";
|
|
7245
7675
|
async function runUninstall(skillName, options) {
|
|
7246
7676
|
const packageName = resolvePackageName(skillName);
|
|
7247
7677
|
const shortName = extractSkillName(packageName);
|
|
7248
7678
|
const globalDir = resolveGlobalSkillsDir();
|
|
7249
|
-
const skillsDir =
|
|
7250
|
-
const communityBase =
|
|
7251
|
-
const lockfilePath =
|
|
7679
|
+
const skillsDir = path56.dirname(globalDir);
|
|
7680
|
+
const communityBase = path56.join(skillsDir, "community");
|
|
7681
|
+
const lockfilePath = path56.join(communityBase, "skills-lock.json");
|
|
7252
7682
|
const lockfile = readLockfile2(lockfilePath);
|
|
7253
7683
|
const entry = lockfile.skills[packageName];
|
|
7254
7684
|
if (!entry) {
|
|
@@ -7278,7 +7708,7 @@ async function runUninstall(skillName, options) {
|
|
|
7278
7708
|
return result;
|
|
7279
7709
|
}
|
|
7280
7710
|
function createUninstallCommand() {
|
|
7281
|
-
const cmd = new
|
|
7711
|
+
const cmd = new Command74("uninstall");
|
|
7282
7712
|
cmd.description("Uninstall a community skill").argument("<skill>", "Skill name or @harness-skills/scoped package name").option("--force", "Remove even if other skills depend on this one").action(async (skill, opts) => {
|
|
7283
7713
|
try {
|
|
7284
7714
|
const result = await runUninstall(skill, opts);
|
|
@@ -7297,9 +7727,9 @@ function createUninstallCommand() {
|
|
|
7297
7727
|
}
|
|
7298
7728
|
|
|
7299
7729
|
// src/commands/uninstall-constraints.ts
|
|
7300
|
-
import * as
|
|
7301
|
-
import * as
|
|
7302
|
-
import { Command as
|
|
7730
|
+
import * as fs35 from "fs/promises";
|
|
7731
|
+
import * as path57 from "path";
|
|
7732
|
+
import { Command as Command75 } from "commander";
|
|
7303
7733
|
async function runUninstallConstraints(options) {
|
|
7304
7734
|
const { packageName, configPath, lockfilePath } = options;
|
|
7305
7735
|
const lockfileResult = await readLockfile(lockfilePath);
|
|
@@ -7319,7 +7749,7 @@ async function runUninstallConstraints(options) {
|
|
|
7319
7749
|
}
|
|
7320
7750
|
let localConfig;
|
|
7321
7751
|
try {
|
|
7322
|
-
const raw = await
|
|
7752
|
+
const raw = await fs35.readFile(configPath, "utf-8");
|
|
7323
7753
|
localConfig = JSON.parse(raw);
|
|
7324
7754
|
} catch (err) {
|
|
7325
7755
|
return {
|
|
@@ -7356,11 +7786,11 @@ async function runUninstallConstraints(options) {
|
|
|
7356
7786
|
};
|
|
7357
7787
|
}
|
|
7358
7788
|
function createUninstallConstraintsCommand() {
|
|
7359
|
-
const cmd = new
|
|
7789
|
+
const cmd = new Command75("uninstall-constraints");
|
|
7360
7790
|
cmd.description("Remove a previously installed constraints package").argument("<name>", "Name of the constraint package to uninstall").option("-c, --config <path>", "Path to harness.config.json").action(async (name, opts) => {
|
|
7361
7791
|
let configPath;
|
|
7362
7792
|
if (opts.config) {
|
|
7363
|
-
configPath =
|
|
7793
|
+
configPath = path57.resolve(opts.config);
|
|
7364
7794
|
} else {
|
|
7365
7795
|
const found = findConfigFile();
|
|
7366
7796
|
if (!found.ok) {
|
|
@@ -7369,8 +7799,8 @@ function createUninstallConstraintsCommand() {
|
|
|
7369
7799
|
}
|
|
7370
7800
|
configPath = found.value;
|
|
7371
7801
|
}
|
|
7372
|
-
const projectRoot =
|
|
7373
|
-
const lockfilePath =
|
|
7802
|
+
const projectRoot = path57.dirname(configPath);
|
|
7803
|
+
const lockfilePath = path57.join(projectRoot, ".harness", "constraints.lock.json");
|
|
7374
7804
|
const result = await runUninstallConstraints({
|
|
7375
7805
|
packageName: name,
|
|
7376
7806
|
configPath,
|
|
@@ -7395,9 +7825,11 @@ function createUninstallConstraintsCommand() {
|
|
|
7395
7825
|
}
|
|
7396
7826
|
|
|
7397
7827
|
// src/commands/update.ts
|
|
7398
|
-
import { Command as
|
|
7399
|
-
import { execFileSync as execFileSync6 } from "child_process";
|
|
7400
|
-
import { realpathSync } from "fs";
|
|
7828
|
+
import { Command as Command76 } from "commander";
|
|
7829
|
+
import { execFile, execFileSync as execFileSync6 } from "child_process";
|
|
7830
|
+
import { realpathSync, existsSync as existsSync33, readFileSync as readFileSync20 } from "fs";
|
|
7831
|
+
import { join as join46 } from "path";
|
|
7832
|
+
import { promisify } from "util";
|
|
7401
7833
|
import readline2 from "readline";
|
|
7402
7834
|
import chalk11 from "chalk";
|
|
7403
7835
|
function detectPackageManager() {
|
|
@@ -7417,25 +7849,32 @@ function detectPackageManager() {
|
|
|
7417
7849
|
}
|
|
7418
7850
|
return "npm";
|
|
7419
7851
|
}
|
|
7420
|
-
|
|
7421
|
-
|
|
7852
|
+
var execFileAsync = promisify(execFile);
|
|
7853
|
+
async function getLatestVersionAsync(pkg) {
|
|
7854
|
+
const { stdout } = await execFileAsync("npm", ["view", pkg, "dist-tags.latest"], {
|
|
7422
7855
|
encoding: "utf-8",
|
|
7423
7856
|
timeout: 15e3
|
|
7424
7857
|
});
|
|
7425
|
-
return
|
|
7858
|
+
return stdout.trim();
|
|
7426
7859
|
}
|
|
7427
|
-
function
|
|
7860
|
+
function getInstalledVersions(pm, packages) {
|
|
7861
|
+
const versions = {};
|
|
7428
7862
|
try {
|
|
7429
|
-
const output = execFileSync6(pm, ["list", "-g", "
|
|
7863
|
+
const output = execFileSync6(pm, ["list", "-g", "--json"], {
|
|
7430
7864
|
encoding: "utf-8",
|
|
7431
7865
|
timeout: 15e3
|
|
7432
7866
|
});
|
|
7433
7867
|
const data = JSON.parse(output);
|
|
7434
7868
|
const deps = data.dependencies ?? {};
|
|
7435
|
-
|
|
7869
|
+
for (const pkg of packages) {
|
|
7870
|
+
versions[pkg] = deps[pkg]?.version ?? null;
|
|
7871
|
+
}
|
|
7436
7872
|
} catch {
|
|
7437
|
-
|
|
7873
|
+
for (const pkg of packages) {
|
|
7874
|
+
versions[pkg] = null;
|
|
7875
|
+
}
|
|
7438
7876
|
}
|
|
7877
|
+
return versions;
|
|
7439
7878
|
}
|
|
7440
7879
|
function getInstalledPackages(pm) {
|
|
7441
7880
|
try {
|
|
@@ -7462,9 +7901,41 @@ function prompt(question) {
|
|
|
7462
7901
|
});
|
|
7463
7902
|
});
|
|
7464
7903
|
}
|
|
7904
|
+
function refreshHooks() {
|
|
7905
|
+
const cwd = process.cwd();
|
|
7906
|
+
const configPath = join46(cwd, "harness.config.json");
|
|
7907
|
+
if (!existsSync33(configPath)) return;
|
|
7908
|
+
let profile = "standard";
|
|
7909
|
+
const profilePath = join46(cwd, ".harness", "hooks", "profile.json");
|
|
7910
|
+
try {
|
|
7911
|
+
const data = JSON.parse(readFileSync20(profilePath, "utf-8"));
|
|
7912
|
+
if (data.profile && ["minimal", "standard", "strict"].includes(data.profile)) {
|
|
7913
|
+
profile = data.profile;
|
|
7914
|
+
}
|
|
7915
|
+
} catch {
|
|
7916
|
+
}
|
|
7917
|
+
try {
|
|
7918
|
+
const result = initHooks({ profile, projectDir: cwd });
|
|
7919
|
+
logger.success(`Refreshed ${result.copiedScripts.length} hooks (${profile} profile)`);
|
|
7920
|
+
} catch (err) {
|
|
7921
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
7922
|
+
logger.warn(`Hook refresh failed: ${msg}`);
|
|
7923
|
+
}
|
|
7924
|
+
}
|
|
7925
|
+
function runLocalGraphScan() {
|
|
7926
|
+
try {
|
|
7927
|
+
logger.info("Scanning codebase to rebuild knowledge graph...");
|
|
7928
|
+
execFileSync6("harness", ["graph", "scan", "."], { stdio: "inherit" });
|
|
7929
|
+
} catch {
|
|
7930
|
+
logger.warn("Graph scan failed. Run manually:");
|
|
7931
|
+
console.log(` ${chalk11.cyan("harness graph scan .")}`);
|
|
7932
|
+
}
|
|
7933
|
+
}
|
|
7465
7934
|
async function offerRegeneration() {
|
|
7466
7935
|
console.log("");
|
|
7467
|
-
const regenAnswer = await prompt(
|
|
7936
|
+
const regenAnswer = await prompt(
|
|
7937
|
+
"Regenerate slash commands, agent definitions, and knowledge graph? (Y/n) "
|
|
7938
|
+
);
|
|
7468
7939
|
if (regenAnswer === "n" || regenAnswer === "no") return;
|
|
7469
7940
|
const scopeAnswer = await prompt("Generate for (G)lobal or (l)ocal project? (G/l) ");
|
|
7470
7941
|
const isGlobal = scopeAnswer !== "l" && scopeAnswer !== "local";
|
|
@@ -7476,28 +7947,29 @@ async function offerRegeneration() {
|
|
|
7476
7947
|
logger.warn("Generation failed. Run manually:");
|
|
7477
7948
|
console.log(` ${chalk11.cyan(`harness generate${isGlobal ? " --global" : ""}`)}`);
|
|
7478
7949
|
}
|
|
7950
|
+
if (!isGlobal) {
|
|
7951
|
+
runLocalGraphScan();
|
|
7952
|
+
}
|
|
7479
7953
|
}
|
|
7480
|
-
async function
|
|
7481
|
-
if (opts.version) return void 0;
|
|
7954
|
+
async function checkAllPackages(packages, installedVersions) {
|
|
7482
7955
|
logger.info("Checking for updates...");
|
|
7483
|
-
|
|
7484
|
-
|
|
7485
|
-
|
|
7486
|
-
|
|
7487
|
-
|
|
7488
|
-
|
|
7489
|
-
|
|
7490
|
-
|
|
7491
|
-
|
|
7492
|
-
|
|
7493
|
-
|
|
7494
|
-
|
|
7495
|
-
|
|
7496
|
-
|
|
7497
|
-
|
|
7498
|
-
console.log("");
|
|
7956
|
+
const results = await Promise.allSettled(
|
|
7957
|
+
packages.map(async (pkg) => {
|
|
7958
|
+
const latest = await getLatestVersionAsync(pkg);
|
|
7959
|
+
const current = installedVersions[pkg] ?? null;
|
|
7960
|
+
return { pkg, current, latest, outdated: !current || current !== latest };
|
|
7961
|
+
})
|
|
7962
|
+
);
|
|
7963
|
+
const outdated = [];
|
|
7964
|
+
for (const result of results) {
|
|
7965
|
+
if (result.status === "rejected") {
|
|
7966
|
+
continue;
|
|
7967
|
+
}
|
|
7968
|
+
if (result.value.outdated) {
|
|
7969
|
+
outdated.push(result.value);
|
|
7970
|
+
}
|
|
7499
7971
|
}
|
|
7500
|
-
return
|
|
7972
|
+
return { hasUpdates: outdated.length > 0, outdated };
|
|
7501
7973
|
}
|
|
7502
7974
|
function buildInstallPackages(packages, opts) {
|
|
7503
7975
|
const pm = detectPackageManager();
|
|
@@ -7515,12 +7987,31 @@ async function runUpdateAction(opts, globalOpts) {
|
|
|
7515
7987
|
if (globalOpts.verbose) {
|
|
7516
7988
|
logger.info(`Detected package manager: ${pm}`);
|
|
7517
7989
|
}
|
|
7518
|
-
const currentVersion = getInstalledVersion(pm);
|
|
7519
|
-
await checkForUpdates(pm, opts, currentVersion);
|
|
7520
7990
|
const packages = getInstalledPackages(pm);
|
|
7521
7991
|
if (globalOpts.verbose) {
|
|
7522
7992
|
logger.info(`Installed packages: ${packages.join(", ")}`);
|
|
7523
7993
|
}
|
|
7994
|
+
if (opts.regenerate) {
|
|
7995
|
+
await offerRegeneration();
|
|
7996
|
+
process.exit(ExitCode.SUCCESS);
|
|
7997
|
+
}
|
|
7998
|
+
if (!opts.version && !opts.force) {
|
|
7999
|
+
const installedVersions = getInstalledVersions(pm, packages);
|
|
8000
|
+
const { hasUpdates, outdated } = await checkAllPackages(packages, installedVersions);
|
|
8001
|
+
if (!hasUpdates) {
|
|
8002
|
+
logger.success("All packages are up to date");
|
|
8003
|
+
refreshHooks();
|
|
8004
|
+
await offerRegeneration();
|
|
8005
|
+
process.exit(ExitCode.SUCCESS);
|
|
8006
|
+
}
|
|
8007
|
+
console.log("");
|
|
8008
|
+
for (const { pkg, current, latest } of outdated) {
|
|
8009
|
+
const shortName = pkg.replace("@harness-engineering/", "");
|
|
8010
|
+
const currentStr = current ? chalk11.dim(`v${current}`) : chalk11.dim("not installed");
|
|
8011
|
+
logger.info(`${shortName}: ${currentStr} \u2192 ${chalk11.green(`v${latest}`)}`);
|
|
8012
|
+
}
|
|
8013
|
+
console.log("");
|
|
8014
|
+
}
|
|
7524
8015
|
const { installPkgs, installCmd } = buildInstallPackages(packages, opts);
|
|
7525
8016
|
if (globalOpts.verbose) {
|
|
7526
8017
|
logger.info(`Running: ${installCmd}`);
|
|
@@ -7536,20 +8027,24 @@ async function runUpdateAction(opts, globalOpts) {
|
|
|
7536
8027
|
console.log(` ${chalk11.cyan(installCmd)}`);
|
|
7537
8028
|
process.exit(ExitCode.ERROR);
|
|
7538
8029
|
}
|
|
8030
|
+
refreshHooks();
|
|
7539
8031
|
await offerRegeneration();
|
|
7540
8032
|
process.exit(ExitCode.SUCCESS);
|
|
7541
8033
|
}
|
|
7542
8034
|
function createUpdateCommand() {
|
|
7543
|
-
return new
|
|
8035
|
+
return new Command76("update").description("Update all @harness-engineering packages to the latest version").option("--version <semver>", "Pin @harness-engineering/cli to a specific version").option("--force", "Force update even if versions match").option(
|
|
8036
|
+
"--regenerate",
|
|
8037
|
+
"Only regenerate slash commands and agent definitions (skip package updates)"
|
|
8038
|
+
).action(async (opts, cmd) => {
|
|
7544
8039
|
const globalOpts = cmd.optsWithGlobals();
|
|
7545
8040
|
await runUpdateAction(opts, globalOpts);
|
|
7546
8041
|
});
|
|
7547
8042
|
}
|
|
7548
8043
|
|
|
7549
8044
|
// src/commands/usage.ts
|
|
7550
|
-
import { Command as
|
|
8045
|
+
import { Command as Command77 } from "commander";
|
|
7551
8046
|
async function loadAndPriceRecords(cwd, includeClaudeSessions = false) {
|
|
7552
|
-
const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-
|
|
8047
|
+
const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-7EBSGAHX.js");
|
|
7553
8048
|
const records = readCostRecords(cwd);
|
|
7554
8049
|
if (includeClaudeSessions) {
|
|
7555
8050
|
const ccRecords = parseCCRecords();
|
|
@@ -7574,6 +8069,13 @@ function formatTokenCount(count) {
|
|
|
7574
8069
|
if (count >= 1e3) return (count / 1e3).toFixed(1) + "K";
|
|
7575
8070
|
return String(count);
|
|
7576
8071
|
}
|
|
8072
|
+
function formatPercent(ratio) {
|
|
8073
|
+
return (ratio * 100).toFixed(1) + "%";
|
|
8074
|
+
}
|
|
8075
|
+
function computeCacheHitRate(cacheReadTokens, inputTokens) {
|
|
8076
|
+
if (cacheReadTokens == null || cacheReadTokens === 0 || inputTokens === 0) return null;
|
|
8077
|
+
return cacheReadTokens / inputTokens;
|
|
8078
|
+
}
|
|
7577
8079
|
function formatModels(models) {
|
|
7578
8080
|
if (models.length === 0) return "unknown";
|
|
7579
8081
|
if (models.length === 1) return models[0] ?? "unknown";
|
|
@@ -7593,15 +8095,25 @@ function registerDailyCommand(usage) {
|
|
|
7593
8095
|
}
|
|
7594
8096
|
return;
|
|
7595
8097
|
}
|
|
7596
|
-
const { aggregateByDay } = await import("./dist-
|
|
8098
|
+
const { aggregateByDay } = await import("./dist-7EBSGAHX.js");
|
|
7597
8099
|
const dailyData = aggregateByDay(records);
|
|
7598
8100
|
const limited = dailyData.slice(0, days);
|
|
7599
8101
|
if (globalOpts.json) {
|
|
7600
|
-
|
|
8102
|
+
const enriched = limited.map((day) => {
|
|
8103
|
+
const hitRate = computeCacheHitRate(day.cacheReadTokens, day.tokens.inputTokens);
|
|
8104
|
+
return {
|
|
8105
|
+
...day,
|
|
8106
|
+
...hitRate != null ? { cacheHitRate: Math.round(hitRate * 1e3) / 1e3 } : {}
|
|
8107
|
+
};
|
|
8108
|
+
});
|
|
8109
|
+
console.log(JSON.stringify(enriched, null, 2));
|
|
7601
8110
|
return;
|
|
7602
8111
|
}
|
|
7603
|
-
const
|
|
7604
|
-
const
|
|
8112
|
+
const hasCacheData = limited.some((d) => d.cacheReadTokens != null && d.cacheReadTokens > 0);
|
|
8113
|
+
const cacheHeader = hasCacheData ? " | Cache " : "";
|
|
8114
|
+
const cacheDivider = hasCacheData ? " | ------" : "";
|
|
8115
|
+
const header = "Date | Sessions | Input | Output | Model(s) | Cost " + cacheHeader;
|
|
8116
|
+
const divider = "-------------|----------|-----------|-----------|------------------------------|-------" + cacheDivider;
|
|
7605
8117
|
logger.info(header);
|
|
7606
8118
|
logger.info(divider);
|
|
7607
8119
|
for (const day of limited) {
|
|
@@ -7611,7 +8123,13 @@ function registerDailyCommand(usage) {
|
|
|
7611
8123
|
const output = formatTokenCount(day.tokens.outputTokens).padStart(9);
|
|
7612
8124
|
const models = formatModels(day.models).padEnd(28);
|
|
7613
8125
|
const cost = formatMicroUSD(day.costMicroUSD);
|
|
7614
|
-
|
|
8126
|
+
const cacheCol = hasCacheData ? (() => {
|
|
8127
|
+
const rate = computeCacheHitRate(day.cacheReadTokens, day.tokens.inputTokens);
|
|
8128
|
+
return " | " + (rate != null ? formatPercent(rate).padStart(5) : " -");
|
|
8129
|
+
})() : "";
|
|
8130
|
+
logger.info(
|
|
8131
|
+
`${date} | ${sessions} | ${input} | ${output} | ${models} | ${cost}${cacheCol}`
|
|
8132
|
+
);
|
|
7615
8133
|
}
|
|
7616
8134
|
});
|
|
7617
8135
|
}
|
|
@@ -7629,7 +8147,7 @@ function registerSessionsCommand(usage) {
|
|
|
7629
8147
|
}
|
|
7630
8148
|
return;
|
|
7631
8149
|
}
|
|
7632
|
-
const { aggregateBySession } = await import("./dist-
|
|
8150
|
+
const { aggregateBySession } = await import("./dist-7EBSGAHX.js");
|
|
7633
8151
|
const sessionData = aggregateBySession(records);
|
|
7634
8152
|
const limited = sessionData.slice(0, limit);
|
|
7635
8153
|
if (globalOpts.json) {
|
|
@@ -7688,6 +8206,12 @@ function printSessionDetail(match) {
|
|
|
7688
8206
|
if (match.cacheCreationTokens != null) {
|
|
7689
8207
|
logger.info(` Cache creation tokens: ${formatTokenCount(match.cacheCreationTokens)}`);
|
|
7690
8208
|
}
|
|
8209
|
+
const hitRate = computeCacheHitRate(match.cacheReadTokens, match.tokens.inputTokens);
|
|
8210
|
+
if (hitRate != null) {
|
|
8211
|
+
logger.info("");
|
|
8212
|
+
logger.info("Cache Performance:");
|
|
8213
|
+
logger.info(` Cache hit rate: ${formatPercent(hitRate)}`);
|
|
8214
|
+
}
|
|
7691
8215
|
logger.info("");
|
|
7692
8216
|
logger.info(`Cost: ${formatMicroUSD(match.costMicroUSD)}`);
|
|
7693
8217
|
}
|
|
@@ -7696,7 +8220,7 @@ function registerSessionCommand(usage) {
|
|
|
7696
8220
|
const globalOpts = cmd.optsWithGlobals();
|
|
7697
8221
|
const cwd = process.cwd();
|
|
7698
8222
|
const records = await loadAndPriceRecords(cwd, globalOpts.includeClaudeSessions);
|
|
7699
|
-
const { aggregateBySession } = await import("./dist-
|
|
8223
|
+
const { aggregateBySession } = await import("./dist-7EBSGAHX.js");
|
|
7700
8224
|
const sessionData = aggregateBySession(records);
|
|
7701
8225
|
const match = sessionData.find((s) => s.sessionId === id);
|
|
7702
8226
|
if (!match) {
|
|
@@ -7705,7 +8229,12 @@ function registerSessionCommand(usage) {
|
|
|
7705
8229
|
return;
|
|
7706
8230
|
}
|
|
7707
8231
|
if (globalOpts.json) {
|
|
7708
|
-
|
|
8232
|
+
const hitRate = computeCacheHitRate(match.cacheReadTokens, match.tokens.inputTokens);
|
|
8233
|
+
const enriched = {
|
|
8234
|
+
...match,
|
|
8235
|
+
...hitRate != null ? { cacheHitRate: Math.round(hitRate * 1e3) / 1e3 } : {}
|
|
8236
|
+
};
|
|
8237
|
+
console.log(JSON.stringify(enriched, null, 2));
|
|
7709
8238
|
return;
|
|
7710
8239
|
}
|
|
7711
8240
|
printSessionDetail(match);
|
|
@@ -7724,7 +8253,7 @@ function registerLatestCommand(usage) {
|
|
|
7724
8253
|
}
|
|
7725
8254
|
return;
|
|
7726
8255
|
}
|
|
7727
|
-
const { aggregateBySession } = await import("./dist-
|
|
8256
|
+
const { aggregateBySession } = await import("./dist-7EBSGAHX.js");
|
|
7728
8257
|
const sessionData = aggregateBySession(records);
|
|
7729
8258
|
const latest = sessionData[0];
|
|
7730
8259
|
if (!latest) {
|
|
@@ -7750,7 +8279,7 @@ function registerLatestCommand(usage) {
|
|
|
7750
8279
|
});
|
|
7751
8280
|
}
|
|
7752
8281
|
function createUsageCommand() {
|
|
7753
|
-
const usage = new
|
|
8282
|
+
const usage = new Command77("usage").description("Token usage and cost tracking");
|
|
7754
8283
|
usage.option(
|
|
7755
8284
|
"--include-claude-sessions",
|
|
7756
8285
|
"Include Claude Code session data from ~/.claude/projects/"
|
|
@@ -7763,15 +8292,15 @@ function createUsageCommand() {
|
|
|
7763
8292
|
}
|
|
7764
8293
|
|
|
7765
8294
|
// src/commands/validate.ts
|
|
7766
|
-
import { Command as
|
|
7767
|
-
import * as
|
|
8295
|
+
import { Command as Command78 } from "commander";
|
|
8296
|
+
import * as path58 from "path";
|
|
7768
8297
|
async function runValidate(options) {
|
|
7769
8298
|
const configResult = resolveConfig(options.configPath);
|
|
7770
8299
|
if (!configResult.ok) {
|
|
7771
8300
|
return configResult;
|
|
7772
8301
|
}
|
|
7773
8302
|
const config = configResult.value;
|
|
7774
|
-
const cwd = options.cwd ?? (options.configPath ?
|
|
8303
|
+
const cwd = options.cwd ?? (options.configPath ? path58.dirname(path58.resolve(options.configPath)) : process.cwd());
|
|
7775
8304
|
const result = {
|
|
7776
8305
|
valid: true,
|
|
7777
8306
|
checks: {
|
|
@@ -7781,7 +8310,7 @@ async function runValidate(options) {
|
|
|
7781
8310
|
},
|
|
7782
8311
|
issues: []
|
|
7783
8312
|
};
|
|
7784
|
-
const agentsMapPath =
|
|
8313
|
+
const agentsMapPath = path58.resolve(cwd, config.agentsMapPath);
|
|
7785
8314
|
const agentsResult = await validateAgentsMap(agentsMapPath);
|
|
7786
8315
|
if (agentsResult.ok) {
|
|
7787
8316
|
result.checks.agentsMap = true;
|
|
@@ -7826,11 +8355,11 @@ function resolveValidateMode(globalOpts) {
|
|
|
7826
8355
|
return OutputMode.TEXT;
|
|
7827
8356
|
}
|
|
7828
8357
|
async function printCrossCheckWarnings(mode) {
|
|
7829
|
-
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-
|
|
8358
|
+
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-Y4PDR63C.js");
|
|
7830
8359
|
const cwd = process.cwd();
|
|
7831
8360
|
const crossResult = await runCrossCheck2({
|
|
7832
|
-
specsDir:
|
|
7833
|
-
plansDir:
|
|
8361
|
+
specsDir: path58.join(cwd, "docs", "specs"),
|
|
8362
|
+
plansDir: path58.join(cwd, "docs", "plans"),
|
|
7834
8363
|
projectPath: cwd
|
|
7835
8364
|
});
|
|
7836
8365
|
if (!crossResult.ok || crossResult.value.warnings === 0) return;
|
|
@@ -7842,7 +8371,7 @@ async function printCrossCheckWarnings(mode) {
|
|
|
7842
8371
|
${crossResult.value.warnings} warnings`);
|
|
7843
8372
|
}
|
|
7844
8373
|
function createValidateCommand3() {
|
|
7845
|
-
const command = new
|
|
8374
|
+
const command = new Command78("validate").description("Run all validation checks").option("--cross-check", "Run cross-artifact consistency validation").action(async (opts, cmd) => {
|
|
7846
8375
|
const globalOpts = cmd.optsWithGlobals();
|
|
7847
8376
|
const mode = resolveValidateMode(globalOpts);
|
|
7848
8377
|
const formatter = new OutputFormatter(mode);
|
|
@@ -7871,6 +8400,7 @@ function createValidateCommand3() {
|
|
|
7871
8400
|
// src/commands/_registry.ts
|
|
7872
8401
|
var commandCreators = [
|
|
7873
8402
|
createAddCommand,
|
|
8403
|
+
createAdoptionCommand,
|
|
7874
8404
|
createAgentCommand,
|
|
7875
8405
|
createBlueprintCommand,
|
|
7876
8406
|
createCheckArchCommand,
|
|
@@ -7881,6 +8411,7 @@ var commandCreators = [
|
|
|
7881
8411
|
createCheckSecurityCommand,
|
|
7882
8412
|
createCICommand,
|
|
7883
8413
|
createCleanupCommand,
|
|
8414
|
+
createCleanupSessionsCommand,
|
|
7884
8415
|
createCreateSkillCommand,
|
|
7885
8416
|
createDashboardCommand,
|
|
7886
8417
|
createDoctorCommand,
|
|
@@ -7914,6 +8445,7 @@ var commandCreators = [
|
|
|
7914
8445
|
createSnapshotCommand,
|
|
7915
8446
|
createStateCommand,
|
|
7916
8447
|
createTaintCommand,
|
|
8448
|
+
createTelemetryCommand,
|
|
7917
8449
|
createTraceabilityCommand,
|
|
7918
8450
|
createUninstallCommand,
|
|
7919
8451
|
createUninstallConstraintsCommand,
|
|
@@ -7924,7 +8456,7 @@ var commandCreators = [
|
|
|
7924
8456
|
|
|
7925
8457
|
// src/index.ts
|
|
7926
8458
|
function createProgram() {
|
|
7927
|
-
const program = new
|
|
8459
|
+
const program = new Command79();
|
|
7928
8460
|
program.name("harness").description("CLI for Harness Engineering toolkit").version(CLI_VERSION).option("-c, --config <path>", "Path to config file").option("--json", "Output as JSON").option("--verbose", "Verbose output").option("--quiet", "Minimal output");
|
|
7929
8461
|
for (const creator of commandCreators) {
|
|
7930
8462
|
program.addCommand(creator());
|
|
@@ -7936,7 +8468,6 @@ export {
|
|
|
7936
8468
|
runCheckArch,
|
|
7937
8469
|
runGraphStatus,
|
|
7938
8470
|
runGraphExport,
|
|
7939
|
-
runScan,
|
|
7940
8471
|
runQuery,
|
|
7941
8472
|
runIngest,
|
|
7942
8473
|
runImpactPreview,
|