@harness-engineering/cli 1.24.0 → 1.24.1
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-MMVRF77L.js} +2 -2
- package/dist/{architecture-MCCHZWOK.js → architecture-JAEDPYQZ.js} +3 -3
- package/dist/{assess-project-7HE2Z5PW.js → assess-project-7JZCVM7D.js} +1 -1
- package/dist/bin/harness-mcp.js +15 -15
- package/dist/bin/harness.js +20 -20
- package/dist/{check-phase-gate-JXIRVHTR.js → check-phase-gate-YQHAH4LL.js} +4 -4
- package/dist/{chunk-FVF66DVL.js → chunk-2DAMN7ED.js} +6 -6
- package/dist/{chunk-ZOIGL5PP.js → chunk-AVVJ5EUU.js} +11 -1
- package/dist/{chunk-UKMWY5OJ.js → chunk-BWWNQPPO.js} +9 -9
- package/dist/{chunk-EKYIKFOO.js → chunk-C5FTJ3EU.js} +1 -1
- package/dist/{chunk-DSB6O257.js → chunk-GISMXMVL.js} +3 -0
- package/dist/{chunk-3POJUEEZ.js → chunk-HVFCCARH.js} +1 -1
- package/dist/{chunk-44DNUOBH.js → chunk-JGMCHJ6B.js} +4 -4
- package/dist/{chunk-OWH5XSMD.js → chunk-JT732X6S.js} +2 -2
- package/dist/{chunk-BH6GUAUS.js → chunk-LY3YVKXL.js} +498 -106
- package/dist/{chunk-HP74FPUJ.js → chunk-MS6KDQW7.js} +7 -7
- package/dist/{chunk-ANXOO2HR.js → chunk-NU3BPEDR.js} +3 -3
- package/dist/{chunk-MY5DBCJZ.js → chunk-OZIHPMA7.js} +105 -3
- package/dist/{chunk-WPFFEDTO.js → chunk-PCWYYFBP.js} +497 -41
- package/dist/{chunk-7QYO5UWW.js → chunk-TDLOFNNQ.js} +1 -1
- package/dist/{chunk-R7LB3VJR.js → chunk-TUJAHI22.js} +8 -8
- package/dist/{chunk-LASBAGC6.js → chunk-UQEUYRBP.js} +1 -1
- package/dist/{chunk-LRX6J7IA.js → chunk-W2OZK3KC.js} +1 -1
- package/dist/{chunk-ICPZNX6O.js → chunk-XNEMDKV5.js} +1 -1
- package/dist/{chunk-46PEKT5G.js → chunk-ZKVLBOYA.js} +1164 -676
- package/dist/{chunk-BKHS7RPB.js → chunk-ZOVATVQC.js} +1 -0
- package/dist/{ci-workflow-YE7B375K.js → ci-workflow-HDH4LCOF.js} +2 -2
- package/dist/{create-skill-LTLAAJPC.js → create-skill-QCXINA5Q.js} +2 -2
- package/dist/{dist-M6FBUXZD.js → dist-QW5G3GX3.js} +7 -1
- package/dist/{dist-27IJJDWG.js → dist-TZQUURSP.js} +40 -2
- package/dist/{docs-YAYNHDC3.js → docs-6SPJYTRR.js} +4 -4
- package/dist/{engine-TS24YHIT.js → engine-CSITRE3J.js} +2 -2
- package/dist/{entropy-RSH5D63W.js → entropy-FZP643BK.js} +3 -3
- package/dist/{feedback-VGGBOI54.js → feedback-RSPUJCJJ.js} +1 -1
- package/dist/{generate-agent-definitions-PBITSP7C.js → generate-agent-definitions-OLYWXTYH.js} +2 -2
- package/dist/{graph-loader-OLSOE537.js → graph-loader-M6FXJAKK.js} +1 -1
- package/dist/index.d.ts +30 -0
- package/dist/index.js +20 -20
- package/dist/{loader-HBQNUGAM.js → loader-P2P7CV2A.js} +2 -2
- package/dist/{mcp-HZ6CRAZR.js → mcp-JZG22CYT.js} +15 -15
- package/dist/{performance-MMIMMNFQ.js → performance-VVWOIJTE.js} +4 -4
- package/dist/{review-pipeline-UAPVKI6W.js → review-pipeline-XSRO7HYZ.js} +1 -1
- package/dist/{runner-YYCVNAVF.js → runner-TY7DJGQV.js} +1 -1
- package/dist/{runtime-NQNTDQV5.js → runtime-VMOIIP6B.js} +2 -2
- package/dist/{security-IP5IJTB7.js → security-4AQ46P3H.js} +1 -1
- package/dist/{skill-executor-CS25H7FF.js → skill-executor-GA7BDX3F.js} +2 -2
- package/dist/{validate-QLHCVBKE.js → validate-T7UTXLEQ.js} +3 -3
- package/dist/{validate-cross-check-WQWFMPXJ.js → validate-cross-check-M4NP2UF5.js} +2 -2
- package/package.json +5 -4
|
@@ -13,10 +13,10 @@ import {
|
|
|
13
13
|
} from "./chunk-I4QR3HNH.js";
|
|
14
14
|
import {
|
|
15
15
|
runPersona
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-GISMXMVL.js";
|
|
17
17
|
import {
|
|
18
18
|
executeSkill
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-UQEUYRBP.js";
|
|
20
20
|
import {
|
|
21
21
|
ALLOWED_PERSONA_COMMANDS
|
|
22
22
|
} from "./chunk-TEFCFC4H.js";
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
OutputMode,
|
|
26
26
|
createCheckPhaseGateCommand,
|
|
27
27
|
findFiles
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-W2OZK3KC.js";
|
|
29
29
|
import {
|
|
30
30
|
createGenerateAgentDefinitionsCommand,
|
|
31
31
|
generateAgentDefinitions
|
|
@@ -44,6 +44,7 @@ import {
|
|
|
44
44
|
appendFrameworkAgents,
|
|
45
45
|
captureHealthSnapshot,
|
|
46
46
|
createGenerateSlashCommandsCommand,
|
|
47
|
+
ensureHarnessGitignore,
|
|
47
48
|
generateSlashCommands,
|
|
48
49
|
handleGetImpact,
|
|
49
50
|
handleOrphanDeletion,
|
|
@@ -52,11 +53,11 @@ import {
|
|
|
52
53
|
loadOrRebuildIndex,
|
|
53
54
|
persistToolingConfig,
|
|
54
55
|
recommend
|
|
55
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-LY3YVKXL.js";
|
|
56
57
|
import {
|
|
57
58
|
findConfigFile,
|
|
58
59
|
resolveConfig
|
|
59
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-AVVJ5EUU.js";
|
|
60
61
|
import {
|
|
61
62
|
VALID_PLATFORMS
|
|
62
63
|
} from "./chunk-3ISINLYT.js";
|
|
@@ -70,7 +71,7 @@ import {
|
|
|
70
71
|
} from "./chunk-6B6UN6SG.js";
|
|
71
72
|
import {
|
|
72
73
|
loadGraphStore
|
|
73
|
-
} from "./chunk-
|
|
74
|
+
} from "./chunk-TDLOFNNQ.js";
|
|
74
75
|
import {
|
|
75
76
|
CLI_VERSION
|
|
76
77
|
} from "./chunk-BM3PWGXQ.js";
|
|
@@ -108,6 +109,7 @@ import {
|
|
|
108
109
|
diff,
|
|
109
110
|
extractBundle,
|
|
110
111
|
generateSuggestions,
|
|
112
|
+
getOrCreateInstallId,
|
|
111
113
|
listStreams,
|
|
112
114
|
listTaintedSessions,
|
|
113
115
|
loadState,
|
|
@@ -118,10 +120,12 @@ import {
|
|
|
118
120
|
parseManifest,
|
|
119
121
|
parseSecurityConfig,
|
|
120
122
|
pruneLearnings,
|
|
123
|
+
readIdentity,
|
|
121
124
|
readLockfile,
|
|
122
125
|
removeContributions,
|
|
123
126
|
removeProvenance,
|
|
124
127
|
requestPeerReview,
|
|
128
|
+
resolveConsent,
|
|
125
129
|
resolveStreamPath,
|
|
126
130
|
runAll,
|
|
127
131
|
runCIChecks,
|
|
@@ -133,20 +137,20 @@ import {
|
|
|
133
137
|
validateKnowledgeMap,
|
|
134
138
|
writeConfig,
|
|
135
139
|
writeLockfile
|
|
136
|
-
} from "./chunk-
|
|
140
|
+
} from "./chunk-PCWYYFBP.js";
|
|
137
141
|
import {
|
|
138
142
|
Err,
|
|
139
143
|
Ok
|
|
140
144
|
} from "./chunk-5LMZA5LZ.js";
|
|
141
145
|
import {
|
|
142
146
|
createCreateSkillCommand
|
|
143
|
-
} from "./chunk-
|
|
147
|
+
} from "./chunk-XNEMDKV5.js";
|
|
144
148
|
import {
|
|
145
149
|
logger
|
|
146
150
|
} from "./chunk-EBJQ6N4M.js";
|
|
147
151
|
import {
|
|
148
152
|
SkillMetadataSchema
|
|
149
|
-
} from "./chunk-
|
|
153
|
+
} from "./chunk-ZOVATVQC.js";
|
|
150
154
|
import {
|
|
151
155
|
CLIError,
|
|
152
156
|
ExitCode,
|
|
@@ -154,7 +158,7 @@ import {
|
|
|
154
158
|
} from "./chunk-3WGJMBKH.js";
|
|
155
159
|
|
|
156
160
|
// src/index.ts
|
|
157
|
-
import { Command as
|
|
161
|
+
import { Command as Command80 } from "commander";
|
|
158
162
|
|
|
159
163
|
// src/commands/add.ts
|
|
160
164
|
import { Command } from "commander";
|
|
@@ -244,7 +248,7 @@ function addDoc(name, cwd, configResult, created) {
|
|
|
244
248
|
return Ok(void 0);
|
|
245
249
|
}
|
|
246
250
|
async function addSkill(name, cwd, created) {
|
|
247
|
-
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-
|
|
251
|
+
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-QCXINA5Q.js");
|
|
248
252
|
generateSkillFiles2({
|
|
249
253
|
name,
|
|
250
254
|
description: `${name} skill`,
|
|
@@ -324,11 +328,164 @@ function createAddCommand() {
|
|
|
324
328
|
return command;
|
|
325
329
|
}
|
|
326
330
|
|
|
331
|
+
// src/commands/adoption.ts
|
|
332
|
+
import { Command as Command2 } from "commander";
|
|
333
|
+
function formatDuration(ms) {
|
|
334
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
335
|
+
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
336
|
+
return `${(ms / 6e4).toFixed(1)}m`;
|
|
337
|
+
}
|
|
338
|
+
function formatRate(rate) {
|
|
339
|
+
return `${(rate * 100).toFixed(0)}%`;
|
|
340
|
+
}
|
|
341
|
+
function padRight(str, len) {
|
|
342
|
+
return str.length >= len ? str : str + " ".repeat(len - str.length);
|
|
343
|
+
}
|
|
344
|
+
function registerSkillsCommand(adoption) {
|
|
345
|
+
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) => {
|
|
346
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
347
|
+
const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
|
|
348
|
+
const cwd = process.cwd();
|
|
349
|
+
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-TZQUURSP.js");
|
|
350
|
+
const records = readAdoptionRecords(cwd);
|
|
351
|
+
if (records.length === 0) {
|
|
352
|
+
if (globalOpts.json) {
|
|
353
|
+
console.log(JSON.stringify([]));
|
|
354
|
+
} else {
|
|
355
|
+
logger.info("No adoption data found. Skills will be tracked after your next session.");
|
|
356
|
+
}
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
const summaries = aggregateBySkill(records).slice(0, limit);
|
|
360
|
+
if (globalOpts.json) {
|
|
361
|
+
console.log(JSON.stringify(summaries, null, 2));
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const header = "Skill | Invocations | Success | Avg Duration | Last Used";
|
|
365
|
+
const divider = "-----------------------------------|-------------|---------|--------------|----------";
|
|
366
|
+
console.log(header);
|
|
367
|
+
console.log(divider);
|
|
368
|
+
for (const s of summaries) {
|
|
369
|
+
const name = padRight(s.skill, 35);
|
|
370
|
+
const count = padRight(String(s.invocations), 11);
|
|
371
|
+
const rate = padRight(formatRate(s.successRate), 7);
|
|
372
|
+
const dur = padRight(formatDuration(s.avgDuration), 12);
|
|
373
|
+
const last = s.lastUsed.slice(0, 10);
|
|
374
|
+
console.log(`${name} | ${count} | ${rate} | ${dur} | ${last}`);
|
|
375
|
+
}
|
|
376
|
+
console.log(`
|
|
377
|
+
Total: ${records.length} invocations across ${summaries.length} skill(s)`);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
function registerRecentCommand(adoption) {
|
|
381
|
+
adoption.command("recent").description("Show recent skill invocations").option("--limit <n>", "Number of invocations to show (default: 20)", "20").action(async (opts, cmd) => {
|
|
382
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
383
|
+
const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
|
|
384
|
+
const cwd = process.cwd();
|
|
385
|
+
const { readAdoptionRecords } = await import("./dist-TZQUURSP.js");
|
|
386
|
+
const records = readAdoptionRecords(cwd);
|
|
387
|
+
if (records.length === 0) {
|
|
388
|
+
if (globalOpts.json) {
|
|
389
|
+
console.log(JSON.stringify([]));
|
|
390
|
+
} else {
|
|
391
|
+
logger.info("No adoption data found. Skills will be tracked after your next session.");
|
|
392
|
+
}
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const sorted = [...records].sort(
|
|
396
|
+
(a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime()
|
|
397
|
+
);
|
|
398
|
+
const limited = sorted.slice(0, limit);
|
|
399
|
+
if (globalOpts.json) {
|
|
400
|
+
console.log(JSON.stringify(limited, null, 2));
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const header = "Date | Skill | Outcome | Duration";
|
|
404
|
+
const divider = "-----------|------------------------------------|-----------|---------";
|
|
405
|
+
console.log(header);
|
|
406
|
+
console.log(divider);
|
|
407
|
+
for (const r of limited) {
|
|
408
|
+
const date = r.startedAt.slice(0, 10);
|
|
409
|
+
const skill = padRight(r.skill, 35);
|
|
410
|
+
const outcome = padRight(r.outcome, 9);
|
|
411
|
+
const dur = formatDuration(r.duration);
|
|
412
|
+
console.log(`${date} | ${skill}| ${outcome} | ${dur}`);
|
|
413
|
+
}
|
|
414
|
+
console.log(`
|
|
415
|
+
Showing ${limited.length} of ${records.length} invocations`);
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
function registerSkillCommand(adoption) {
|
|
419
|
+
adoption.command("skill <name>").description("Show detail for a specific skill").action(async (name, _opts, cmd) => {
|
|
420
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
421
|
+
const cwd = process.cwd();
|
|
422
|
+
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-TZQUURSP.js");
|
|
423
|
+
const records = readAdoptionRecords(cwd);
|
|
424
|
+
const skillRecords = records.filter((r) => r.skill === name);
|
|
425
|
+
if (skillRecords.length === 0) {
|
|
426
|
+
if (globalOpts.json) {
|
|
427
|
+
console.log(JSON.stringify(null));
|
|
428
|
+
} else {
|
|
429
|
+
logger.info(`No adoption data found for skill "${name}".`);
|
|
430
|
+
}
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
const summaries = aggregateBySkill(skillRecords);
|
|
434
|
+
const summary = summaries[0];
|
|
435
|
+
const phaseMap = /* @__PURE__ */ new Map();
|
|
436
|
+
for (const r of skillRecords) {
|
|
437
|
+
for (const phase of r.phasesReached) {
|
|
438
|
+
phaseMap.set(phase, (phaseMap.get(phase) ?? 0) + 1);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
const phaseRates = Array.from(phaseMap.entries()).map(([phase, count]) => ({ phase, count, rate: count / skillRecords.length })).sort((a, b) => b.count - a.count);
|
|
442
|
+
if (globalOpts.json) {
|
|
443
|
+
console.log(
|
|
444
|
+
JSON.stringify({ summary, phaseRates, totalRecords: skillRecords.length }, null, 2)
|
|
445
|
+
);
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
console.log(`Skill: ${name}`);
|
|
449
|
+
console.log(`Invocations: ${summary.invocations}`);
|
|
450
|
+
console.log(`Success rate: ${formatRate(summary.successRate)}`);
|
|
451
|
+
console.log(`Avg duration: ${formatDuration(summary.avgDuration)}`);
|
|
452
|
+
console.log(`Last used: ${summary.lastUsed.slice(0, 10)}`);
|
|
453
|
+
if (summary.tier != null) {
|
|
454
|
+
console.log(`Tier: ${summary.tier}`);
|
|
455
|
+
}
|
|
456
|
+
if (phaseRates.length > 0) {
|
|
457
|
+
console.log("\nPhase completion rates:");
|
|
458
|
+
for (const p of phaseRates) {
|
|
459
|
+
console.log(
|
|
460
|
+
` ${padRight(p.phase, 20)} ${formatRate(p.rate)} (${p.count}/${skillRecords.length})`
|
|
461
|
+
);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
const outcomes = { completed: 0, failed: 0, abandoned: 0 };
|
|
465
|
+
for (const r of skillRecords) {
|
|
466
|
+
if (r.outcome in outcomes) {
|
|
467
|
+
outcomes[r.outcome]++;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
console.log("\nOutcome breakdown:");
|
|
471
|
+
console.log(` Completed: ${outcomes.completed}`);
|
|
472
|
+
console.log(` Failed: ${outcomes.failed}`);
|
|
473
|
+
console.log(` Abandoned: ${outcomes.abandoned}`);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
function createAdoptionCommand() {
|
|
477
|
+
const adoption = new Command2("adoption").description("View skill adoption telemetry").option("--json", "Output in JSON format");
|
|
478
|
+
registerSkillsCommand(adoption);
|
|
479
|
+
registerRecentCommand(adoption);
|
|
480
|
+
registerSkillCommand(adoption);
|
|
481
|
+
return adoption;
|
|
482
|
+
}
|
|
483
|
+
|
|
327
484
|
// src/commands/agent/index.ts
|
|
328
|
-
import { Command as
|
|
485
|
+
import { Command as Command5 } from "commander";
|
|
329
486
|
|
|
330
487
|
// src/commands/agent/run.ts
|
|
331
|
-
import { Command as
|
|
488
|
+
import { Command as Command3 } from "commander";
|
|
332
489
|
import * as path2 from "path";
|
|
333
490
|
import * as childProcess from "child_process";
|
|
334
491
|
async function runAgentTask(task, options) {
|
|
@@ -425,7 +582,7 @@ async function runPersonaMode(opts, quiet) {
|
|
|
425
582
|
process.exit(report.status === "fail" ? ExitCode.ERROR : ExitCode.SUCCESS);
|
|
426
583
|
}
|
|
427
584
|
function createRunCommand() {
|
|
428
|
-
return new
|
|
585
|
+
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
586
|
const globalOpts = cmd.optsWithGlobals();
|
|
430
587
|
if (opts.persona) {
|
|
431
588
|
await runPersonaMode(opts, globalOpts.quiet);
|
|
@@ -449,7 +606,7 @@ function createRunCommand() {
|
|
|
449
606
|
}
|
|
450
607
|
|
|
451
608
|
// src/commands/agent/review.ts
|
|
452
|
-
import { Command as
|
|
609
|
+
import { Command as Command4 } from "commander";
|
|
453
610
|
import { execSync } from "child_process";
|
|
454
611
|
async function runAgentReview(options) {
|
|
455
612
|
const configResult = resolveConfig(options.configPath);
|
|
@@ -543,7 +700,7 @@ function printReviewResult(result, mode) {
|
|
|
543
700
|
}
|
|
544
701
|
}
|
|
545
702
|
function createReviewCommand() {
|
|
546
|
-
return new
|
|
703
|
+
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
704
|
const globalOpts = cmd.optsWithGlobals();
|
|
548
705
|
const mode = resolveReviewMode(globalOpts);
|
|
549
706
|
const result = await runAgentReview({
|
|
@@ -571,17 +728,17 @@ function createReviewCommand() {
|
|
|
571
728
|
|
|
572
729
|
// src/commands/agent/index.ts
|
|
573
730
|
function createAgentCommand() {
|
|
574
|
-
const command = new
|
|
731
|
+
const command = new Command5("agent").description("Agent orchestration commands");
|
|
575
732
|
command.addCommand(createRunCommand());
|
|
576
733
|
command.addCommand(createReviewCommand());
|
|
577
734
|
return command;
|
|
578
735
|
}
|
|
579
736
|
|
|
580
737
|
// src/commands/blueprint.ts
|
|
581
|
-
import { Command as
|
|
738
|
+
import { Command as Command6 } from "commander";
|
|
582
739
|
import * as path3 from "path";
|
|
583
740
|
function createBlueprintCommand() {
|
|
584
|
-
return new
|
|
741
|
+
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
742
|
try {
|
|
586
743
|
const rootDir = path3.resolve(projectPath);
|
|
587
744
|
const outputDir = path3.resolve(options.output);
|
|
@@ -602,7 +759,7 @@ function createBlueprintCommand() {
|
|
|
602
759
|
}
|
|
603
760
|
|
|
604
761
|
// src/commands/check-arch.ts
|
|
605
|
-
import { Command as
|
|
762
|
+
import { Command as Command7 } from "commander";
|
|
606
763
|
import { execSync as execSync2 } from "child_process";
|
|
607
764
|
function getCommitHash(cwd) {
|
|
608
765
|
try {
|
|
@@ -732,7 +889,7 @@ function printArchResult(value, mode, formatter) {
|
|
|
732
889
|
if (output) console.log(output);
|
|
733
890
|
}
|
|
734
891
|
function createCheckArchCommand() {
|
|
735
|
-
const command = new
|
|
892
|
+
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
893
|
const globalOpts = cmd.optsWithGlobals();
|
|
737
894
|
const mode = resolveOutputMode(globalOpts);
|
|
738
895
|
const formatter = new OutputFormatter(mode);
|
|
@@ -762,7 +919,7 @@ function createCheckArchCommand() {
|
|
|
762
919
|
}
|
|
763
920
|
|
|
764
921
|
// src/commands/check-deps.ts
|
|
765
|
-
import { Command as
|
|
922
|
+
import { Command as Command8 } from "commander";
|
|
766
923
|
import * as path4 from "path";
|
|
767
924
|
async function runCheckDeps(options) {
|
|
768
925
|
const cwd = options.cwd ?? process.cwd();
|
|
@@ -854,14 +1011,14 @@ async function runCheckDepsAction(globalOpts) {
|
|
|
854
1011
|
process.exit(result.value.valid ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
|
|
855
1012
|
}
|
|
856
1013
|
function createCheckDepsCommand() {
|
|
857
|
-
const command = new
|
|
1014
|
+
const command = new Command8("check-deps").description("Validate dependency layers and detect circular dependencies").action(async (_opts, cmd) => {
|
|
858
1015
|
await runCheckDepsAction(cmd.optsWithGlobals());
|
|
859
1016
|
});
|
|
860
1017
|
return command;
|
|
861
1018
|
}
|
|
862
1019
|
|
|
863
1020
|
// src/commands/check-docs.ts
|
|
864
|
-
import { Command as
|
|
1021
|
+
import { Command as Command9 } from "commander";
|
|
865
1022
|
import * as path5 from "path";
|
|
866
1023
|
|
|
867
1024
|
// src/utils/output.ts
|
|
@@ -949,7 +1106,7 @@ function printCheckDocsResult(value, mode, formatter) {
|
|
|
949
1106
|
}
|
|
950
1107
|
}
|
|
951
1108
|
function createCheckDocsCommand() {
|
|
952
|
-
const command = new
|
|
1109
|
+
const command = new Command9("check-docs").description("Check documentation coverage").option("--min-coverage <percent>", "Minimum coverage percentage", "80").action(async (opts, cmd) => {
|
|
953
1110
|
const globalOpts = cmd.optsWithGlobals();
|
|
954
1111
|
const mode = resolveOutputMode2(globalOpts);
|
|
955
1112
|
const formatter = new OutputFormatter(mode);
|
|
@@ -979,7 +1136,7 @@ function createCheckDocsCommand() {
|
|
|
979
1136
|
}
|
|
980
1137
|
|
|
981
1138
|
// src/commands/check-perf.ts
|
|
982
|
-
import { Command as
|
|
1139
|
+
import { Command as Command10 } from "commander";
|
|
983
1140
|
import * as path6 from "path";
|
|
984
1141
|
async function runCheckPerf(cwd, options) {
|
|
985
1142
|
const runAll2 = !options.structural && !options.size && !options.coupling;
|
|
@@ -1096,14 +1253,14 @@ async function runCheckPerfAction(opts, globalOpts) {
|
|
|
1096
1253
|
process.exit(result.value.valid ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
|
|
1097
1254
|
}
|
|
1098
1255
|
function createCheckPerfCommand() {
|
|
1099
|
-
const command = new
|
|
1256
|
+
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
1257
|
await runCheckPerfAction(opts, cmd.optsWithGlobals());
|
|
1101
1258
|
});
|
|
1102
1259
|
return command;
|
|
1103
1260
|
}
|
|
1104
1261
|
|
|
1105
1262
|
// src/commands/check-security.ts
|
|
1106
|
-
import { Command as
|
|
1263
|
+
import { Command as Command11 } from "commander";
|
|
1107
1264
|
import * as path7 from "path";
|
|
1108
1265
|
import { execSync as execSync3 } from "child_process";
|
|
1109
1266
|
var SEVERITY_RANK = {
|
|
@@ -1126,10 +1283,10 @@ async function runCheckSecurity(cwd, options) {
|
|
|
1126
1283
|
const projectRoot = path7.resolve(cwd);
|
|
1127
1284
|
let configData = {};
|
|
1128
1285
|
try {
|
|
1129
|
-
const
|
|
1286
|
+
const fs36 = await import("fs");
|
|
1130
1287
|
const configPath = path7.join(projectRoot, "harness.config.json");
|
|
1131
|
-
if (
|
|
1132
|
-
const raw =
|
|
1288
|
+
if (fs36.existsSync(configPath)) {
|
|
1289
|
+
const raw = fs36.readFileSync(configPath, "utf-8");
|
|
1133
1290
|
const parsed = JSON.parse(raw);
|
|
1134
1291
|
configData = parsed.security ?? {};
|
|
1135
1292
|
}
|
|
@@ -1198,7 +1355,7 @@ async function runCheckSecurityAction(opts, globalOpts) {
|
|
|
1198
1355
|
process.exit(result.value.valid ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
|
|
1199
1356
|
}
|
|
1200
1357
|
function createCheckSecurityCommand() {
|
|
1201
|
-
const command = new
|
|
1358
|
+
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
1359
|
const severity = thisCommand.opts().severity;
|
|
1203
1360
|
if (!["error", "warning", "info"].includes(severity)) {
|
|
1204
1361
|
logger.error(`Invalid severity: "${severity}". Must be one of: error, warning, info`);
|
|
@@ -1211,10 +1368,10 @@ function createCheckSecurityCommand() {
|
|
|
1211
1368
|
}
|
|
1212
1369
|
|
|
1213
1370
|
// src/commands/ci/index.ts
|
|
1214
|
-
import { Command as
|
|
1371
|
+
import { Command as Command14 } from "commander";
|
|
1215
1372
|
|
|
1216
1373
|
// src/commands/ci/check.ts
|
|
1217
|
-
import { Command as
|
|
1374
|
+
import { Command as Command12 } from "commander";
|
|
1218
1375
|
var VALID_CHECKS = [
|
|
1219
1376
|
"validate",
|
|
1220
1377
|
"deps",
|
|
@@ -1304,13 +1461,13 @@ async function runCheckAction(opts, globalOpts) {
|
|
|
1304
1461
|
process.exit(report.exitCode);
|
|
1305
1462
|
}
|
|
1306
1463
|
function createCheckCommand() {
|
|
1307
|
-
return new
|
|
1464
|
+
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
1465
|
await runCheckAction(opts, cmd.optsWithGlobals());
|
|
1309
1466
|
});
|
|
1310
1467
|
}
|
|
1311
1468
|
|
|
1312
1469
|
// src/commands/ci/init.ts
|
|
1313
|
-
import { Command as
|
|
1470
|
+
import { Command as Command13 } from "commander";
|
|
1314
1471
|
import * as fs2 from "fs";
|
|
1315
1472
|
import * as path8 from "path";
|
|
1316
1473
|
var ALL_CHECKS = [
|
|
@@ -1447,86 +1604,19 @@ async function runInitAction(opts, globalOpts) {
|
|
|
1447
1604
|
}
|
|
1448
1605
|
}
|
|
1449
1606
|
function createInitCommand() {
|
|
1450
|
-
return new
|
|
1607
|
+
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
1608
|
await runInitAction(opts, cmd.optsWithGlobals());
|
|
1452
1609
|
});
|
|
1453
1610
|
}
|
|
1454
1611
|
|
|
1455
1612
|
// src/commands/ci/index.ts
|
|
1456
1613
|
function createCICommand() {
|
|
1457
|
-
const command = new
|
|
1614
|
+
const command = new Command14("ci").description("CI/CD integration commands");
|
|
1458
1615
|
command.addCommand(createCheckCommand());
|
|
1459
1616
|
command.addCommand(createInitCommand());
|
|
1460
1617
|
return command;
|
|
1461
1618
|
}
|
|
1462
1619
|
|
|
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
1620
|
// src/commands/cleanup.ts
|
|
1531
1621
|
import { Command as Command15 } from "commander";
|
|
1532
1622
|
import * as path9 from "path";
|
|
@@ -1646,11 +1736,197 @@ function createCleanupCommand() {
|
|
|
1646
1736
|
return command;
|
|
1647
1737
|
}
|
|
1648
1738
|
|
|
1649
|
-
// src/commands/
|
|
1739
|
+
// src/commands/cleanup-sessions.ts
|
|
1650
1740
|
import { Command as Command16 } from "commander";
|
|
1651
|
-
import * as
|
|
1741
|
+
import * as fs3 from "fs";
|
|
1742
|
+
import * as path10 from "path";
|
|
1743
|
+
var STALE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
1744
|
+
function getMostRecentMtime(dirPath) {
|
|
1745
|
+
let latest = 0;
|
|
1746
|
+
try {
|
|
1747
|
+
const entries = fs3.readdirSync(dirPath, { withFileTypes: true });
|
|
1748
|
+
for (const entry of entries) {
|
|
1749
|
+
const fullPath = path10.join(dirPath, entry.name);
|
|
1750
|
+
const stat = fs3.statSync(fullPath);
|
|
1751
|
+
if (stat.mtimeMs > latest) latest = stat.mtimeMs;
|
|
1752
|
+
}
|
|
1753
|
+
const dirStat = fs3.statSync(dirPath);
|
|
1754
|
+
if (dirStat.mtimeMs > latest) latest = dirStat.mtimeMs;
|
|
1755
|
+
} catch {
|
|
1756
|
+
}
|
|
1757
|
+
return latest;
|
|
1758
|
+
}
|
|
1759
|
+
async function runCleanupSessions(options) {
|
|
1760
|
+
const cwd = options.cwd ?? process.cwd();
|
|
1761
|
+
const dryRun = options.dryRun ?? false;
|
|
1762
|
+
const sessionsDir = path10.join(cwd, ".harness", "sessions");
|
|
1763
|
+
const result = { removed: [], kept: [] };
|
|
1764
|
+
if (!fs3.existsSync(sessionsDir)) {
|
|
1765
|
+
return Ok(result);
|
|
1766
|
+
}
|
|
1767
|
+
let entries;
|
|
1768
|
+
try {
|
|
1769
|
+
entries = fs3.readdirSync(sessionsDir, { withFileTypes: true });
|
|
1770
|
+
} catch (err) {
|
|
1771
|
+
return Err(
|
|
1772
|
+
new CLIError(
|
|
1773
|
+
`Failed to read sessions directory: ${err instanceof Error ? err.message : String(err)}`,
|
|
1774
|
+
ExitCode.ERROR
|
|
1775
|
+
)
|
|
1776
|
+
);
|
|
1777
|
+
}
|
|
1778
|
+
const now = Date.now();
|
|
1779
|
+
for (const entry of entries) {
|
|
1780
|
+
if (!entry.isDirectory()) continue;
|
|
1781
|
+
const sessionPath = path10.join(sessionsDir, entry.name);
|
|
1782
|
+
const mostRecent = getMostRecentMtime(sessionPath);
|
|
1783
|
+
const ageMs = now - mostRecent;
|
|
1784
|
+
if (ageMs > STALE_TTL_MS) {
|
|
1785
|
+
result.removed.push(entry.name);
|
|
1786
|
+
if (!dryRun) {
|
|
1787
|
+
try {
|
|
1788
|
+
fs3.rmSync(sessionPath, { recursive: true, force: true });
|
|
1789
|
+
} catch (err) {
|
|
1790
|
+
return Err(
|
|
1791
|
+
new CLIError(
|
|
1792
|
+
`Failed to remove session ${entry.name}: ${err instanceof Error ? err.message : String(err)}`,
|
|
1793
|
+
ExitCode.ERROR
|
|
1794
|
+
)
|
|
1795
|
+
);
|
|
1796
|
+
}
|
|
1797
|
+
}
|
|
1798
|
+
} else {
|
|
1799
|
+
result.kept.push(entry.name);
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
return Ok(result);
|
|
1803
|
+
}
|
|
1804
|
+
function printResult(result, dryRun, asJson) {
|
|
1805
|
+
const { removed, kept } = result;
|
|
1806
|
+
if (asJson) {
|
|
1807
|
+
console.log(JSON.stringify({ removed, kept, dryRun }, null, 2));
|
|
1808
|
+
return;
|
|
1809
|
+
}
|
|
1810
|
+
if (removed.length === 0 && kept.length === 0) {
|
|
1811
|
+
console.log("No sessions found.");
|
|
1812
|
+
return;
|
|
1813
|
+
}
|
|
1814
|
+
if (removed.length > 0) {
|
|
1815
|
+
const label = dryRun ? "Stale (would remove)" : "Removed";
|
|
1816
|
+
console.log(`
|
|
1817
|
+
${label} (${removed.length}):`);
|
|
1818
|
+
for (const s of removed) console.log(` - ${s}`);
|
|
1819
|
+
}
|
|
1820
|
+
if (kept.length > 0) {
|
|
1821
|
+
console.log(`
|
|
1822
|
+
Kept (${kept.length}):`);
|
|
1823
|
+
for (const s of kept) console.log(` - ${s}`);
|
|
1824
|
+
}
|
|
1825
|
+
if (!dryRun && removed.length > 0) {
|
|
1826
|
+
console.log(`
|
|
1827
|
+
Cleaned up ${removed.length} stale session(s).`);
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
function createCleanupSessionsCommand() {
|
|
1831
|
+
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) => {
|
|
1832
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
1833
|
+
const cwd = path10.resolve(opts.path);
|
|
1834
|
+
const result = await runCleanupSessions({ cwd, dryRun: opts.dryRun });
|
|
1835
|
+
if (!result.ok) {
|
|
1836
|
+
logger.error(result.error.message);
|
|
1837
|
+
process.exit(result.error.exitCode);
|
|
1838
|
+
return;
|
|
1839
|
+
}
|
|
1840
|
+
printResult(result.value, opts.dryRun, globalOpts.json);
|
|
1841
|
+
process.exit(ExitCode.SUCCESS);
|
|
1842
|
+
});
|
|
1843
|
+
return command;
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
// src/commands/dashboard.ts
|
|
1847
|
+
import { Command as Command17 } from "commander";
|
|
1848
|
+
import { spawn } from "child_process";
|
|
1849
|
+
import { existsSync as existsSync4 } from "fs";
|
|
1850
|
+
import { createRequire } from "module";
|
|
1851
|
+
import { dirname as dirname2, join as join7, resolve as resolve10 } from "path";
|
|
1852
|
+
import { setTimeout } from "timers";
|
|
1853
|
+
import { fileURLToPath } from "url";
|
|
1854
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
1855
|
+
var __dirname = dirname2(__filename);
|
|
1856
|
+
var require2 = createRequire(import.meta.url);
|
|
1857
|
+
var DEFAULT_CLIENT_PORT = 3700;
|
|
1858
|
+
var DEFAULT_API_PORT = 3701;
|
|
1859
|
+
function openBrowser(url) {
|
|
1860
|
+
const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
1861
|
+
spawn(cmd, [url], { detached: true, stdio: "ignore" }).unref();
|
|
1862
|
+
}
|
|
1863
|
+
function resolveServerScript() {
|
|
1864
|
+
try {
|
|
1865
|
+
const pkgPath = require2.resolve("@harness-engineering/dashboard/package.json");
|
|
1866
|
+
const pkgDir = dirname2(pkgPath);
|
|
1867
|
+
const built2 = join7(pkgDir, "dist", "server", "serve.js");
|
|
1868
|
+
if (existsSync4(built2)) return { script: built2, dev: false };
|
|
1869
|
+
const dev2 = join7(pkgDir, "src", "server", "serve.ts");
|
|
1870
|
+
if (existsSync4(dev2)) return { script: dev2, dev: true };
|
|
1871
|
+
} catch {
|
|
1872
|
+
}
|
|
1873
|
+
const built = [
|
|
1874
|
+
join7(__dirname, "..", "..", "..", "dashboard", "dist", "server", "serve.js"),
|
|
1875
|
+
join7(__dirname, "..", "..", "..", "..", "packages", "dashboard", "dist", "server", "serve.js")
|
|
1876
|
+
].find((p) => existsSync4(p));
|
|
1877
|
+
if (built) return { script: built, dev: false };
|
|
1878
|
+
const dev = [
|
|
1879
|
+
join7(__dirname, "..", "..", "..", "dashboard", "src", "server", "serve.ts"),
|
|
1880
|
+
join7(__dirname, "..", "..", "..", "..", "packages", "dashboard", "src", "server", "serve.ts")
|
|
1881
|
+
].find((p) => existsSync4(p));
|
|
1882
|
+
return dev ? { script: dev, dev: true } : null;
|
|
1883
|
+
}
|
|
1884
|
+
function spawnDashboardServer(server, env) {
|
|
1885
|
+
const child = server.dev ? spawn("tsx", [server.script], { env, stdio: "inherit" }) : spawn("node", [server.script], { env, stdio: "inherit" });
|
|
1886
|
+
child.on("error", (e) => {
|
|
1887
|
+
console.error(`Failed to start dashboard: ${e.message}`);
|
|
1888
|
+
process.exit(1);
|
|
1889
|
+
});
|
|
1890
|
+
child.on("exit", (code) => {
|
|
1891
|
+
if (code !== 0 && code !== null) {
|
|
1892
|
+
console.error(`Dashboard server exited with code ${code}`);
|
|
1893
|
+
process.exit(code);
|
|
1894
|
+
}
|
|
1895
|
+
});
|
|
1896
|
+
return child;
|
|
1897
|
+
}
|
|
1898
|
+
function runDashboard(opts) {
|
|
1899
|
+
const clientPort = Number(opts.port ?? DEFAULT_CLIENT_PORT);
|
|
1900
|
+
const apiPort = Number(opts.apiPort ?? DEFAULT_API_PORT);
|
|
1901
|
+
const projectPath = resolve10(opts.cwd ?? process.cwd());
|
|
1902
|
+
const url = `http://localhost:${clientPort}`;
|
|
1903
|
+
const server = resolveServerScript();
|
|
1904
|
+
if (!server) {
|
|
1905
|
+
console.error("Could not locate the dashboard server. Run `pnpm build` in packages/dashboard.");
|
|
1906
|
+
process.exit(1);
|
|
1907
|
+
}
|
|
1908
|
+
const env = {
|
|
1909
|
+
...process.env,
|
|
1910
|
+
DASHBOARD_API_PORT: String(apiPort),
|
|
1911
|
+
DASHBOARD_CLIENT_PORT: String(clientPort),
|
|
1912
|
+
HARNESS_PROJECT_PATH: projectPath
|
|
1913
|
+
};
|
|
1914
|
+
spawnDashboardServer(server, env);
|
|
1915
|
+
console.log(`Dashboard API starting on http://localhost:${apiPort}`);
|
|
1916
|
+
console.log(`Open ${url} (pass --no-open to suppress)`);
|
|
1917
|
+
if (opts.noOpen !== true) {
|
|
1918
|
+
setTimeout(() => openBrowser(url), 1500);
|
|
1919
|
+
}
|
|
1920
|
+
}
|
|
1921
|
+
function createDashboardCommand() {
|
|
1922
|
+
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));
|
|
1923
|
+
}
|
|
1924
|
+
|
|
1925
|
+
// src/commands/doctor.ts
|
|
1926
|
+
import { Command as Command18 } from "commander";
|
|
1927
|
+
import * as fs5 from "fs";
|
|
1652
1928
|
import * as os from "os";
|
|
1653
|
-
import * as
|
|
1929
|
+
import * as path12 from "path";
|
|
1654
1930
|
import chalk from "chalk";
|
|
1655
1931
|
|
|
1656
1932
|
// src/utils/node-version.ts
|
|
@@ -1733,24 +2009,24 @@ var INTEGRATION_REGISTRY = [
|
|
|
1733
2009
|
];
|
|
1734
2010
|
|
|
1735
2011
|
// src/integrations/config.ts
|
|
1736
|
-
import * as
|
|
1737
|
-
import * as
|
|
2012
|
+
import * as fs4 from "fs";
|
|
2013
|
+
import * as path11 from "path";
|
|
1738
2014
|
function readJsonSafe(filePath) {
|
|
1739
|
-
if (!
|
|
2015
|
+
if (!fs4.existsSync(filePath)) return null;
|
|
1740
2016
|
try {
|
|
1741
|
-
return JSON.parse(
|
|
2017
|
+
return JSON.parse(fs4.readFileSync(filePath, "utf-8"));
|
|
1742
2018
|
} catch {
|
|
1743
2019
|
return null;
|
|
1744
2020
|
}
|
|
1745
2021
|
}
|
|
1746
2022
|
function writeJson(filePath, data) {
|
|
1747
|
-
const dir =
|
|
1748
|
-
if (!
|
|
1749
|
-
|
|
2023
|
+
const dir = path11.dirname(filePath);
|
|
2024
|
+
if (!fs4.existsSync(dir)) {
|
|
2025
|
+
fs4.mkdirSync(dir, { recursive: true });
|
|
1750
2026
|
}
|
|
1751
2027
|
const tmp = filePath + ".tmp";
|
|
1752
|
-
|
|
1753
|
-
|
|
2028
|
+
fs4.writeFileSync(tmp, JSON.stringify(data, null, 2) + "\n");
|
|
2029
|
+
fs4.renameSync(tmp, filePath);
|
|
1754
2030
|
}
|
|
1755
2031
|
function readMcpConfig(filePath) {
|
|
1756
2032
|
const config = readJsonSafe(filePath);
|
|
@@ -1764,7 +2040,7 @@ function writeMcpEntry(filePath, name, entry) {
|
|
|
1764
2040
|
writeJson(filePath, config);
|
|
1765
2041
|
}
|
|
1766
2042
|
function removeMcpEntry(filePath, name) {
|
|
1767
|
-
if (!
|
|
2043
|
+
if (!fs4.existsSync(filePath)) return;
|
|
1768
2044
|
const config = readMcpConfig(filePath);
|
|
1769
2045
|
delete config.mcpServers[name];
|
|
1770
2046
|
writeJson(filePath, config);
|
|
@@ -1803,7 +2079,7 @@ function checkNodeVersion2() {
|
|
|
1803
2079
|
}
|
|
1804
2080
|
function countCommandFiles(dir, ext) {
|
|
1805
2081
|
try {
|
|
1806
|
-
return
|
|
2082
|
+
return fs5.readdirSync(dir).filter((f) => f.endsWith(ext)).length;
|
|
1807
2083
|
} catch {
|
|
1808
2084
|
return 0;
|
|
1809
2085
|
}
|
|
@@ -1812,13 +2088,13 @@ function checkSlashCommands() {
|
|
|
1812
2088
|
const platforms = [
|
|
1813
2089
|
{
|
|
1814
2090
|
name: "Claude Code",
|
|
1815
|
-
dir:
|
|
2091
|
+
dir: path12.join(os.homedir(), ".claude", "commands", "harness"),
|
|
1816
2092
|
ext: ".md",
|
|
1817
2093
|
client: "claude-code"
|
|
1818
2094
|
},
|
|
1819
2095
|
{
|
|
1820
2096
|
name: "Gemini CLI",
|
|
1821
|
-
dir:
|
|
2097
|
+
dir: path12.join(os.homedir(), ".gemini", "commands", "harness"),
|
|
1822
2098
|
ext: ".toml",
|
|
1823
2099
|
client: "gemini-cli"
|
|
1824
2100
|
}
|
|
@@ -1842,7 +2118,7 @@ function checkSlashCommands() {
|
|
|
1842
2118
|
}
|
|
1843
2119
|
function checkMcpConfig(cwd) {
|
|
1844
2120
|
const results = [];
|
|
1845
|
-
const claudeConfig = readMcpConfig(
|
|
2121
|
+
const claudeConfig = readMcpConfig(path12.join(cwd, ".mcp.json"));
|
|
1846
2122
|
if (claudeConfig.mcpServers?.["harness"]) {
|
|
1847
2123
|
results.push({
|
|
1848
2124
|
name: "mcp-claude",
|
|
@@ -1857,9 +2133,9 @@ function checkMcpConfig(cwd) {
|
|
|
1857
2133
|
fix: "Run: harness setup-mcp --client claude"
|
|
1858
2134
|
});
|
|
1859
2135
|
}
|
|
1860
|
-
const geminiDir =
|
|
1861
|
-
if (
|
|
1862
|
-
const geminiConfig = readMcpConfig(
|
|
2136
|
+
const geminiDir = path12.join(cwd, ".gemini");
|
|
2137
|
+
if (fs5.existsSync(geminiDir)) {
|
|
2138
|
+
const geminiConfig = readMcpConfig(path12.join(geminiDir, "settings.json"));
|
|
1863
2139
|
if (geminiConfig.mcpServers?.["harness"]) {
|
|
1864
2140
|
results.push({
|
|
1865
2141
|
name: "mcp-gemini",
|
|
@@ -1878,12 +2154,12 @@ function checkMcpConfig(cwd) {
|
|
|
1878
2154
|
return results;
|
|
1879
2155
|
}
|
|
1880
2156
|
function loadMcpPresence(cwd) {
|
|
1881
|
-
const mcpPath =
|
|
1882
|
-
const geminiDir =
|
|
1883
|
-
const hasGemini =
|
|
2157
|
+
const mcpPath = path12.join(cwd, ".mcp.json");
|
|
2158
|
+
const geminiDir = path12.join(cwd, ".gemini");
|
|
2159
|
+
const hasGemini = fs5.existsSync(geminiDir);
|
|
1884
2160
|
return {
|
|
1885
2161
|
mcpConfig: readMcpConfig(mcpPath),
|
|
1886
|
-
geminiConfig: hasGemini ? readMcpConfig(
|
|
2162
|
+
geminiConfig: hasGemini ? readMcpConfig(path12.join(geminiDir, "settings.json")) : null,
|
|
1887
2163
|
hasGemini
|
|
1888
2164
|
};
|
|
1889
2165
|
}
|
|
@@ -1915,7 +2191,7 @@ function checkTier0Presence(def, presence) {
|
|
|
1915
2191
|
function checkIntegrations(cwd) {
|
|
1916
2192
|
const results = [];
|
|
1917
2193
|
const presence = loadMcpPresence(cwd);
|
|
1918
|
-
const configPath =
|
|
2194
|
+
const configPath = path12.join(cwd, "harness.config.json");
|
|
1919
2195
|
const integrationsConfig = readIntegrationsConfig(configPath);
|
|
1920
2196
|
for (const def of INTEGRATION_REGISTRY.filter((d) => d.tier === 0)) {
|
|
1921
2197
|
results.push(checkTier0Presence(def, presence));
|
|
@@ -1965,7 +2241,7 @@ function formatCheck(check) {
|
|
|
1965
2241
|
return line;
|
|
1966
2242
|
}
|
|
1967
2243
|
function createDoctorCommand() {
|
|
1968
|
-
return new
|
|
2244
|
+
return new Command18("doctor").description("Check environment health: Node version, slash commands, MCP configuration").action((_opts, cmd) => {
|
|
1969
2245
|
const globalOpts = cmd.optsWithGlobals();
|
|
1970
2246
|
const cwd = process.cwd();
|
|
1971
2247
|
const useJson = globalOpts.json;
|
|
@@ -1990,8 +2266,8 @@ function createDoctorCommand() {
|
|
|
1990
2266
|
}
|
|
1991
2267
|
|
|
1992
2268
|
// src/commands/fix-drift.ts
|
|
1993
|
-
import { Command as
|
|
1994
|
-
import * as
|
|
2269
|
+
import { Command as Command19 } from "commander";
|
|
2270
|
+
import * as path13 from "path";
|
|
1995
2271
|
async function runFixDrift(options) {
|
|
1996
2272
|
const cwd = options.cwd ?? process.cwd();
|
|
1997
2273
|
const dryRun = options.dryRun !== false;
|
|
@@ -2000,11 +2276,11 @@ async function runFixDrift(options) {
|
|
|
2000
2276
|
return Err(configResult.error);
|
|
2001
2277
|
}
|
|
2002
2278
|
const config = configResult.value;
|
|
2003
|
-
const rootDir =
|
|
2004
|
-
const docsDir =
|
|
2279
|
+
const rootDir = path13.resolve(cwd, config.rootDir);
|
|
2280
|
+
const docsDir = path13.resolve(cwd, config.docsDir);
|
|
2005
2281
|
const entropyConfig = {
|
|
2006
2282
|
rootDir,
|
|
2007
|
-
entryPoints: [
|
|
2283
|
+
entryPoints: [path13.join(rootDir, "src/index.ts")],
|
|
2008
2284
|
docPaths: [docsDir],
|
|
2009
2285
|
analyze: {
|
|
2010
2286
|
drift: true,
|
|
@@ -2123,7 +2399,7 @@ function printFixDriftResult(value, mode, formatter) {
|
|
|
2123
2399
|
}
|
|
2124
2400
|
}
|
|
2125
2401
|
function createFixDriftCommand() {
|
|
2126
|
-
const command = new
|
|
2402
|
+
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
2403
|
const globalOpts = cmd.optsWithGlobals();
|
|
2128
2404
|
const mode = resolveOutputMode2(globalOpts);
|
|
2129
2405
|
const formatter = new OutputFormatter(mode);
|
|
@@ -2153,7 +2429,7 @@ function createFixDriftCommand() {
|
|
|
2153
2429
|
}
|
|
2154
2430
|
|
|
2155
2431
|
// src/commands/generate.ts
|
|
2156
|
-
import { Command as
|
|
2432
|
+
import { Command as Command20 } from "commander";
|
|
2157
2433
|
function validatePlatforms(platforms) {
|
|
2158
2434
|
for (const p of platforms) {
|
|
2159
2435
|
if (!VALID_PLATFORMS.includes(p)) {
|
|
@@ -2213,27 +2489,27 @@ async function runGenerateAction(opts, globalOpts) {
|
|
|
2213
2489
|
}
|
|
2214
2490
|
}
|
|
2215
2491
|
function createGenerateCommand() {
|
|
2216
|
-
return new
|
|
2492
|
+
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
2493
|
await runGenerateAction(opts, cmd.optsWithGlobals());
|
|
2218
2494
|
});
|
|
2219
2495
|
}
|
|
2220
2496
|
|
|
2221
2497
|
// src/commands/graph/index.ts
|
|
2222
|
-
import { Command as
|
|
2498
|
+
import { Command as Command24 } from "commander";
|
|
2223
2499
|
|
|
2224
2500
|
// src/commands/graph/status.ts
|
|
2225
|
-
import * as
|
|
2501
|
+
import * as path14 from "path";
|
|
2226
2502
|
async function runGraphStatus(projectPath) {
|
|
2227
|
-
const { GraphStore } = await import("./dist-
|
|
2228
|
-
const graphDir =
|
|
2503
|
+
const { GraphStore } = await import("./dist-QW5G3GX3.js");
|
|
2504
|
+
const graphDir = path14.join(projectPath, ".harness", "graph");
|
|
2229
2505
|
const store = new GraphStore();
|
|
2230
2506
|
const loaded = await store.load(graphDir);
|
|
2231
2507
|
if (!loaded) return { status: "no_graph", message: "No graph found. Run `harness scan` first." };
|
|
2232
|
-
const
|
|
2233
|
-
const metaPath =
|
|
2508
|
+
const fs36 = await import("fs/promises");
|
|
2509
|
+
const metaPath = path14.join(graphDir, "metadata.json");
|
|
2234
2510
|
let lastScan = "unknown";
|
|
2235
2511
|
try {
|
|
2236
|
-
const meta = JSON.parse(await
|
|
2512
|
+
const meta = JSON.parse(await fs36.readFile(metaPath, "utf-8"));
|
|
2237
2513
|
lastScan = meta.lastScanTimestamp;
|
|
2238
2514
|
} catch {
|
|
2239
2515
|
}
|
|
@@ -2244,8 +2520,8 @@ async function runGraphStatus(projectPath) {
|
|
|
2244
2520
|
}
|
|
2245
2521
|
let connectorSyncStatus = {};
|
|
2246
2522
|
try {
|
|
2247
|
-
const syncMetaPath =
|
|
2248
|
-
const syncMeta = JSON.parse(await
|
|
2523
|
+
const syncMetaPath = path14.join(graphDir, "sync-metadata.json");
|
|
2524
|
+
const syncMeta = JSON.parse(await fs36.readFile(syncMetaPath, "utf-8"));
|
|
2249
2525
|
for (const [name, data] of Object.entries(syncMeta.connectors ?? {})) {
|
|
2250
2526
|
connectorSyncStatus[name] = data.lastSyncTimestamp;
|
|
2251
2527
|
}
|
|
@@ -2262,10 +2538,10 @@ async function runGraphStatus(projectPath) {
|
|
|
2262
2538
|
}
|
|
2263
2539
|
|
|
2264
2540
|
// src/commands/graph/export.ts
|
|
2265
|
-
import * as
|
|
2541
|
+
import * as path15 from "path";
|
|
2266
2542
|
async function runGraphExport(projectPath, format) {
|
|
2267
|
-
const { GraphStore } = await import("./dist-
|
|
2268
|
-
const graphDir =
|
|
2543
|
+
const { GraphStore } = await import("./dist-QW5G3GX3.js");
|
|
2544
|
+
const graphDir = path15.join(projectPath, ".harness", "graph");
|
|
2269
2545
|
const store = new GraphStore();
|
|
2270
2546
|
const loaded = await store.load(graphDir);
|
|
2271
2547
|
if (!loaded) throw new Error("No graph found. Run `harness scan` first.");
|
|
@@ -2294,13 +2570,13 @@ async function runGraphExport(projectPath, format) {
|
|
|
2294
2570
|
}
|
|
2295
2571
|
|
|
2296
2572
|
// src/commands/graph/index.ts
|
|
2297
|
-
import * as
|
|
2573
|
+
import * as path19 from "path";
|
|
2298
2574
|
|
|
2299
2575
|
// src/commands/graph/scan.ts
|
|
2300
|
-
import { Command as
|
|
2301
|
-
import * as
|
|
2576
|
+
import { Command as Command21 } from "commander";
|
|
2577
|
+
import * as path16 from "path";
|
|
2302
2578
|
async function runScan(projectPath) {
|
|
2303
|
-
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-
|
|
2579
|
+
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-QW5G3GX3.js");
|
|
2304
2580
|
const store = new GraphStore();
|
|
2305
2581
|
const start = Date.now();
|
|
2306
2582
|
await new CodeIngestor(store).ingest(projectPath);
|
|
@@ -2311,13 +2587,13 @@ async function runScan(projectPath) {
|
|
|
2311
2587
|
await new GitIngestor(store).ingest(projectPath);
|
|
2312
2588
|
} catch {
|
|
2313
2589
|
}
|
|
2314
|
-
const graphDir =
|
|
2590
|
+
const graphDir = path16.join(projectPath, ".harness", "graph");
|
|
2315
2591
|
await store.save(graphDir);
|
|
2316
2592
|
return { nodeCount: store.nodeCount, edgeCount: store.edgeCount, durationMs: Date.now() - start };
|
|
2317
2593
|
}
|
|
2318
2594
|
function createScanCommand() {
|
|
2319
|
-
return new
|
|
2320
|
-
const projectPath =
|
|
2595
|
+
return new Command21("scan").description("Scan project and build knowledge graph").argument("[path]", "Project root path", ".").action(async (inputPath, _opts, cmd) => {
|
|
2596
|
+
const projectPath = path16.resolve(inputPath);
|
|
2321
2597
|
const globalOpts = cmd.optsWithGlobals();
|
|
2322
2598
|
try {
|
|
2323
2599
|
const result = await runScan(projectPath);
|
|
@@ -2336,12 +2612,12 @@ function createScanCommand() {
|
|
|
2336
2612
|
}
|
|
2337
2613
|
|
|
2338
2614
|
// src/commands/graph/query.ts
|
|
2339
|
-
import { Command as
|
|
2340
|
-
import * as
|
|
2615
|
+
import { Command as Command22 } from "commander";
|
|
2616
|
+
import * as path17 from "path";
|
|
2341
2617
|
async function runQuery(projectPath, rootNodeId, opts) {
|
|
2342
|
-
const { GraphStore, ContextQL } = await import("./dist-
|
|
2618
|
+
const { GraphStore, ContextQL } = await import("./dist-QW5G3GX3.js");
|
|
2343
2619
|
const store = new GraphStore();
|
|
2344
|
-
const graphDir =
|
|
2620
|
+
const graphDir = path17.join(projectPath, ".harness", "graph");
|
|
2345
2621
|
const loaded = await store.load(graphDir);
|
|
2346
2622
|
if (!loaded) throw new Error("No graph found. Run `harness scan` first.");
|
|
2347
2623
|
const params = {
|
|
@@ -2363,7 +2639,7 @@ function printQueryResult(result) {
|
|
|
2363
2639
|
}
|
|
2364
2640
|
}
|
|
2365
2641
|
async function runQueryAction(rootNodeId, opts, globalOpts) {
|
|
2366
|
-
const projectPath =
|
|
2642
|
+
const projectPath = path17.resolve(globalOpts.config ? path17.dirname(globalOpts.config) : ".");
|
|
2367
2643
|
try {
|
|
2368
2644
|
const result = await runQuery(projectPath, rootNodeId, {
|
|
2369
2645
|
depth: parseInt(opts.depth),
|
|
@@ -2382,23 +2658,21 @@ async function runQueryAction(rootNodeId, opts, globalOpts) {
|
|
|
2382
2658
|
}
|
|
2383
2659
|
}
|
|
2384
2660
|
function createQueryCommand() {
|
|
2385
|
-
return new
|
|
2661
|
+
return new Command22("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
2662
|
await runQueryAction(rootNodeId, opts, cmd.optsWithGlobals());
|
|
2387
2663
|
});
|
|
2388
2664
|
}
|
|
2389
2665
|
|
|
2390
2666
|
// src/commands/graph/ingest.ts
|
|
2391
|
-
import { Command as
|
|
2392
|
-
import * as
|
|
2667
|
+
import { Command as Command23 } from "commander";
|
|
2668
|
+
import * as path18 from "path";
|
|
2393
2669
|
async function loadConnectorConfig(projectPath, source) {
|
|
2394
2670
|
try {
|
|
2395
|
-
const
|
|
2396
|
-
const configPath =
|
|
2397
|
-
const config = JSON.parse(await
|
|
2398
|
-
const connector = config.graph?.connectors?.
|
|
2399
|
-
|
|
2400
|
-
);
|
|
2401
|
-
return connector?.config ?? {};
|
|
2671
|
+
const fs36 = await import("fs/promises");
|
|
2672
|
+
const configPath = path18.join(projectPath, "harness.config.json");
|
|
2673
|
+
const config = JSON.parse(await fs36.readFile(configPath, "utf-8"));
|
|
2674
|
+
const connector = config.graph?.connectors?.[source];
|
|
2675
|
+
return connector ?? {};
|
|
2402
2676
|
} catch {
|
|
2403
2677
|
return {};
|
|
2404
2678
|
}
|
|
@@ -2432,9 +2706,11 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2432
2706
|
GitIngestor,
|
|
2433
2707
|
SyncManager,
|
|
2434
2708
|
JiraConnector,
|
|
2435
|
-
SlackConnector
|
|
2436
|
-
|
|
2437
|
-
|
|
2709
|
+
SlackConnector,
|
|
2710
|
+
CIConnector,
|
|
2711
|
+
ConfluenceConnector
|
|
2712
|
+
} = await import("./dist-QW5G3GX3.js");
|
|
2713
|
+
const graphDir = path18.join(projectPath, ".harness", "graph");
|
|
2438
2714
|
const store = new GraphStore();
|
|
2439
2715
|
await store.load(graphDir);
|
|
2440
2716
|
if (opts?.all) {
|
|
@@ -2446,7 +2722,9 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2446
2722
|
const syncManager = new SyncManager(store, graphDir);
|
|
2447
2723
|
const connectorMap = {
|
|
2448
2724
|
jira: () => new JiraConnector(),
|
|
2449
|
-
slack: () => new SlackConnector()
|
|
2725
|
+
slack: () => new SlackConnector(),
|
|
2726
|
+
ci: () => new CIConnector(),
|
|
2727
|
+
confluence: () => new ConfluenceConnector()
|
|
2450
2728
|
};
|
|
2451
2729
|
for (const [name, factory] of Object.entries(connectorMap)) {
|
|
2452
2730
|
const config = await loadConnectorConfig(projectPath, name);
|
|
@@ -2470,9 +2748,11 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2470
2748
|
result = await new GitIngestor(store).ingest(projectPath);
|
|
2471
2749
|
break;
|
|
2472
2750
|
default: {
|
|
2473
|
-
const knownConnectors = ["jira", "slack"];
|
|
2751
|
+
const knownConnectors = ["jira", "slack", "ci", "confluence"];
|
|
2474
2752
|
if (!knownConnectors.includes(source)) {
|
|
2475
|
-
throw new Error(
|
|
2753
|
+
throw new Error(
|
|
2754
|
+
`Unknown source: ${source}. Available: code, knowledge, git, jira, slack, ci, confluence`
|
|
2755
|
+
);
|
|
2476
2756
|
}
|
|
2477
2757
|
if (!SyncManager) {
|
|
2478
2758
|
throw new Error(
|
|
@@ -2482,7 +2762,9 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2482
2762
|
const syncManager = new SyncManager(store, graphDir);
|
|
2483
2763
|
const extConnectorMap = {
|
|
2484
2764
|
jira: () => new JiraConnector(),
|
|
2485
|
-
slack: () => new SlackConnector()
|
|
2765
|
+
slack: () => new SlackConnector(),
|
|
2766
|
+
ci: () => new CIConnector(),
|
|
2767
|
+
confluence: () => new ConfluenceConnector()
|
|
2486
2768
|
};
|
|
2487
2769
|
const factory = extConnectorMap[source];
|
|
2488
2770
|
const config = await loadConnectorConfig(projectPath, source);
|
|
@@ -2495,13 +2777,16 @@ async function runIngest(projectPath, source, opts) {
|
|
|
2495
2777
|
return result;
|
|
2496
2778
|
}
|
|
2497
2779
|
function createIngestCommand() {
|
|
2498
|
-
return new
|
|
2780
|
+
return new Command23("ingest").description("Ingest data into the knowledge graph").option(
|
|
2781
|
+
"--source <name>",
|
|
2782
|
+
"Source to ingest (code, knowledge, git, jira, slack, ci, confluence)"
|
|
2783
|
+
).option("--all", "Run all sources (code, knowledge, git, and configured connectors)").option("--full", "Force full re-ingestion").action(async (opts, cmd) => {
|
|
2499
2784
|
if (!opts.source && !opts.all) {
|
|
2500
2785
|
console.error("Error: --source or --all is required");
|
|
2501
2786
|
process.exit(1);
|
|
2502
2787
|
}
|
|
2503
2788
|
const globalOpts = cmd.optsWithGlobals();
|
|
2504
|
-
const projectPath =
|
|
2789
|
+
const projectPath = path18.resolve(globalOpts.config ? path18.dirname(globalOpts.config) : ".");
|
|
2505
2790
|
try {
|
|
2506
2791
|
const result = await runIngest(projectPath, opts.source ?? "", {
|
|
2507
2792
|
full: opts.full,
|
|
@@ -2524,7 +2809,7 @@ function createIngestCommand() {
|
|
|
2524
2809
|
|
|
2525
2810
|
// src/commands/graph/index.ts
|
|
2526
2811
|
function resolveProjectPath(globalOpts) {
|
|
2527
|
-
return
|
|
2812
|
+
return path19.resolve(globalOpts.config ? path19.dirname(globalOpts.config) : ".");
|
|
2528
2813
|
}
|
|
2529
2814
|
function printGraphStatus(result) {
|
|
2530
2815
|
if (result.status === "no_graph") {
|
|
@@ -2568,19 +2853,19 @@ async function runExportAction(opts, cmd) {
|
|
|
2568
2853
|
}
|
|
2569
2854
|
}
|
|
2570
2855
|
function createGraphCommand() {
|
|
2571
|
-
const graph = new
|
|
2856
|
+
const graph = new Command24("graph").description("Knowledge graph management");
|
|
2572
2857
|
graph.command("status").description("Show graph statistics").action(runStatusAction);
|
|
2573
2858
|
graph.command("export").description("Export graph").requiredOption("--format <format>", "Output format (json, mermaid)").action(runExportAction);
|
|
2574
2859
|
return graph;
|
|
2575
2860
|
}
|
|
2576
2861
|
|
|
2577
2862
|
// src/commands/hooks/index.ts
|
|
2578
|
-
import { Command as
|
|
2863
|
+
import { Command as Command29 } from "commander";
|
|
2579
2864
|
|
|
2580
2865
|
// src/commands/hooks/init.ts
|
|
2581
|
-
import { Command as
|
|
2582
|
-
import * as
|
|
2583
|
-
import * as
|
|
2866
|
+
import { Command as Command25 } from "commander";
|
|
2867
|
+
import * as fs6 from "fs";
|
|
2868
|
+
import * as path20 from "path";
|
|
2584
2869
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
2585
2870
|
|
|
2586
2871
|
// src/hooks/profiles.ts
|
|
@@ -2589,6 +2874,8 @@ var HOOK_SCRIPTS = [
|
|
|
2589
2874
|
{ name: "protect-config", event: "PreToolUse", matcher: "Write|Edit", minProfile: "standard" },
|
|
2590
2875
|
{ name: "quality-gate", event: "PostToolUse", matcher: "Edit|Write", minProfile: "standard" },
|
|
2591
2876
|
{ name: "pre-compact-state", event: "PreCompact", matcher: "*", minProfile: "standard" },
|
|
2877
|
+
{ name: "adoption-tracker", event: "Stop", matcher: "*", minProfile: "standard" },
|
|
2878
|
+
{ name: "telemetry-reporter", event: "Stop", matcher: "*", minProfile: "standard" },
|
|
2592
2879
|
{ name: "cost-tracker", event: "Stop", matcher: "*", minProfile: "strict" },
|
|
2593
2880
|
{ name: "sentinel-pre", event: "PreToolUse", matcher: "*", minProfile: "strict" },
|
|
2594
2881
|
{ name: "sentinel-post", event: "PostToolUse", matcher: "*", minProfile: "strict" }
|
|
@@ -2608,11 +2895,11 @@ var PROFILES = {
|
|
|
2608
2895
|
|
|
2609
2896
|
// src/commands/hooks/init.ts
|
|
2610
2897
|
var __filename2 = fileURLToPath2(import.meta.url);
|
|
2611
|
-
var __dirname2 =
|
|
2898
|
+
var __dirname2 = path20.dirname(__filename2);
|
|
2612
2899
|
var VALID_PROFILES = ["minimal", "standard", "strict"];
|
|
2613
2900
|
function resolveHookSourceDir() {
|
|
2614
|
-
const candidate =
|
|
2615
|
-
if (
|
|
2901
|
+
const candidate = path20.resolve(__dirname2, "..", "..", "hooks");
|
|
2902
|
+
if (fs6.existsSync(candidate)) {
|
|
2616
2903
|
return candidate;
|
|
2617
2904
|
}
|
|
2618
2905
|
throw new Error(`Cannot locate hook scripts directory. Expected at: ${candidate}`);
|
|
@@ -2640,12 +2927,12 @@ function mergeSettings(existing, hooksConfig) {
|
|
|
2640
2927
|
}
|
|
2641
2928
|
function initHooks(options) {
|
|
2642
2929
|
const { profile, projectDir } = options;
|
|
2643
|
-
const hooksDestDir =
|
|
2644
|
-
|
|
2645
|
-
if (
|
|
2646
|
-
for (const entry of
|
|
2930
|
+
const hooksDestDir = path20.join(projectDir, ".harness", "hooks");
|
|
2931
|
+
fs6.mkdirSync(hooksDestDir, { recursive: true });
|
|
2932
|
+
if (fs6.existsSync(hooksDestDir)) {
|
|
2933
|
+
for (const entry of fs6.readdirSync(hooksDestDir)) {
|
|
2647
2934
|
if (entry.endsWith(".js")) {
|
|
2648
|
-
|
|
2935
|
+
fs6.unlinkSync(path20.join(hooksDestDir, entry));
|
|
2649
2936
|
}
|
|
2650
2937
|
}
|
|
2651
2938
|
}
|
|
@@ -2654,22 +2941,22 @@ function initHooks(options) {
|
|
|
2654
2941
|
const activeNames = PROFILES[profile];
|
|
2655
2942
|
const activeScripts = HOOK_SCRIPTS.filter((h) => activeNames.includes(h.name));
|
|
2656
2943
|
for (const script of activeScripts) {
|
|
2657
|
-
const srcFile =
|
|
2658
|
-
const destFile =
|
|
2659
|
-
if (
|
|
2660
|
-
|
|
2944
|
+
const srcFile = path20.join(sourceDir, `${script.name}.js`);
|
|
2945
|
+
const destFile = path20.join(hooksDestDir, `${script.name}.js`);
|
|
2946
|
+
if (fs6.existsSync(srcFile)) {
|
|
2947
|
+
fs6.copyFileSync(srcFile, destFile);
|
|
2661
2948
|
copiedScripts.push(script.name);
|
|
2662
2949
|
}
|
|
2663
2950
|
}
|
|
2664
|
-
const profilePath =
|
|
2665
|
-
|
|
2666
|
-
const claudeDir =
|
|
2667
|
-
|
|
2668
|
-
const settingsPath =
|
|
2951
|
+
const profilePath = path20.join(hooksDestDir, "profile.json");
|
|
2952
|
+
fs6.writeFileSync(profilePath, JSON.stringify({ profile }, null, 2) + "\n");
|
|
2953
|
+
const claudeDir = path20.join(projectDir, ".claude");
|
|
2954
|
+
fs6.mkdirSync(claudeDir, { recursive: true });
|
|
2955
|
+
const settingsPath = path20.join(claudeDir, "settings.json");
|
|
2669
2956
|
let existing = {};
|
|
2670
|
-
if (
|
|
2957
|
+
if (fs6.existsSync(settingsPath)) {
|
|
2671
2958
|
try {
|
|
2672
|
-
existing = JSON.parse(
|
|
2959
|
+
existing = JSON.parse(fs6.readFileSync(settingsPath, "utf-8"));
|
|
2673
2960
|
} catch (e) {
|
|
2674
2961
|
throw new Error(
|
|
2675
2962
|
`Malformed .claude/settings.json \u2014 fix the JSON syntax before running hooks init. Parse error: ${e instanceof Error ? e.message : String(e)}`,
|
|
@@ -2679,11 +2966,11 @@ function initHooks(options) {
|
|
|
2679
2966
|
}
|
|
2680
2967
|
const hooksConfig = buildSettingsHooks(profile);
|
|
2681
2968
|
const merged = mergeSettings(existing, hooksConfig);
|
|
2682
|
-
|
|
2969
|
+
fs6.writeFileSync(settingsPath, JSON.stringify(merged, null, 2) + "\n");
|
|
2683
2970
|
return { copiedScripts, settingsPath, profilePath };
|
|
2684
2971
|
}
|
|
2685
2972
|
function createInitCommand2() {
|
|
2686
|
-
return new
|
|
2973
|
+
return new Command25("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
2974
|
const globalOpts = cmd.optsWithGlobals();
|
|
2688
2975
|
const profile = opts.profile;
|
|
2689
2976
|
if (!VALID_PROFILES.includes(profile)) {
|
|
@@ -2707,7 +2994,7 @@ function createInitCommand2() {
|
|
|
2707
2994
|
`Installed ${result.copiedScripts.length} hook scripts to .harness/hooks/`
|
|
2708
2995
|
);
|
|
2709
2996
|
logger.info(`Profile: ${profile}`);
|
|
2710
|
-
logger.info(`Settings: ${
|
|
2997
|
+
logger.info(`Settings: ${path20.relative(projectDir, result.settingsPath)}`);
|
|
2711
2998
|
logger.dim("Run 'harness hooks list' to see installed hooks");
|
|
2712
2999
|
}
|
|
2713
3000
|
} catch (err) {
|
|
@@ -2719,19 +3006,19 @@ function createInitCommand2() {
|
|
|
2719
3006
|
}
|
|
2720
3007
|
|
|
2721
3008
|
// src/commands/hooks/list.ts
|
|
2722
|
-
import { Command as
|
|
2723
|
-
import * as
|
|
2724
|
-
import * as
|
|
3009
|
+
import { Command as Command26 } from "commander";
|
|
3010
|
+
import * as fs7 from "fs";
|
|
3011
|
+
import * as path21 from "path";
|
|
2725
3012
|
function listHooks(projectDir) {
|
|
2726
|
-
const hooksDir =
|
|
2727
|
-
const profilePath =
|
|
2728
|
-
if (!
|
|
3013
|
+
const hooksDir = path21.join(projectDir, ".harness", "hooks");
|
|
3014
|
+
const profilePath = path21.join(hooksDir, "profile.json");
|
|
3015
|
+
if (!fs7.existsSync(profilePath)) {
|
|
2729
3016
|
return { installed: false, profile: null, hooks: [] };
|
|
2730
3017
|
}
|
|
2731
3018
|
let profile = "standard";
|
|
2732
3019
|
let warning;
|
|
2733
3020
|
try {
|
|
2734
|
-
const data = JSON.parse(
|
|
3021
|
+
const data = JSON.parse(fs7.readFileSync(profilePath, "utf-8"));
|
|
2735
3022
|
if (data.profile && ["minimal", "standard", "strict"].includes(data.profile)) {
|
|
2736
3023
|
profile = data.profile;
|
|
2737
3024
|
}
|
|
@@ -2743,7 +3030,7 @@ function listHooks(projectDir) {
|
|
|
2743
3030
|
name: h.name,
|
|
2744
3031
|
event: h.event,
|
|
2745
3032
|
matcher: h.matcher,
|
|
2746
|
-
scriptPath:
|
|
3033
|
+
scriptPath: path21.join(".harness", "hooks", `${h.name}.js`)
|
|
2747
3034
|
}));
|
|
2748
3035
|
const result = { installed: true, profile, hooks };
|
|
2749
3036
|
if (warning) {
|
|
@@ -2752,7 +3039,7 @@ function listHooks(projectDir) {
|
|
|
2752
3039
|
return result;
|
|
2753
3040
|
}
|
|
2754
3041
|
function createListCommand() {
|
|
2755
|
-
return new
|
|
3042
|
+
return new Command26("list").description("Show installed hooks and active profile").action(async (_opts, cmd) => {
|
|
2756
3043
|
const globalOpts = cmd.optsWithGlobals();
|
|
2757
3044
|
const projectDir = process.cwd();
|
|
2758
3045
|
const result = listHooks(projectDir);
|
|
@@ -2773,28 +3060,28 @@ function createListCommand() {
|
|
|
2773
3060
|
}
|
|
2774
3061
|
|
|
2775
3062
|
// src/commands/hooks/remove.ts
|
|
2776
|
-
import { Command as
|
|
2777
|
-
import * as
|
|
2778
|
-
import * as
|
|
3063
|
+
import { Command as Command27 } from "commander";
|
|
3064
|
+
import * as fs8 from "fs";
|
|
3065
|
+
import * as path22 from "path";
|
|
2779
3066
|
function removeHooks(projectDir) {
|
|
2780
|
-
const hooksDir =
|
|
2781
|
-
const settingsPath =
|
|
3067
|
+
const hooksDir = path22.join(projectDir, ".harness", "hooks");
|
|
3068
|
+
const settingsPath = path22.join(projectDir, ".claude", "settings.json");
|
|
2782
3069
|
let removed = false;
|
|
2783
3070
|
let settingsCleaned = false;
|
|
2784
|
-
if (
|
|
2785
|
-
|
|
3071
|
+
if (fs8.existsSync(hooksDir)) {
|
|
3072
|
+
fs8.rmSync(hooksDir, { recursive: true, force: true });
|
|
2786
3073
|
removed = true;
|
|
2787
3074
|
}
|
|
2788
|
-
if (
|
|
3075
|
+
if (fs8.existsSync(settingsPath)) {
|
|
2789
3076
|
try {
|
|
2790
|
-
const settings = JSON.parse(
|
|
3077
|
+
const settings = JSON.parse(fs8.readFileSync(settingsPath, "utf-8"));
|
|
2791
3078
|
if (settings.hooks !== void 0) {
|
|
2792
3079
|
delete settings.hooks;
|
|
2793
3080
|
settingsCleaned = true;
|
|
2794
3081
|
if (Object.keys(settings).length === 0) {
|
|
2795
|
-
|
|
3082
|
+
fs8.unlinkSync(settingsPath);
|
|
2796
3083
|
} else {
|
|
2797
|
-
|
|
3084
|
+
fs8.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
2798
3085
|
}
|
|
2799
3086
|
}
|
|
2800
3087
|
} catch {
|
|
@@ -2803,7 +3090,7 @@ function removeHooks(projectDir) {
|
|
|
2803
3090
|
return { removed, hooksDir, settingsCleaned };
|
|
2804
3091
|
}
|
|
2805
3092
|
function createRemoveCommand() {
|
|
2806
|
-
return new
|
|
3093
|
+
return new Command27("remove").description("Remove harness-managed hooks from the current project").action(async (_opts, cmd) => {
|
|
2807
3094
|
const globalOpts = cmd.optsWithGlobals();
|
|
2808
3095
|
const projectDir = process.cwd();
|
|
2809
3096
|
const result = removeHooks(projectDir);
|
|
@@ -2825,21 +3112,21 @@ function createRemoveCommand() {
|
|
|
2825
3112
|
}
|
|
2826
3113
|
|
|
2827
3114
|
// src/commands/hooks/add.ts
|
|
2828
|
-
import { Command as
|
|
2829
|
-
import * as
|
|
2830
|
-
import * as
|
|
3115
|
+
import { Command as Command28 } from "commander";
|
|
3116
|
+
import * as fs9 from "fs";
|
|
3117
|
+
import * as path23 from "path";
|
|
2831
3118
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
2832
|
-
var __dirname3 =
|
|
3119
|
+
var __dirname3 = path23.dirname(fileURLToPath3(import.meta.url));
|
|
2833
3120
|
var ALIASES = {
|
|
2834
3121
|
sentinel: ["sentinel-pre", "sentinel-post"]
|
|
2835
3122
|
};
|
|
2836
3123
|
function hookSourceDir() {
|
|
2837
|
-
const d =
|
|
2838
|
-
if (
|
|
3124
|
+
const d = path23.resolve(__dirname3, "..", "..", "hooks");
|
|
3125
|
+
if (fs9.existsSync(d)) return d;
|
|
2839
3126
|
throw new Error(`Hook scripts not found: ${d}`);
|
|
2840
3127
|
}
|
|
2841
3128
|
function readJson(p) {
|
|
2842
|
-
return
|
|
3129
|
+
return fs9.existsSync(p) ? JSON.parse(fs9.readFileSync(p, "utf-8")) : {};
|
|
2843
3130
|
}
|
|
2844
3131
|
function registerHook(s, ev, matcher, name) {
|
|
2845
3132
|
if (!s.hooks[ev]) s.hooks[ev] = [];
|
|
@@ -2852,11 +3139,11 @@ function addHooks(hookName, projectDir) {
|
|
|
2852
3139
|
const names = ALIASES[hookName] ?? [hookName];
|
|
2853
3140
|
const result = { added: [], alreadyInstalled: [], notFound: [] };
|
|
2854
3141
|
const srcDir = hookSourceDir();
|
|
2855
|
-
const destDir =
|
|
2856
|
-
|
|
2857
|
-
const claudeDir =
|
|
2858
|
-
|
|
2859
|
-
const settingsPath =
|
|
3142
|
+
const destDir = path23.join(projectDir, ".harness", "hooks");
|
|
3143
|
+
fs9.mkdirSync(destDir, { recursive: true });
|
|
3144
|
+
const claudeDir = path23.join(projectDir, ".claude");
|
|
3145
|
+
fs9.mkdirSync(claudeDir, { recursive: true });
|
|
3146
|
+
const settingsPath = path23.join(claudeDir, "settings.json");
|
|
2860
3147
|
const settings = readJson(settingsPath);
|
|
2861
3148
|
if (!settings.hooks) settings.hooks = {};
|
|
2862
3149
|
for (const name of names) {
|
|
@@ -2865,24 +3152,24 @@ function addHooks(hookName, projectDir) {
|
|
|
2865
3152
|
result.notFound.push(name);
|
|
2866
3153
|
continue;
|
|
2867
3154
|
}
|
|
2868
|
-
const src =
|
|
2869
|
-
const dest =
|
|
2870
|
-
if (
|
|
3155
|
+
const src = path23.join(srcDir, `${name}.js`);
|
|
3156
|
+
const dest = path23.join(destDir, `${name}.js`);
|
|
3157
|
+
if (fs9.existsSync(dest)) {
|
|
2871
3158
|
result.alreadyInstalled.push(name);
|
|
2872
|
-
} else if (!
|
|
3159
|
+
} else if (!fs9.existsSync(src)) {
|
|
2873
3160
|
result.notFound.push(name);
|
|
2874
3161
|
continue;
|
|
2875
3162
|
} else {
|
|
2876
|
-
|
|
3163
|
+
fs9.copyFileSync(src, dest);
|
|
2877
3164
|
result.added.push(name);
|
|
2878
3165
|
}
|
|
2879
3166
|
registerHook(settings, def.event, def.matcher, name);
|
|
2880
3167
|
}
|
|
2881
|
-
|
|
3168
|
+
fs9.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
2882
3169
|
return result;
|
|
2883
3170
|
}
|
|
2884
3171
|
function createAddCommand2() {
|
|
2885
|
-
return new
|
|
3172
|
+
return new Command28("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
3173
|
const projectDir = process.cwd();
|
|
2887
3174
|
try {
|
|
2888
3175
|
const res = addHooks(hookName, projectDir);
|
|
@@ -2907,7 +3194,7 @@ function createAddCommand2() {
|
|
|
2907
3194
|
|
|
2908
3195
|
// src/commands/hooks/index.ts
|
|
2909
3196
|
function createHooksCommand() {
|
|
2910
|
-
const command = new
|
|
3197
|
+
const command = new Command29("hooks").description("Manage Claude Code hook configurations");
|
|
2911
3198
|
command.addCommand(createInitCommand2());
|
|
2912
3199
|
command.addCommand(createListCommand());
|
|
2913
3200
|
command.addCommand(createRemoveCommand());
|
|
@@ -2916,10 +3203,10 @@ function createHooksCommand() {
|
|
|
2916
3203
|
}
|
|
2917
3204
|
|
|
2918
3205
|
// src/commands/impact-preview.ts
|
|
2919
|
-
import { Command as
|
|
3206
|
+
import { Command as Command30 } from "commander";
|
|
2920
3207
|
import { execSync as execSync4 } from "child_process";
|
|
2921
|
-
import * as
|
|
2922
|
-
import * as
|
|
3208
|
+
import * as path24 from "path";
|
|
3209
|
+
import * as fs10 from "fs";
|
|
2923
3210
|
function getStagedFiles(cwd) {
|
|
2924
3211
|
try {
|
|
2925
3212
|
const output = execSync4("git diff --cached --name-only", {
|
|
@@ -2933,7 +3220,7 @@ function getStagedFiles(cwd) {
|
|
|
2933
3220
|
}
|
|
2934
3221
|
function graphExists(projectPath) {
|
|
2935
3222
|
try {
|
|
2936
|
-
return
|
|
3223
|
+
return fs10.existsSync(path24.join(projectPath, ".harness", "graph", "graph.json"));
|
|
2937
3224
|
} catch {
|
|
2938
3225
|
return false;
|
|
2939
3226
|
}
|
|
@@ -2942,7 +3229,7 @@ function extractNodeName(id) {
|
|
|
2942
3229
|
const parts = id.split(":");
|
|
2943
3230
|
if (parts.length > 1) {
|
|
2944
3231
|
const fullPath = parts.slice(1).join(":");
|
|
2945
|
-
return
|
|
3232
|
+
return path24.basename(fullPath);
|
|
2946
3233
|
}
|
|
2947
3234
|
return id;
|
|
2948
3235
|
}
|
|
@@ -3097,7 +3384,7 @@ function formatImpactOutput(stagedFiles, acc, options) {
|
|
|
3097
3384
|
return options.detailed ? formatDetailed(stagedFiles.length, merged, acc.aggregateCounts) : formatCompact(stagedFiles.length, merged, acc.aggregateCounts);
|
|
3098
3385
|
}
|
|
3099
3386
|
async function runImpactPreview(options) {
|
|
3100
|
-
const projectPath =
|
|
3387
|
+
const projectPath = path24.resolve(options.path ?? process.cwd());
|
|
3101
3388
|
const stagedFiles = getStagedFiles(projectPath);
|
|
3102
3389
|
if (stagedFiles.length === 0) return "Impact Preview: no staged changes";
|
|
3103
3390
|
if (!graphExists(projectPath)) {
|
|
@@ -3115,7 +3402,7 @@ async function runImpactPreview(options) {
|
|
|
3115
3402
|
return formatImpactOutput(stagedFiles, acc, options);
|
|
3116
3403
|
}
|
|
3117
3404
|
function createImpactPreviewCommand() {
|
|
3118
|
-
const command = new
|
|
3405
|
+
const command = new Command30("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
3406
|
const output = await runImpactPreview({
|
|
3120
3407
|
detailed: opts.detailed,
|
|
3121
3408
|
perFile: opts.perFile,
|
|
@@ -3128,28 +3415,28 @@ function createImpactPreviewCommand() {
|
|
|
3128
3415
|
}
|
|
3129
3416
|
|
|
3130
3417
|
// src/commands/init.ts
|
|
3131
|
-
import { Command as
|
|
3418
|
+
import { Command as Command32 } from "commander";
|
|
3132
3419
|
import chalk3 from "chalk";
|
|
3133
|
-
import * as
|
|
3134
|
-
import * as
|
|
3420
|
+
import * as fs13 from "fs";
|
|
3421
|
+
import * as path27 from "path";
|
|
3135
3422
|
|
|
3136
3423
|
// src/commands/setup-mcp.ts
|
|
3137
|
-
import { Command as
|
|
3138
|
-
import * as
|
|
3139
|
-
import * as
|
|
3424
|
+
import { Command as Command31 } from "commander";
|
|
3425
|
+
import * as fs12 from "fs";
|
|
3426
|
+
import * as path26 from "path";
|
|
3140
3427
|
import * as os2 from "os";
|
|
3141
3428
|
import chalk2 from "chalk";
|
|
3142
3429
|
import * as clack from "@clack/prompts";
|
|
3143
3430
|
|
|
3144
3431
|
// src/integrations/toml.ts
|
|
3145
|
-
import * as
|
|
3146
|
-
import * as
|
|
3432
|
+
import * as fs11 from "fs";
|
|
3433
|
+
import * as path25 from "path";
|
|
3147
3434
|
function writeTomlMcpEntry(filePath, name, entry) {
|
|
3148
|
-
const dir =
|
|
3149
|
-
if (!
|
|
3150
|
-
|
|
3435
|
+
const dir = path25.dirname(filePath);
|
|
3436
|
+
if (!fs11.existsSync(dir)) {
|
|
3437
|
+
fs11.mkdirSync(dir, { recursive: true });
|
|
3151
3438
|
}
|
|
3152
|
-
const existing =
|
|
3439
|
+
const existing = fs11.existsSync(filePath) ? fs11.readFileSync(filePath, "utf-8") : "";
|
|
3153
3440
|
const blockHeader = `[mcp_servers.${name}]`;
|
|
3154
3441
|
const newBlock = serializeTomlMcpBlock(name, entry);
|
|
3155
3442
|
let updated;
|
|
@@ -3160,8 +3447,8 @@ function writeTomlMcpEntry(filePath, name, entry) {
|
|
|
3160
3447
|
updated = existing + separator + newBlock;
|
|
3161
3448
|
}
|
|
3162
3449
|
const tmp = filePath + ".tmp";
|
|
3163
|
-
|
|
3164
|
-
|
|
3450
|
+
fs11.writeFileSync(tmp, updated);
|
|
3451
|
+
fs11.renameSync(tmp, filePath);
|
|
3165
3452
|
}
|
|
3166
3453
|
function serializeTomlMcpBlock(name, entry) {
|
|
3167
3454
|
const lines = [`[mcp_servers.${name}]`];
|
|
@@ -3288,7 +3575,8 @@ var ALL_MCP_TOOLS = [
|
|
|
3288
3575
|
"predict_failures",
|
|
3289
3576
|
"recommend_skills",
|
|
3290
3577
|
"compute_blast_radius",
|
|
3291
|
-
"dispatch_skills"
|
|
3578
|
+
"dispatch_skills",
|
|
3579
|
+
"compact"
|
|
3292
3580
|
];
|
|
3293
3581
|
async function runCursorToolPicker() {
|
|
3294
3582
|
try {
|
|
@@ -3316,20 +3604,20 @@ function writeCursorMcpEntryWithTools(configPath, tools) {
|
|
|
3316
3604
|
});
|
|
3317
3605
|
}
|
|
3318
3606
|
function readJsonFile(filePath) {
|
|
3319
|
-
if (!
|
|
3607
|
+
if (!fs12.existsSync(filePath)) return null;
|
|
3320
3608
|
try {
|
|
3321
|
-
return JSON.parse(
|
|
3609
|
+
return JSON.parse(fs12.readFileSync(filePath, "utf-8"));
|
|
3322
3610
|
} catch {
|
|
3323
|
-
|
|
3611
|
+
fs12.copyFileSync(filePath, filePath + ".bak");
|
|
3324
3612
|
return null;
|
|
3325
3613
|
}
|
|
3326
3614
|
}
|
|
3327
3615
|
function writeJsonFile(filePath, data) {
|
|
3328
|
-
const dir =
|
|
3329
|
-
if (!
|
|
3330
|
-
|
|
3616
|
+
const dir = path26.dirname(filePath);
|
|
3617
|
+
if (!fs12.existsSync(dir)) {
|
|
3618
|
+
fs12.mkdirSync(dir, { recursive: true });
|
|
3331
3619
|
}
|
|
3332
|
-
|
|
3620
|
+
fs12.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n");
|
|
3333
3621
|
}
|
|
3334
3622
|
function configureMcpServer(configPath) {
|
|
3335
3623
|
const config = readJsonFile(configPath) ?? {};
|
|
@@ -3344,7 +3632,7 @@ function configureMcpServer(configPath) {
|
|
|
3344
3632
|
return true;
|
|
3345
3633
|
}
|
|
3346
3634
|
function addGeminiTrustedFolder(cwd) {
|
|
3347
|
-
const trustedPath =
|
|
3635
|
+
const trustedPath = path26.join(os2.homedir(), ".gemini", "trustedFolders.json");
|
|
3348
3636
|
const folders = readJsonFile(trustedPath) ?? {};
|
|
3349
3637
|
if (folders[cwd] === "TRUST_FOLDER") {
|
|
3350
3638
|
return false;
|
|
@@ -3358,7 +3646,7 @@ function setupMcp(cwd, client) {
|
|
|
3358
3646
|
const skipped = [];
|
|
3359
3647
|
let trustedFolder = false;
|
|
3360
3648
|
if (client === "all" || client === "claude") {
|
|
3361
|
-
const configPath =
|
|
3649
|
+
const configPath = path26.join(cwd, ".mcp.json");
|
|
3362
3650
|
if (configureMcpServer(configPath)) {
|
|
3363
3651
|
configured.push("Claude Code");
|
|
3364
3652
|
} else {
|
|
@@ -3366,7 +3654,7 @@ function setupMcp(cwd, client) {
|
|
|
3366
3654
|
}
|
|
3367
3655
|
}
|
|
3368
3656
|
if (client === "all" || client === "gemini") {
|
|
3369
|
-
const configPath =
|
|
3657
|
+
const configPath = path26.join(cwd, ".gemini", "settings.json");
|
|
3370
3658
|
if (configureMcpServer(configPath)) {
|
|
3371
3659
|
configured.push("Gemini CLI");
|
|
3372
3660
|
} else {
|
|
@@ -3375,10 +3663,10 @@ function setupMcp(cwd, client) {
|
|
|
3375
3663
|
trustedFolder = addGeminiTrustedFolder(cwd);
|
|
3376
3664
|
}
|
|
3377
3665
|
if (client === "all" || client === "codex") {
|
|
3378
|
-
const configPath =
|
|
3666
|
+
const configPath = path26.join(cwd, ".codex", "config.toml");
|
|
3379
3667
|
const alreadyConfigured = (() => {
|
|
3380
|
-
if (!
|
|
3381
|
-
const content =
|
|
3668
|
+
if (!fs12.existsSync(configPath)) return false;
|
|
3669
|
+
const content = fs12.readFileSync(configPath, "utf-8");
|
|
3382
3670
|
return content.includes("[mcp_servers.harness]");
|
|
3383
3671
|
})();
|
|
3384
3672
|
if (alreadyConfigured) {
|
|
@@ -3393,7 +3681,7 @@ function setupMcp(cwd, client) {
|
|
|
3393
3681
|
}
|
|
3394
3682
|
}
|
|
3395
3683
|
if (client === "all" || client === "cursor") {
|
|
3396
|
-
const configPath =
|
|
3684
|
+
const configPath = path26.join(cwd, ".cursor", "mcp.json");
|
|
3397
3685
|
const existing = readJsonFile(configPath);
|
|
3398
3686
|
if (existing?.mcpServers?.["harness"]) {
|
|
3399
3687
|
skipped.push("Cursor");
|
|
@@ -3407,7 +3695,7 @@ function setupMcp(cwd, client) {
|
|
|
3407
3695
|
async function resolveCursorWithPicker(cwd, pick) {
|
|
3408
3696
|
const configured = [];
|
|
3409
3697
|
const skipped = [];
|
|
3410
|
-
const cursorConfigPath =
|
|
3698
|
+
const cursorConfigPath = path26.join(cwd, ".cursor", "mcp.json");
|
|
3411
3699
|
const existing = readJsonFile(cursorConfigPath);
|
|
3412
3700
|
if (existing?.mcpServers?.["harness"] && !pick) {
|
|
3413
3701
|
skipped.push("Cursor");
|
|
@@ -3451,7 +3739,7 @@ function printMcpResult(configured, skipped, trustedFolder) {
|
|
|
3451
3739
|
console.log("");
|
|
3452
3740
|
}
|
|
3453
3741
|
function createSetupMcpCommand() {
|
|
3454
|
-
return new
|
|
3742
|
+
return new Command31("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
3743
|
const globalOpts = cmd.optsWithGlobals();
|
|
3456
3744
|
const cwd = process.cwd();
|
|
3457
3745
|
let configured;
|
|
@@ -3478,12 +3766,12 @@ function loadEngineAndTemplates(_options) {
|
|
|
3478
3766
|
}
|
|
3479
3767
|
function resolveInitDefaults(options) {
|
|
3480
3768
|
const cwd = options.cwd ?? process.cwd();
|
|
3481
|
-
return { cwd, name: options.name ??
|
|
3769
|
+
return { cwd, name: options.name ?? path27.basename(cwd), force: options.force ?? false };
|
|
3482
3770
|
}
|
|
3483
3771
|
async function runInit(options) {
|
|
3484
3772
|
const { cwd, name, force } = resolveInitDefaults(options);
|
|
3485
|
-
const configPath =
|
|
3486
|
-
if (!force &&
|
|
3773
|
+
const configPath = path27.join(cwd, "harness.config.json");
|
|
3774
|
+
if (!force && fs13.existsSync(configPath)) {
|
|
3487
3775
|
return Err(
|
|
3488
3776
|
new CLIError("Project already initialized. Use --force to overwrite.", ExitCode.ERROR)
|
|
3489
3777
|
);
|
|
@@ -3549,6 +3837,7 @@ function scaffoldProject(engine, ctx) {
|
|
|
3549
3837
|
}
|
|
3550
3838
|
persistToolingConfig(cwd, resolveResult.value, options.framework);
|
|
3551
3839
|
appendFrameworkAgents(cwd, options.framework, language);
|
|
3840
|
+
ensureHarnessGitignore(cwd);
|
|
3552
3841
|
return Ok({
|
|
3553
3842
|
filesCreated: writeResult.value.written,
|
|
3554
3843
|
skippedConfigs: writeResult.value.skippedConfigs
|
|
@@ -3590,7 +3879,7 @@ async function runInitAction2(opts) {
|
|
|
3590
3879
|
process.exit(ExitCode.SUCCESS);
|
|
3591
3880
|
}
|
|
3592
3881
|
function createInitCommand3() {
|
|
3593
|
-
const command = new
|
|
3882
|
+
const command = new Command32("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
3883
|
const globalOpts = cmd.optsWithGlobals();
|
|
3595
3884
|
await runInitAction2({
|
|
3596
3885
|
name: opts.name,
|
|
@@ -3605,16 +3894,16 @@ function createInitCommand3() {
|
|
|
3605
3894
|
}
|
|
3606
3895
|
|
|
3607
3896
|
// src/commands/install.ts
|
|
3608
|
-
import * as
|
|
3897
|
+
import * as fs18 from "fs";
|
|
3609
3898
|
import * as os5 from "os";
|
|
3610
|
-
import * as
|
|
3899
|
+
import * as path32 from "path";
|
|
3611
3900
|
import { execFileSync as execFileSync3 } from "child_process";
|
|
3612
|
-
import { Command as
|
|
3901
|
+
import { Command as Command33 } from "commander";
|
|
3613
3902
|
import { parse as yamlParse } from "yaml";
|
|
3614
3903
|
|
|
3615
3904
|
// src/registry/npm-client.ts
|
|
3616
|
-
import * as
|
|
3617
|
-
import * as
|
|
3905
|
+
import * as fs14 from "fs";
|
|
3906
|
+
import * as path28 from "path";
|
|
3618
3907
|
import * as os3 from "os";
|
|
3619
3908
|
var NPM_REGISTRY = "https://registry.npmjs.org";
|
|
3620
3909
|
var FETCH_TIMEOUT_MS = 3e4;
|
|
@@ -3637,10 +3926,10 @@ function extractSkillName(packageName) {
|
|
|
3637
3926
|
function readNpmrcToken(registryUrl) {
|
|
3638
3927
|
const { hostname, pathname } = new URL(registryUrl);
|
|
3639
3928
|
const registryPath = `//${hostname}${pathname.replace(/\/$/, "")}/:_authToken=`;
|
|
3640
|
-
const candidates = [
|
|
3929
|
+
const candidates = [path28.join(process.cwd(), ".npmrc"), path28.join(os3.homedir(), ".npmrc")];
|
|
3641
3930
|
for (const npmrcPath of candidates) {
|
|
3642
3931
|
try {
|
|
3643
|
-
const content =
|
|
3932
|
+
const content = fs14.readFileSync(npmrcPath, "utf-8");
|
|
3644
3933
|
for (const line of content.split("\n")) {
|
|
3645
3934
|
const trimmed = line.trim();
|
|
3646
3935
|
if (trimmed.startsWith(registryPath)) {
|
|
@@ -3735,19 +4024,19 @@ async function searchNpmRegistry(query, registryUrl) {
|
|
|
3735
4024
|
}
|
|
3736
4025
|
|
|
3737
4026
|
// src/registry/tarball.ts
|
|
3738
|
-
import * as
|
|
3739
|
-
import * as
|
|
4027
|
+
import * as fs15 from "fs";
|
|
4028
|
+
import * as path29 from "path";
|
|
3740
4029
|
import * as os4 from "os";
|
|
3741
4030
|
import { execFileSync as execFileSync2 } from "child_process";
|
|
3742
4031
|
function extractTarball(tarballBuffer) {
|
|
3743
|
-
const tmpDir =
|
|
3744
|
-
const tarballPath =
|
|
4032
|
+
const tmpDir = fs15.mkdtempSync(path29.join(os4.tmpdir(), "harness-skill-install-"));
|
|
4033
|
+
const tarballPath = path29.join(tmpDir, "package.tgz");
|
|
3745
4034
|
try {
|
|
3746
|
-
|
|
4035
|
+
fs15.writeFileSync(tarballPath, tarballBuffer);
|
|
3747
4036
|
execFileSync2("tar", ["-xzf", tarballPath, "-C", tmpDir], {
|
|
3748
4037
|
timeout: 3e4
|
|
3749
4038
|
});
|
|
3750
|
-
|
|
4039
|
+
fs15.unlinkSync(tarballPath);
|
|
3751
4040
|
} catch (err) {
|
|
3752
4041
|
cleanupTempDir(tmpDir);
|
|
3753
4042
|
throw new Error(
|
|
@@ -3758,37 +4047,37 @@ function extractTarball(tarballBuffer) {
|
|
|
3758
4047
|
return tmpDir;
|
|
3759
4048
|
}
|
|
3760
4049
|
function placeSkillContent(extractedPkgDir, communityBaseDir, skillName, platforms) {
|
|
3761
|
-
const files =
|
|
4050
|
+
const files = fs15.readdirSync(extractedPkgDir);
|
|
3762
4051
|
for (const platform of platforms) {
|
|
3763
|
-
const targetDir =
|
|
3764
|
-
if (
|
|
3765
|
-
|
|
4052
|
+
const targetDir = path29.join(communityBaseDir, platform, skillName);
|
|
4053
|
+
if (fs15.existsSync(targetDir)) {
|
|
4054
|
+
fs15.rmSync(targetDir, { recursive: true, force: true });
|
|
3766
4055
|
}
|
|
3767
|
-
|
|
4056
|
+
fs15.mkdirSync(targetDir, { recursive: true });
|
|
3768
4057
|
for (const file of files) {
|
|
3769
4058
|
if (file === "package.json" || file === "node_modules") continue;
|
|
3770
|
-
const srcPath =
|
|
3771
|
-
const destPath =
|
|
3772
|
-
const stat =
|
|
4059
|
+
const srcPath = path29.join(extractedPkgDir, file);
|
|
4060
|
+
const destPath = path29.join(targetDir, file);
|
|
4061
|
+
const stat = fs15.statSync(srcPath);
|
|
3773
4062
|
if (stat.isDirectory()) {
|
|
3774
|
-
|
|
4063
|
+
fs15.cpSync(srcPath, destPath, { recursive: true });
|
|
3775
4064
|
} else {
|
|
3776
|
-
|
|
4065
|
+
fs15.copyFileSync(srcPath, destPath);
|
|
3777
4066
|
}
|
|
3778
4067
|
}
|
|
3779
4068
|
}
|
|
3780
4069
|
}
|
|
3781
4070
|
function removeSkillContent(communityBaseDir, skillName, platforms) {
|
|
3782
4071
|
for (const platform of platforms) {
|
|
3783
|
-
const targetDir =
|
|
3784
|
-
if (
|
|
3785
|
-
|
|
4072
|
+
const targetDir = path29.join(communityBaseDir, platform, skillName);
|
|
4073
|
+
if (fs15.existsSync(targetDir)) {
|
|
4074
|
+
fs15.rmSync(targetDir, { recursive: true, force: true });
|
|
3786
4075
|
}
|
|
3787
4076
|
}
|
|
3788
4077
|
}
|
|
3789
4078
|
function cleanupTempDir(dirPath) {
|
|
3790
4079
|
try {
|
|
3791
|
-
|
|
4080
|
+
fs15.rmSync(dirPath, { recursive: true, force: true });
|
|
3792
4081
|
} catch {
|
|
3793
4082
|
}
|
|
3794
4083
|
}
|
|
@@ -3830,8 +4119,8 @@ function findDependentsOf(lockfile, targetPackageName) {
|
|
|
3830
4119
|
}
|
|
3831
4120
|
|
|
3832
4121
|
// src/registry/lockfile.ts
|
|
3833
|
-
import * as
|
|
3834
|
-
import * as
|
|
4122
|
+
import * as fs16 from "fs";
|
|
4123
|
+
import * as path30 from "path";
|
|
3835
4124
|
function createEmptyLockfile() {
|
|
3836
4125
|
return { version: 1, skills: {} };
|
|
3837
4126
|
}
|
|
@@ -3851,10 +4140,10 @@ function sortedStringify(obj) {
|
|
|
3851
4140
|
);
|
|
3852
4141
|
}
|
|
3853
4142
|
function readLockfile2(filePath) {
|
|
3854
|
-
if (!
|
|
4143
|
+
if (!fs16.existsSync(filePath)) {
|
|
3855
4144
|
return createEmptyLockfile();
|
|
3856
4145
|
}
|
|
3857
|
-
const raw =
|
|
4146
|
+
const raw = fs16.readFileSync(filePath, "utf-8");
|
|
3858
4147
|
let parsed;
|
|
3859
4148
|
try {
|
|
3860
4149
|
parsed = JSON.parse(raw);
|
|
@@ -3871,9 +4160,9 @@ function readLockfile2(filePath) {
|
|
|
3871
4160
|
return parsed;
|
|
3872
4161
|
}
|
|
3873
4162
|
function writeLockfile2(filePath, lockfile) {
|
|
3874
|
-
const dir =
|
|
3875
|
-
|
|
3876
|
-
|
|
4163
|
+
const dir = path30.dirname(filePath);
|
|
4164
|
+
fs16.mkdirSync(dir, { recursive: true });
|
|
4165
|
+
fs16.writeFileSync(filePath, sortedStringify(lockfile) + "\n", "utf-8");
|
|
3877
4166
|
}
|
|
3878
4167
|
function updateLockfileEntry(lockfile, name, entry) {
|
|
3879
4168
|
return {
|
|
@@ -3896,17 +4185,17 @@ function removeLockfileEntry(lockfile, name) {
|
|
|
3896
4185
|
}
|
|
3897
4186
|
|
|
3898
4187
|
// src/registry/bundled-skills.ts
|
|
3899
|
-
import * as
|
|
3900
|
-
import * as
|
|
4188
|
+
import * as fs17 from "fs";
|
|
4189
|
+
import * as path31 from "path";
|
|
3901
4190
|
function getBundledSkillNames(bundledSkillsDir) {
|
|
3902
|
-
if (!
|
|
4191
|
+
if (!fs17.existsSync(bundledSkillsDir)) {
|
|
3903
4192
|
return /* @__PURE__ */ new Set();
|
|
3904
4193
|
}
|
|
3905
|
-
const entries =
|
|
4194
|
+
const entries = fs17.readdirSync(bundledSkillsDir);
|
|
3906
4195
|
const names = /* @__PURE__ */ new Set();
|
|
3907
4196
|
for (const entry of entries) {
|
|
3908
4197
|
try {
|
|
3909
|
-
const stat =
|
|
4198
|
+
const stat = fs17.statSync(path31.join(bundledSkillsDir, String(entry)));
|
|
3910
4199
|
if (stat.isDirectory()) {
|
|
3911
4200
|
names.add(String(entry));
|
|
3912
4201
|
}
|
|
@@ -3933,12 +4222,12 @@ function validateSkillYaml(parsed) {
|
|
|
3933
4222
|
function resolveCommunityBase(global) {
|
|
3934
4223
|
if (global) {
|
|
3935
4224
|
const communityBase2 = resolveGlobalCommunityBaseDir();
|
|
3936
|
-
return { communityBase: communityBase2, lockfilePath:
|
|
4225
|
+
return { communityBase: communityBase2, lockfilePath: path32.join(communityBase2, "skills-lock.json") };
|
|
3937
4226
|
}
|
|
3938
4227
|
const globalDir = resolveGlobalSkillsDir();
|
|
3939
|
-
const skillsDir =
|
|
3940
|
-
const communityBase =
|
|
3941
|
-
return { communityBase, lockfilePath:
|
|
4228
|
+
const skillsDir = path32.dirname(globalDir);
|
|
4229
|
+
const communityBase = path32.join(skillsDir, "community");
|
|
4230
|
+
return { communityBase, lockfilePath: path32.join(communityBase, "skills-lock.json") };
|
|
3942
4231
|
}
|
|
3943
4232
|
function parseGitHubRef(from) {
|
|
3944
4233
|
const ghPrefix = from.match(/^github:([^/]+)\/([^#]+?)(?:#(.+))?$/);
|
|
@@ -3954,7 +4243,7 @@ function parseGitHubRef(from) {
|
|
|
3954
4243
|
return null;
|
|
3955
4244
|
}
|
|
3956
4245
|
function cloneGitHubRepo(owner, repo, ref) {
|
|
3957
|
-
const tmpDir =
|
|
4246
|
+
const tmpDir = fs18.mkdtempSync(path32.join(os5.tmpdir(), "harness-gh-install-"));
|
|
3958
4247
|
const url = `https://github.com/${owner}/${repo}.git`;
|
|
3959
4248
|
try {
|
|
3960
4249
|
const cloneArgs = ["clone", "--depth", "1"];
|
|
@@ -3975,43 +4264,43 @@ function discoverSkillDirs(rootDir) {
|
|
|
3975
4264
|
const skillDirs = [];
|
|
3976
4265
|
function scan(dir, depth) {
|
|
3977
4266
|
if (depth > 3) return;
|
|
3978
|
-
if (!
|
|
3979
|
-
if (
|
|
4267
|
+
if (!fs18.existsSync(dir)) return;
|
|
4268
|
+
if (fs18.existsSync(path32.join(dir, "skill.yaml"))) {
|
|
3980
4269
|
skillDirs.push(dir);
|
|
3981
4270
|
return;
|
|
3982
4271
|
}
|
|
3983
|
-
const entries =
|
|
4272
|
+
const entries = fs18.readdirSync(dir, { withFileTypes: true });
|
|
3984
4273
|
for (const entry of entries) {
|
|
3985
4274
|
if (!entry.isDirectory()) continue;
|
|
3986
4275
|
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
3987
|
-
scan(
|
|
4276
|
+
scan(path32.join(dir, entry.name), depth + 1);
|
|
3988
4277
|
}
|
|
3989
4278
|
}
|
|
3990
4279
|
scan(rootDir, 0);
|
|
3991
4280
|
return skillDirs;
|
|
3992
4281
|
}
|
|
3993
4282
|
function resolveLocalPkgDir(fromPath) {
|
|
3994
|
-
const resolvedPath =
|
|
3995
|
-
if (!
|
|
4283
|
+
const resolvedPath = path32.resolve(fromPath);
|
|
4284
|
+
if (!fs18.existsSync(resolvedPath)) {
|
|
3996
4285
|
throw new Error(`--from path does not exist: ${resolvedPath}`);
|
|
3997
4286
|
}
|
|
3998
|
-
const stat =
|
|
4287
|
+
const stat = fs18.statSync(resolvedPath);
|
|
3999
4288
|
if (stat.isDirectory()) {
|
|
4000
4289
|
return { pkgDir: resolvedPath, extractDir: null };
|
|
4001
4290
|
}
|
|
4002
4291
|
if (resolvedPath.endsWith(".tgz") || resolvedPath.endsWith(".tar.gz")) {
|
|
4003
|
-
const tarballBuffer =
|
|
4292
|
+
const tarballBuffer = fs18.readFileSync(resolvedPath);
|
|
4004
4293
|
const extractDir = extractTarball(tarballBuffer);
|
|
4005
|
-
return { pkgDir:
|
|
4294
|
+
return { pkgDir: path32.join(extractDir, "package"), extractDir };
|
|
4006
4295
|
}
|
|
4007
4296
|
throw new Error(`--from path must be a directory or .tgz file. Got: ${resolvedPath}`);
|
|
4008
4297
|
}
|
|
4009
4298
|
function installSkillDir(pkgDir, resolvedPath, options) {
|
|
4010
|
-
const skillYamlPath =
|
|
4011
|
-
if (!
|
|
4299
|
+
const skillYamlPath = path32.join(pkgDir, "skill.yaml");
|
|
4300
|
+
if (!fs18.existsSync(skillYamlPath)) {
|
|
4012
4301
|
throw new Error(`No skill.yaml found at ${skillYamlPath}`);
|
|
4013
4302
|
}
|
|
4014
|
-
const skillYaml = validateSkillYaml(yamlParse(
|
|
4303
|
+
const skillYaml = validateSkillYaml(yamlParse(fs18.readFileSync(skillYamlPath, "utf-8")));
|
|
4015
4304
|
const shortName = skillYaml.name;
|
|
4016
4305
|
const { communityBase, lockfilePath } = resolveCommunityBase(options.global ?? false);
|
|
4017
4306
|
if (!options.global) {
|
|
@@ -4039,7 +4328,7 @@ function installSkillDir(pkgDir, resolvedPath, options) {
|
|
|
4039
4328
|
async function runLocalInstall(fromPath, options) {
|
|
4040
4329
|
const { pkgDir, extractDir } = resolveLocalPkgDir(fromPath);
|
|
4041
4330
|
try {
|
|
4042
|
-
return installSkillDir(pkgDir,
|
|
4331
|
+
return installSkillDir(pkgDir, path32.resolve(fromPath), options);
|
|
4043
4332
|
} finally {
|
|
4044
4333
|
if (extractDir) cleanupTempDir(extractDir);
|
|
4045
4334
|
}
|
|
@@ -4082,8 +4371,8 @@ async function runInstall(skillName, options) {
|
|
|
4082
4371
|
version: installed.map((r) => r.version).join(", ")
|
|
4083
4372
|
};
|
|
4084
4373
|
}
|
|
4085
|
-
const resolvedFrom =
|
|
4086
|
-
if (
|
|
4374
|
+
const resolvedFrom = path32.resolve(options.from);
|
|
4375
|
+
if (fs18.existsSync(resolvedFrom) && fs18.statSync(resolvedFrom).isDirectory() && !fs18.existsSync(path32.join(resolvedFrom, "skill.yaml"))) {
|
|
4087
4376
|
const results = await runBulkInstall(resolvedFrom, options);
|
|
4088
4377
|
const installed = results.filter((r) => r.installed);
|
|
4089
4378
|
return {
|
|
@@ -4124,12 +4413,12 @@ async function runInstall(skillName, options) {
|
|
|
4124
4413
|
const extractDir = extractTarball(tarballBuffer);
|
|
4125
4414
|
let skillYaml;
|
|
4126
4415
|
try {
|
|
4127
|
-
const extractedPkgDir =
|
|
4128
|
-
const skillYamlPath =
|
|
4129
|
-
if (!
|
|
4416
|
+
const extractedPkgDir = path32.join(extractDir, "package");
|
|
4417
|
+
const skillYamlPath = path32.join(extractedPkgDir, "skill.yaml");
|
|
4418
|
+
if (!fs18.existsSync(skillYamlPath)) {
|
|
4130
4419
|
throw new Error(`contains invalid skill.yaml: file not found in package`);
|
|
4131
4420
|
}
|
|
4132
|
-
const rawYaml =
|
|
4421
|
+
const rawYaml = fs18.readFileSync(skillYamlPath, "utf-8");
|
|
4133
4422
|
const parsed = yamlParse(rawYaml);
|
|
4134
4423
|
skillYaml = validateSkillYaml(parsed);
|
|
4135
4424
|
placeSkillContent(extractedPkgDir, communityBase, shortName, skillYaml.platforms);
|
|
@@ -4169,7 +4458,7 @@ async function runInstall(skillName, options) {
|
|
|
4169
4458
|
return result;
|
|
4170
4459
|
}
|
|
4171
4460
|
function createInstallCommand() {
|
|
4172
|
-
const cmd = new
|
|
4461
|
+
const cmd = new Command33("install");
|
|
4173
4462
|
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
4463
|
"--from <source>",
|
|
4175
4464
|
"Install from local path, directory, or GitHub (github:owner/repo, https://github.com/owner/repo)"
|
|
@@ -4187,6 +4476,12 @@ function createInstallCommand() {
|
|
|
4187
4476
|
} else if (result.installed) {
|
|
4188
4477
|
logger.success(`Installed ${result.name}@${result.version}`);
|
|
4189
4478
|
}
|
|
4479
|
+
if (result.installed || result.upgraded) {
|
|
4480
|
+
const globalFlag = opts.global ? " --global --include-global" : "";
|
|
4481
|
+
logger.info(
|
|
4482
|
+
`Run \`harness generate-slash-commands${globalFlag}\` to register slash commands.`
|
|
4483
|
+
);
|
|
4484
|
+
}
|
|
4190
4485
|
} catch (err) {
|
|
4191
4486
|
logger.error(err instanceof Error ? err.message : String(err));
|
|
4192
4487
|
process.exit(1);
|
|
@@ -4196,15 +4491,15 @@ function createInstallCommand() {
|
|
|
4196
4491
|
}
|
|
4197
4492
|
|
|
4198
4493
|
// src/commands/install-constraints.ts
|
|
4199
|
-
import * as
|
|
4200
|
-
import * as
|
|
4201
|
-
import { Command as
|
|
4494
|
+
import * as fs19 from "fs/promises";
|
|
4495
|
+
import * as path33 from "path";
|
|
4496
|
+
import { Command as Command34 } from "commander";
|
|
4202
4497
|
import semver3 from "semver";
|
|
4203
4498
|
async function runInstallConstraints(options) {
|
|
4204
4499
|
const { source, configPath, lockfilePath } = options;
|
|
4205
4500
|
let rawBundle;
|
|
4206
4501
|
try {
|
|
4207
|
-
rawBundle = await
|
|
4502
|
+
rawBundle = await fs19.readFile(source, "utf-8");
|
|
4208
4503
|
} catch (err) {
|
|
4209
4504
|
if (isNodeError(err) && err.code === "ENOENT") {
|
|
4210
4505
|
return { ok: false, error: `Bundle file not found: ${source}` };
|
|
@@ -4247,7 +4542,7 @@ async function runInstallConstraints(options) {
|
|
|
4247
4542
|
}
|
|
4248
4543
|
let localConfig;
|
|
4249
4544
|
try {
|
|
4250
|
-
const raw = await
|
|
4545
|
+
const raw = await fs19.readFile(configPath, "utf-8");
|
|
4251
4546
|
localConfig = JSON.parse(raw);
|
|
4252
4547
|
} catch (err) {
|
|
4253
4548
|
return {
|
|
@@ -4395,7 +4690,7 @@ function isNodeError(err) {
|
|
|
4395
4690
|
return err instanceof Error && "code" in err;
|
|
4396
4691
|
}
|
|
4397
4692
|
function resolveConfigPath(opts) {
|
|
4398
|
-
if (opts.config) return
|
|
4693
|
+
if (opts.config) return path33.resolve(opts.config);
|
|
4399
4694
|
const found = findConfigFile();
|
|
4400
4695
|
if (!found.ok) {
|
|
4401
4696
|
logger.error(found.error.message);
|
|
@@ -4430,9 +4725,9 @@ function logInstallResult(val, opts) {
|
|
|
4430
4725
|
}
|
|
4431
4726
|
async function handleInstallConstraints(source, opts) {
|
|
4432
4727
|
const configPath = resolveConfigPath(opts);
|
|
4433
|
-
const projectRoot =
|
|
4434
|
-
const lockfilePath =
|
|
4435
|
-
const resolvedSource =
|
|
4728
|
+
const projectRoot = path33.dirname(configPath);
|
|
4729
|
+
const lockfilePath = path33.join(projectRoot, ".harness", "constraints.lock.json");
|
|
4730
|
+
const resolvedSource = path33.resolve(source);
|
|
4436
4731
|
if (opts.forceLocal && opts.forcePackage) {
|
|
4437
4732
|
logger.error("Cannot use both --force-local and --force-package.");
|
|
4438
4733
|
process.exit(1);
|
|
@@ -4452,18 +4747,18 @@ async function handleInstallConstraints(source, opts) {
|
|
|
4452
4747
|
logInstallResult(result.value, opts);
|
|
4453
4748
|
}
|
|
4454
4749
|
function createInstallConstraintsCommand() {
|
|
4455
|
-
const cmd = new
|
|
4750
|
+
const cmd = new Command34("install-constraints");
|
|
4456
4751
|
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
4752
|
return cmd;
|
|
4458
4753
|
}
|
|
4459
4754
|
|
|
4460
4755
|
// src/commands/integrations/index.ts
|
|
4461
|
-
import { Command as
|
|
4756
|
+
import { Command as Command39 } from "commander";
|
|
4462
4757
|
|
|
4463
4758
|
// src/commands/integrations/add.ts
|
|
4464
|
-
import { Command as
|
|
4465
|
-
import * as
|
|
4466
|
-
import * as
|
|
4759
|
+
import { Command as Command35 } from "commander";
|
|
4760
|
+
import * as fs20 from "fs";
|
|
4761
|
+
import * as path34 from "path";
|
|
4467
4762
|
import chalk4 from "chalk";
|
|
4468
4763
|
function buildMcpEntry(def) {
|
|
4469
4764
|
const entry = { command: def.mcpConfig.command };
|
|
@@ -4472,14 +4767,14 @@ function buildMcpEntry(def) {
|
|
|
4472
4767
|
return entry;
|
|
4473
4768
|
}
|
|
4474
4769
|
function writeMcpEntries(cwd, defName, mcpEntry) {
|
|
4475
|
-
writeMcpEntry(
|
|
4476
|
-
const geminiDir =
|
|
4477
|
-
if (
|
|
4478
|
-
writeMcpEntry(
|
|
4770
|
+
writeMcpEntry(path34.join(cwd, ".mcp.json"), defName, mcpEntry);
|
|
4771
|
+
const geminiDir = path34.join(cwd, ".gemini");
|
|
4772
|
+
if (fs20.existsSync(geminiDir)) {
|
|
4773
|
+
writeMcpEntry(path34.join(geminiDir, "settings.json"), defName, mcpEntry);
|
|
4479
4774
|
}
|
|
4480
4775
|
}
|
|
4481
4776
|
function updateIntegrationsConfig(cwd, defName) {
|
|
4482
|
-
const configPath =
|
|
4777
|
+
const configPath = path34.join(cwd, "harness.config.json");
|
|
4483
4778
|
const integConfig = readIntegrationsConfig(configPath);
|
|
4484
4779
|
if (!integConfig.enabled.includes(defName)) integConfig.enabled.push(defName);
|
|
4485
4780
|
integConfig.dismissed = integConfig.dismissed.filter((d) => d !== defName);
|
|
@@ -4525,7 +4820,7 @@ function printAddSuccess(value) {
|
|
|
4525
4820
|
}
|
|
4526
4821
|
}
|
|
4527
4822
|
function createAddIntegrationCommand() {
|
|
4528
|
-
return new
|
|
4823
|
+
return new Command35("add").description("Enable an MCP integration").argument("<name>", "Integration name (e.g. perplexity, augment-code)").action(async (name, _opts, cmd) => {
|
|
4529
4824
|
const globalOpts = cmd.optsWithGlobals();
|
|
4530
4825
|
const result = addIntegration(process.cwd(), name);
|
|
4531
4826
|
if (!result.ok) {
|
|
@@ -4539,8 +4834,8 @@ function createAddIntegrationCommand() {
|
|
|
4539
4834
|
}
|
|
4540
4835
|
|
|
4541
4836
|
// src/commands/integrations/list.ts
|
|
4542
|
-
import { Command as
|
|
4543
|
-
import * as
|
|
4837
|
+
import { Command as Command36 } from "commander";
|
|
4838
|
+
import * as path35 from "path";
|
|
4544
4839
|
import chalk5 from "chalk";
|
|
4545
4840
|
function printTier0Integrations(tier0, mcpServers) {
|
|
4546
4841
|
console.log(" Tier 0 (zero-config):");
|
|
@@ -4564,8 +4859,8 @@ function printTier1Integrations(tier1, mcpServers, dismissed) {
|
|
|
4564
4859
|
}
|
|
4565
4860
|
async function runListIntegrations(globalOpts) {
|
|
4566
4861
|
const cwd = process.cwd();
|
|
4567
|
-
const mcpConfig = readMcpConfig(
|
|
4568
|
-
const integConfig = readIntegrationsConfig(
|
|
4862
|
+
const mcpConfig = readMcpConfig(path35.join(cwd, ".mcp.json"));
|
|
4863
|
+
const integConfig = readIntegrationsConfig(path35.join(cwd, "harness.config.json"));
|
|
4569
4864
|
const mcpServers = mcpConfig.mcpServers ?? {};
|
|
4570
4865
|
if (globalOpts.json) {
|
|
4571
4866
|
const entries = INTEGRATION_REGISTRY.map((i) => ({
|
|
@@ -4596,13 +4891,13 @@ async function runListIntegrations(globalOpts) {
|
|
|
4596
4891
|
process.exit(ExitCode.SUCCESS);
|
|
4597
4892
|
}
|
|
4598
4893
|
function createListIntegrationsCommand() {
|
|
4599
|
-
return new
|
|
4894
|
+
return new Command36("list").description("Show all MCP integrations with status").action(async (_opts, cmd) => runListIntegrations(cmd.optsWithGlobals()));
|
|
4600
4895
|
}
|
|
4601
4896
|
|
|
4602
4897
|
// src/commands/integrations/remove.ts
|
|
4603
|
-
import { Command as
|
|
4604
|
-
import * as
|
|
4605
|
-
import * as
|
|
4898
|
+
import { Command as Command37 } from "commander";
|
|
4899
|
+
import * as fs21 from "fs";
|
|
4900
|
+
import * as path36 from "path";
|
|
4606
4901
|
function removeIntegration(cwd, name) {
|
|
4607
4902
|
const def = INTEGRATION_REGISTRY.find((i) => i.name === name);
|
|
4608
4903
|
if (!def) {
|
|
@@ -4613,21 +4908,21 @@ function removeIntegration(cwd, name) {
|
|
|
4613
4908
|
)
|
|
4614
4909
|
);
|
|
4615
4910
|
}
|
|
4616
|
-
const mcpPath =
|
|
4911
|
+
const mcpPath = path36.join(cwd, ".mcp.json");
|
|
4617
4912
|
removeMcpEntry(mcpPath, def.name);
|
|
4618
|
-
const geminiDir =
|
|
4619
|
-
if (
|
|
4620
|
-
const geminiPath =
|
|
4913
|
+
const geminiDir = path36.join(cwd, ".gemini");
|
|
4914
|
+
if (fs21.existsSync(geminiDir)) {
|
|
4915
|
+
const geminiPath = path36.join(geminiDir, "settings.json");
|
|
4621
4916
|
removeMcpEntry(geminiPath, def.name);
|
|
4622
4917
|
}
|
|
4623
|
-
const configPath =
|
|
4918
|
+
const configPath = path36.join(cwd, "harness.config.json");
|
|
4624
4919
|
const integConfig = readIntegrationsConfig(configPath);
|
|
4625
4920
|
integConfig.enabled = integConfig.enabled.filter((e) => e !== def.name);
|
|
4626
4921
|
writeIntegrationsConfig(configPath, integConfig);
|
|
4627
4922
|
return Ok(def.displayName);
|
|
4628
4923
|
}
|
|
4629
4924
|
function createRemoveIntegrationCommand() {
|
|
4630
|
-
return new
|
|
4925
|
+
return new Command37("remove").description("Remove an MCP integration").argument("<name>", "Integration name (e.g. perplexity, augment-code)").action(async (name, _opts, cmd) => {
|
|
4631
4926
|
const globalOpts = cmd.optsWithGlobals();
|
|
4632
4927
|
const cwd = process.cwd();
|
|
4633
4928
|
const result = removeIntegration(cwd, name);
|
|
@@ -4648,8 +4943,8 @@ function createRemoveIntegrationCommand() {
|
|
|
4648
4943
|
}
|
|
4649
4944
|
|
|
4650
4945
|
// src/commands/integrations/dismiss.ts
|
|
4651
|
-
import { Command as
|
|
4652
|
-
import * as
|
|
4946
|
+
import { Command as Command38 } from "commander";
|
|
4947
|
+
import * as path37 from "path";
|
|
4653
4948
|
function dismissIntegration(cwd, name) {
|
|
4654
4949
|
const def = INTEGRATION_REGISTRY.find((i) => i.name === name);
|
|
4655
4950
|
if (!def) {
|
|
@@ -4660,7 +4955,7 @@ function dismissIntegration(cwd, name) {
|
|
|
4660
4955
|
)
|
|
4661
4956
|
);
|
|
4662
4957
|
}
|
|
4663
|
-
const configPath =
|
|
4958
|
+
const configPath = path37.join(cwd, "harness.config.json");
|
|
4664
4959
|
const integConfig = readIntegrationsConfig(configPath);
|
|
4665
4960
|
if (!integConfig.dismissed.includes(def.name)) {
|
|
4666
4961
|
integConfig.dismissed.push(def.name);
|
|
@@ -4670,7 +4965,7 @@ function dismissIntegration(cwd, name) {
|
|
|
4670
4965
|
return Ok(def.displayName);
|
|
4671
4966
|
}
|
|
4672
4967
|
function createDismissIntegrationCommand() {
|
|
4673
|
-
return new
|
|
4968
|
+
return new Command38("dismiss").description("Suppress doctor recommendations for an integration").argument("<name>", "Integration name (e.g. perplexity, augment-code)").action(async (name, _opts, cmd) => {
|
|
4674
4969
|
const globalOpts = cmd.optsWithGlobals();
|
|
4675
4970
|
const cwd = process.cwd();
|
|
4676
4971
|
const result = dismissIntegration(cwd, name);
|
|
@@ -4694,7 +4989,7 @@ function createDismissIntegrationCommand() {
|
|
|
4694
4989
|
|
|
4695
4990
|
// src/commands/integrations/index.ts
|
|
4696
4991
|
function createIntegrationsCommand() {
|
|
4697
|
-
const command = new
|
|
4992
|
+
const command = new Command39("integrations").description(
|
|
4698
4993
|
"Manage MCP peer integrations (add, list, remove, dismiss)"
|
|
4699
4994
|
);
|
|
4700
4995
|
command.addCommand(createListIntegrationsCommand());
|
|
@@ -4705,13 +5000,13 @@ function createIntegrationsCommand() {
|
|
|
4705
5000
|
}
|
|
4706
5001
|
|
|
4707
5002
|
// src/commands/learnings/index.ts
|
|
4708
|
-
import { Command as
|
|
5003
|
+
import { Command as Command41 } from "commander";
|
|
4709
5004
|
|
|
4710
5005
|
// src/commands/learnings/prune.ts
|
|
4711
|
-
import { Command as
|
|
4712
|
-
import * as
|
|
5006
|
+
import { Command as Command40 } from "commander";
|
|
5007
|
+
import * as path38 from "path";
|
|
4713
5008
|
async function handlePrune(opts) {
|
|
4714
|
-
const projectPath =
|
|
5009
|
+
const projectPath = path38.resolve(opts.path);
|
|
4715
5010
|
const result = await pruneLearnings(projectPath, opts.stream);
|
|
4716
5011
|
if (!result.ok) {
|
|
4717
5012
|
logger.error(result.error.message);
|
|
@@ -4750,23 +5045,23 @@ function printPatternProposals(patterns) {
|
|
|
4750
5045
|
);
|
|
4751
5046
|
}
|
|
4752
5047
|
function createPruneCommand() {
|
|
4753
|
-
return new
|
|
5048
|
+
return new Command40("prune").description(
|
|
4754
5049
|
"Analyze global learnings for patterns, present improvement proposals, and archive old entries"
|
|
4755
5050
|
).option("--path <path>", "Project root path", ".").option("--stream <name>", "Target a specific stream").action(handlePrune);
|
|
4756
5051
|
}
|
|
4757
5052
|
|
|
4758
5053
|
// src/commands/learnings/index.ts
|
|
4759
5054
|
function createLearningsCommand() {
|
|
4760
|
-
const command = new
|
|
5055
|
+
const command = new Command41("learnings").description("Learnings management commands");
|
|
4761
5056
|
command.addCommand(createPruneCommand());
|
|
4762
5057
|
return command;
|
|
4763
5058
|
}
|
|
4764
5059
|
|
|
4765
5060
|
// src/commands/linter/index.ts
|
|
4766
|
-
import { Command as
|
|
5061
|
+
import { Command as Command44 } from "commander";
|
|
4767
5062
|
|
|
4768
5063
|
// src/commands/linter/generate.ts
|
|
4769
|
-
import { Command as
|
|
5064
|
+
import { Command as Command42 } from "commander";
|
|
4770
5065
|
function formatGenerateError(e) {
|
|
4771
5066
|
switch (e.type) {
|
|
4772
5067
|
case "parse":
|
|
@@ -4810,7 +5105,7 @@ function handleSuccess(result, useJson) {
|
|
|
4810
5105
|
Generated ${result.rulesGenerated.length} rules to ${result.outputDir}`);
|
|
4811
5106
|
}
|
|
4812
5107
|
function createGenerateCommand2() {
|
|
4813
|
-
return new
|
|
5108
|
+
return new Command42("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
5109
|
try {
|
|
4815
5110
|
if (options.verbose) logger.info(`Parsing config: ${options.config}`);
|
|
4816
5111
|
const result = await generate({
|
|
@@ -4832,9 +5127,9 @@ function createGenerateCommand2() {
|
|
|
4832
5127
|
}
|
|
4833
5128
|
|
|
4834
5129
|
// src/commands/linter/validate.ts
|
|
4835
|
-
import { Command as
|
|
5130
|
+
import { Command as Command43 } from "commander";
|
|
4836
5131
|
function createValidateCommand() {
|
|
4837
|
-
return new
|
|
5132
|
+
return new Command43("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
5133
|
try {
|
|
4839
5134
|
const result = await validate({ configPath: options.config });
|
|
4840
5135
|
if (options.json) {
|
|
@@ -4853,7 +5148,7 @@ function createValidateCommand() {
|
|
|
4853
5148
|
|
|
4854
5149
|
// src/commands/linter/index.ts
|
|
4855
5150
|
function createLinterCommand() {
|
|
4856
|
-
const linter = new
|
|
5151
|
+
const linter = new Command44("linter").description(
|
|
4857
5152
|
"Generate and validate ESLint rules from YAML config"
|
|
4858
5153
|
);
|
|
4859
5154
|
linter.addCommand(createGenerateCommand2());
|
|
@@ -4862,22 +5157,22 @@ function createLinterCommand() {
|
|
|
4862
5157
|
}
|
|
4863
5158
|
|
|
4864
5159
|
// src/commands/mcp.ts
|
|
4865
|
-
import { Command as
|
|
5160
|
+
import { Command as Command45 } from "commander";
|
|
4866
5161
|
function createMcpCommand() {
|
|
4867
|
-
return new
|
|
4868
|
-
const { startServer: startServer2 } = await import("./mcp-
|
|
5162
|
+
return new Command45("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) => {
|
|
5163
|
+
const { startServer: startServer2 } = await import("./mcp-JZG22CYT.js");
|
|
4869
5164
|
await startServer2(opts.tools);
|
|
4870
5165
|
});
|
|
4871
5166
|
}
|
|
4872
5167
|
|
|
4873
5168
|
// src/commands/orchestrator.ts
|
|
4874
|
-
import { Command as
|
|
4875
|
-
import * as
|
|
5169
|
+
import { Command as Command46 } from "commander";
|
|
5170
|
+
import * as path39 from "path";
|
|
4876
5171
|
import { Orchestrator, WorkflowLoader, launchTUI } from "@harness-engineering/orchestrator";
|
|
4877
5172
|
function createOrchestratorCommand() {
|
|
4878
|
-
const orchestrator = new
|
|
5173
|
+
const orchestrator = new Command46("orchestrator");
|
|
4879
5174
|
orchestrator.command("run").description("Run the orchestrator daemon").option("-w, --workflow <path>", "Path to WORKFLOW.md", "WORKFLOW.md").action(async (opts) => {
|
|
4880
|
-
const workflowPath =
|
|
5175
|
+
const workflowPath = path39.resolve(process.cwd(), opts.workflow);
|
|
4881
5176
|
const loader = new WorkflowLoader();
|
|
4882
5177
|
const result = await loader.loadWorkflow(workflowPath);
|
|
4883
5178
|
if (!result.ok) {
|
|
@@ -4901,13 +5196,13 @@ function createOrchestratorCommand() {
|
|
|
4901
5196
|
}
|
|
4902
5197
|
|
|
4903
5198
|
// src/commands/perf.ts
|
|
4904
|
-
import { Command as
|
|
4905
|
-
import * as
|
|
5199
|
+
import { Command as Command47 } from "commander";
|
|
5200
|
+
import * as path40 from "path";
|
|
4906
5201
|
function registerBenchCommand(perf) {
|
|
4907
5202
|
perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob, _opts, cmd) => {
|
|
4908
5203
|
const globalOpts = cmd.optsWithGlobals();
|
|
4909
5204
|
const cwd = process.cwd();
|
|
4910
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
5205
|
+
const { BenchmarkRunner } = await import("./dist-TZQUURSP.js");
|
|
4911
5206
|
const runner = new BenchmarkRunner();
|
|
4912
5207
|
const benchFiles = runner.discover(cwd, glob);
|
|
4913
5208
|
if (benchFiles.length === 0) {
|
|
@@ -4971,7 +5266,7 @@ async function runBaselinesShow(globalOpts) {
|
|
|
4971
5266
|
}
|
|
4972
5267
|
async function runBaselinesUpdate(globalOpts) {
|
|
4973
5268
|
const cwd = process.cwd();
|
|
4974
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
5269
|
+
const { BenchmarkRunner } = await import("./dist-TZQUURSP.js");
|
|
4975
5270
|
const runner = new BenchmarkRunner();
|
|
4976
5271
|
const manager = new BaselineManager(cwd);
|
|
4977
5272
|
logger.info("Running benchmarks to update baselines...");
|
|
@@ -5012,9 +5307,9 @@ function registerReportCommand(perf) {
|
|
|
5012
5307
|
perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
|
|
5013
5308
|
const globalOpts = cmd.optsWithGlobals();
|
|
5014
5309
|
const cwd = process.cwd();
|
|
5015
|
-
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-
|
|
5310
|
+
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-TZQUURSP.js");
|
|
5016
5311
|
const analyzer = new EntropyAnalyzer2({
|
|
5017
|
-
rootDir:
|
|
5312
|
+
rootDir: path40.resolve(cwd),
|
|
5018
5313
|
analyze: { complexity: true, coupling: true }
|
|
5019
5314
|
});
|
|
5020
5315
|
const result = await analyzer.analyze();
|
|
@@ -5073,7 +5368,7 @@ function registerCriticalPathsCommand(perf) {
|
|
|
5073
5368
|
});
|
|
5074
5369
|
}
|
|
5075
5370
|
function createPerfCommand() {
|
|
5076
|
-
const perf = new
|
|
5371
|
+
const perf = new Command47("perf").description("Performance benchmark and baseline management");
|
|
5077
5372
|
registerBenchCommand(perf);
|
|
5078
5373
|
registerBaselinesCommands(perf);
|
|
5079
5374
|
registerReportCommand(perf);
|
|
@@ -5082,10 +5377,10 @@ function createPerfCommand() {
|
|
|
5082
5377
|
}
|
|
5083
5378
|
|
|
5084
5379
|
// src/commands/persona/index.ts
|
|
5085
|
-
import { Command as
|
|
5380
|
+
import { Command as Command50 } from "commander";
|
|
5086
5381
|
|
|
5087
5382
|
// src/commands/persona/list.ts
|
|
5088
|
-
import { Command as
|
|
5383
|
+
import { Command as Command48 } from "commander";
|
|
5089
5384
|
function printPersonaList(personas) {
|
|
5090
5385
|
if (personas.length === 0) {
|
|
5091
5386
|
logger.info("No personas found.");
|
|
@@ -5099,7 +5394,7 @@ function printPersonaList(personas) {
|
|
|
5099
5394
|
}
|
|
5100
5395
|
}
|
|
5101
5396
|
function createListCommand2() {
|
|
5102
|
-
return new
|
|
5397
|
+
return new Command48("list").description("List available agent personas").action(async (_opts, cmd) => {
|
|
5103
5398
|
const globalOpts = cmd.optsWithGlobals();
|
|
5104
5399
|
const personasDir = resolvePersonasDir();
|
|
5105
5400
|
const result = listPersonas(personasDir);
|
|
@@ -5119,51 +5414,51 @@ function createListCommand2() {
|
|
|
5119
5414
|
}
|
|
5120
5415
|
|
|
5121
5416
|
// src/commands/persona/generate.ts
|
|
5122
|
-
import { Command as
|
|
5123
|
-
import * as
|
|
5124
|
-
import * as
|
|
5417
|
+
import { Command as Command49 } from "commander";
|
|
5418
|
+
import * as fs22 from "fs";
|
|
5419
|
+
import * as path41 from "path";
|
|
5125
5420
|
function generatePersonaArtifacts(persona, outputDir, only) {
|
|
5126
5421
|
const slug = toKebabCase(persona.name);
|
|
5127
5422
|
const generated = [];
|
|
5128
5423
|
if (!only || only === "runtime") {
|
|
5129
5424
|
const result = generateRuntime(persona);
|
|
5130
5425
|
if (result.ok) {
|
|
5131
|
-
const outPath =
|
|
5132
|
-
|
|
5133
|
-
|
|
5426
|
+
const outPath = path41.join(outputDir, `${slug}.runtime.json`);
|
|
5427
|
+
fs22.mkdirSync(path41.dirname(outPath), { recursive: true });
|
|
5428
|
+
fs22.writeFileSync(outPath, result.value);
|
|
5134
5429
|
generated.push(outPath);
|
|
5135
5430
|
}
|
|
5136
5431
|
}
|
|
5137
5432
|
if (!only || only === "agents-md") {
|
|
5138
5433
|
const result = generateAgentsMd(persona);
|
|
5139
5434
|
if (result.ok) {
|
|
5140
|
-
const outPath =
|
|
5141
|
-
|
|
5435
|
+
const outPath = path41.join(outputDir, `${slug}.agents.md`);
|
|
5436
|
+
fs22.writeFileSync(outPath, result.value);
|
|
5142
5437
|
generated.push(outPath);
|
|
5143
5438
|
}
|
|
5144
5439
|
}
|
|
5145
5440
|
if (!only || only === "ci") {
|
|
5146
5441
|
const result = generateCIWorkflow(persona, "github");
|
|
5147
5442
|
if (result.ok) {
|
|
5148
|
-
const outPath =
|
|
5149
|
-
|
|
5150
|
-
|
|
5443
|
+
const outPath = path41.join(outputDir, ".github", "workflows", `${slug}.yml`);
|
|
5444
|
+
fs22.mkdirSync(path41.dirname(outPath), { recursive: true });
|
|
5445
|
+
fs22.writeFileSync(outPath, result.value);
|
|
5151
5446
|
generated.push(outPath);
|
|
5152
5447
|
}
|
|
5153
5448
|
}
|
|
5154
5449
|
return generated;
|
|
5155
5450
|
}
|
|
5156
5451
|
function createGenerateCommand3() {
|
|
5157
|
-
return new
|
|
5452
|
+
return new Command49("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
5453
|
const globalOpts = cmd.optsWithGlobals();
|
|
5159
|
-
const personaResult = loadPersona(
|
|
5454
|
+
const personaResult = loadPersona(path41.join(resolvePersonasDir(), `${name}.yaml`));
|
|
5160
5455
|
if (!personaResult.ok) {
|
|
5161
5456
|
logger.error(personaResult.error.message);
|
|
5162
5457
|
process.exit(ExitCode.ERROR);
|
|
5163
5458
|
}
|
|
5164
5459
|
const generated = generatePersonaArtifacts(
|
|
5165
5460
|
personaResult.value,
|
|
5166
|
-
|
|
5461
|
+
path41.resolve(opts.outputDir),
|
|
5167
5462
|
opts.only
|
|
5168
5463
|
);
|
|
5169
5464
|
if (!globalOpts.quiet) {
|
|
@@ -5176,14 +5471,14 @@ function createGenerateCommand3() {
|
|
|
5176
5471
|
|
|
5177
5472
|
// src/commands/persona/index.ts
|
|
5178
5473
|
function createPersonaCommand() {
|
|
5179
|
-
const command = new
|
|
5474
|
+
const command = new Command50("persona").description("Agent persona management commands");
|
|
5180
5475
|
command.addCommand(createListCommand2());
|
|
5181
5476
|
command.addCommand(createGenerateCommand3());
|
|
5182
5477
|
return command;
|
|
5183
5478
|
}
|
|
5184
5479
|
|
|
5185
5480
|
// src/commands/predict.ts
|
|
5186
|
-
import { Command as
|
|
5481
|
+
import { Command as Command51 } from "commander";
|
|
5187
5482
|
import chalk6 from "chalk";
|
|
5188
5483
|
var CATEGORY_ORDER = [
|
|
5189
5484
|
"circular-deps",
|
|
@@ -5289,7 +5584,7 @@ function handlePredictError(err, mode) {
|
|
|
5289
5584
|
process.exit(ExitCode.ERROR);
|
|
5290
5585
|
}
|
|
5291
5586
|
function createPredictCommand() {
|
|
5292
|
-
const command = new
|
|
5587
|
+
const command = new Command51("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
5588
|
const globalOpts = cmd.optsWithGlobals();
|
|
5294
5589
|
const mode = globalOpts.json ? OutputMode.JSON : OutputMode.TEXT;
|
|
5295
5590
|
try {
|
|
@@ -5312,7 +5607,7 @@ function createPredictCommand() {
|
|
|
5312
5607
|
}
|
|
5313
5608
|
|
|
5314
5609
|
// src/commands/recommend.ts
|
|
5315
|
-
import { Command as
|
|
5610
|
+
import { Command as Command52 } from "commander";
|
|
5316
5611
|
import chalk7 from "chalk";
|
|
5317
5612
|
async function resolveSnapshot(cwd, noCache) {
|
|
5318
5613
|
if (!noCache) {
|
|
@@ -5376,7 +5671,7 @@ function printRecommendations(result) {
|
|
|
5376
5671
|
console.log("");
|
|
5377
5672
|
}
|
|
5378
5673
|
function createRecommendCommand() {
|
|
5379
|
-
const command = new
|
|
5674
|
+
const command = new Command52("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
5675
|
const globalOpts = cmd.optsWithGlobals();
|
|
5381
5676
|
const mode = globalOpts.json ? OutputMode.JSON : OutputMode.TEXT;
|
|
5382
5677
|
try {
|
|
@@ -5412,9 +5707,9 @@ function createRecommendCommand() {
|
|
|
5412
5707
|
}
|
|
5413
5708
|
|
|
5414
5709
|
// src/commands/scan-config.ts
|
|
5415
|
-
import { Command as
|
|
5416
|
-
import { existsSync as
|
|
5417
|
-
import { join as
|
|
5710
|
+
import { Command as Command53 } from "commander";
|
|
5711
|
+
import { existsSync as existsSync21, readFileSync as readFileSync11, writeFileSync as writeFileSync12 } from "fs";
|
|
5712
|
+
import { join as join32, relative as relative2 } from "path";
|
|
5418
5713
|
var CONFIG_FILES = ["CLAUDE.md", "AGENTS.md", ".gemini/settings.json", "skill.yaml"];
|
|
5419
5714
|
function stripHighSeverityPatterns(content, injectionFindings) {
|
|
5420
5715
|
const highLines = /* @__PURE__ */ new Set();
|
|
@@ -5447,7 +5742,7 @@ function applyFix(filePath, targetDir, content, injectionFindings) {
|
|
|
5447
5742
|
}
|
|
5448
5743
|
}
|
|
5449
5744
|
function scanSingleFile(filePath, targetDir, scanner, options) {
|
|
5450
|
-
if (!
|
|
5745
|
+
if (!existsSync21(filePath)) return null;
|
|
5451
5746
|
let content;
|
|
5452
5747
|
try {
|
|
5453
5748
|
content = readFileSync11(filePath, "utf8");
|
|
@@ -5471,7 +5766,7 @@ async function runScanConfig(targetDir, options) {
|
|
|
5471
5766
|
const scanner = new SecurityScanner(parseSecurityConfig({}));
|
|
5472
5767
|
const results = [];
|
|
5473
5768
|
for (const configFile of CONFIG_FILES) {
|
|
5474
|
-
const result = scanSingleFile(
|
|
5769
|
+
const result = scanSingleFile(join32(targetDir, configFile), targetDir, scanner, options);
|
|
5475
5770
|
if (result) results.push(result);
|
|
5476
5771
|
}
|
|
5477
5772
|
return { exitCode: computeScanExitCode(results), results };
|
|
@@ -5501,7 +5796,7 @@ function formatTextOutput(result) {
|
|
|
5501
5796
|
}
|
|
5502
5797
|
}
|
|
5503
5798
|
function createScanConfigCommand() {
|
|
5504
|
-
const command = new
|
|
5799
|
+
const command = new Command53("scan-config").description(
|
|
5505
5800
|
"Scan CLAUDE.md, AGENTS.md, .gemini/settings.json, and skill.yaml for prompt injection patterns"
|
|
5506
5801
|
).option("--path <dir>", "Target directory to scan (default: cwd)").option("--fix", "Strip high-severity patterns from files in-place").action(async (opts, cmd) => {
|
|
5507
5802
|
const globalOpts = cmd.optsWithGlobals();
|
|
@@ -5518,24 +5813,24 @@ function createScanConfigCommand() {
|
|
|
5518
5813
|
}
|
|
5519
5814
|
|
|
5520
5815
|
// src/commands/setup.ts
|
|
5521
|
-
import { Command as
|
|
5522
|
-
import * as
|
|
5816
|
+
import { Command as Command54 } from "commander";
|
|
5817
|
+
import * as fs24 from "fs";
|
|
5523
5818
|
import * as os7 from "os";
|
|
5524
|
-
import * as
|
|
5819
|
+
import * as path43 from "path";
|
|
5525
5820
|
import chalk8 from "chalk";
|
|
5526
5821
|
|
|
5527
5822
|
// src/utils/first-run.ts
|
|
5528
|
-
import * as
|
|
5823
|
+
import * as fs23 from "fs";
|
|
5529
5824
|
import * as os6 from "os";
|
|
5530
|
-
import * as
|
|
5531
|
-
var HARNESS_DIR =
|
|
5532
|
-
var MARKER_FILE =
|
|
5825
|
+
import * as path42 from "path";
|
|
5826
|
+
var HARNESS_DIR = path42.join(os6.homedir(), ".harness");
|
|
5827
|
+
var MARKER_FILE = path42.join(HARNESS_DIR, ".setup-complete");
|
|
5533
5828
|
function isFirstRun() {
|
|
5534
|
-
return !
|
|
5829
|
+
return !fs23.existsSync(MARKER_FILE);
|
|
5535
5830
|
}
|
|
5536
5831
|
function markSetupComplete() {
|
|
5537
|
-
|
|
5538
|
-
|
|
5832
|
+
fs23.mkdirSync(HARNESS_DIR, { recursive: true });
|
|
5833
|
+
fs23.writeFileSync(MARKER_FILE, "", "utf-8");
|
|
5539
5834
|
}
|
|
5540
5835
|
function printFirstRunWelcome() {
|
|
5541
5836
|
try {
|
|
@@ -5573,7 +5868,7 @@ function runSlashCommandGeneration() {
|
|
|
5573
5868
|
}
|
|
5574
5869
|
}
|
|
5575
5870
|
function detectClient(dirName) {
|
|
5576
|
-
return
|
|
5871
|
+
return fs24.existsSync(path43.join(os7.homedir(), dirName));
|
|
5577
5872
|
}
|
|
5578
5873
|
async function runMcpSetup(cwd) {
|
|
5579
5874
|
const results = [];
|
|
@@ -5615,7 +5910,7 @@ function formatStep(result) {
|
|
|
5615
5910
|
}
|
|
5616
5911
|
function configureTier0Integrations(cwd) {
|
|
5617
5912
|
try {
|
|
5618
|
-
const mcpPath =
|
|
5913
|
+
const mcpPath = path43.join(cwd, ".mcp.json");
|
|
5619
5914
|
const config = readMcpConfig(mcpPath);
|
|
5620
5915
|
const tier0 = INTEGRATION_REGISTRY.filter((i) => i.tier === 0);
|
|
5621
5916
|
const added = [];
|
|
@@ -5624,9 +5919,9 @@ function configureTier0Integrations(cwd) {
|
|
|
5624
5919
|
writeMcpEntry(mcpPath, integration.name, integration.mcpConfig);
|
|
5625
5920
|
added.push(integration.displayName);
|
|
5626
5921
|
}
|
|
5627
|
-
const geminiDir =
|
|
5628
|
-
if (
|
|
5629
|
-
const geminiPath =
|
|
5922
|
+
const geminiDir = path43.join(cwd, ".gemini");
|
|
5923
|
+
if (fs24.existsSync(geminiDir)) {
|
|
5924
|
+
const geminiPath = path43.join(geminiDir, "settings.json");
|
|
5630
5925
|
const geminiConfig = readMcpConfig(geminiPath);
|
|
5631
5926
|
for (const integration of tier0) {
|
|
5632
5927
|
if (!geminiConfig.mcpServers[integration.name]) {
|
|
@@ -5666,7 +5961,7 @@ async function runSetup(cwd) {
|
|
|
5666
5961
|
return { steps, success };
|
|
5667
5962
|
}
|
|
5668
5963
|
function createSetupCommand() {
|
|
5669
|
-
return new
|
|
5964
|
+
return new Command54("setup").description("Configure harness environment: slash commands, MCP, and more").action(async () => {
|
|
5670
5965
|
const cwd = process.cwd();
|
|
5671
5966
|
console.log("");
|
|
5672
5967
|
console.log(` ${chalk8.bold("harness setup")}`);
|
|
@@ -5688,15 +5983,15 @@ function createSetupCommand() {
|
|
|
5688
5983
|
}
|
|
5689
5984
|
|
|
5690
5985
|
// src/commands/share.ts
|
|
5691
|
-
import { Command as
|
|
5692
|
-
import * as
|
|
5693
|
-
import * as
|
|
5986
|
+
import { Command as Command55 } from "commander";
|
|
5987
|
+
import * as fs25 from "fs";
|
|
5988
|
+
import * as path44 from "path";
|
|
5694
5989
|
import { parse as parseYaml } from "yaml";
|
|
5695
5990
|
var MANIFEST_FILENAME = "constraints.yaml";
|
|
5696
5991
|
async function runShareAction(projectPath, options) {
|
|
5697
|
-
const rootDir =
|
|
5698
|
-
const manifestPath =
|
|
5699
|
-
if (!
|
|
5992
|
+
const rootDir = path44.resolve(projectPath);
|
|
5993
|
+
const manifestPath = path44.join(rootDir, MANIFEST_FILENAME);
|
|
5994
|
+
if (!fs25.existsSync(manifestPath)) {
|
|
5700
5995
|
logger.error(
|
|
5701
5996
|
`No ${MANIFEST_FILENAME} found at ${manifestPath}.
|
|
5702
5997
|
Create a constraints.yaml in your project root to define what to share.`
|
|
@@ -5705,7 +6000,7 @@ Create a constraints.yaml in your project root to define what to share.`
|
|
|
5705
6000
|
}
|
|
5706
6001
|
let parsed;
|
|
5707
6002
|
try {
|
|
5708
|
-
const raw =
|
|
6003
|
+
const raw = fs25.readFileSync(manifestPath, "utf-8");
|
|
5709
6004
|
parsed = parseYaml(raw);
|
|
5710
6005
|
} catch (err) {
|
|
5711
6006
|
logger.error(
|
|
@@ -5719,7 +6014,7 @@ Create a constraints.yaml in your project root to define what to share.`
|
|
|
5719
6014
|
process.exit(1);
|
|
5720
6015
|
}
|
|
5721
6016
|
const manifest = manifestResult.value;
|
|
5722
|
-
const configResult = resolveConfig(
|
|
6017
|
+
const configResult = resolveConfig(path44.join(rootDir, "harness.config.json"));
|
|
5723
6018
|
if (!configResult.ok) {
|
|
5724
6019
|
logger.error(configResult.error.message);
|
|
5725
6020
|
process.exit(1);
|
|
@@ -5737,8 +6032,8 @@ Create a constraints.yaml in your project root to define what to share.`
|
|
|
5737
6032
|
);
|
|
5738
6033
|
process.exit(1);
|
|
5739
6034
|
}
|
|
5740
|
-
const outputDir =
|
|
5741
|
-
const outputPath =
|
|
6035
|
+
const outputDir = path44.resolve(options.output);
|
|
6036
|
+
const outputPath = path44.join(outputDir, `${manifest.name}.harness-constraints.json`);
|
|
5742
6037
|
const writeResult = await writeConfig(outputPath, bundle);
|
|
5743
6038
|
if (!writeResult.ok) {
|
|
5744
6039
|
logger.error(`Failed to write bundle: ${writeResult.error.message}`);
|
|
@@ -5747,28 +6042,28 @@ Create a constraints.yaml in your project root to define what to share.`
|
|
|
5747
6042
|
logger.success(`Bundle written to ${outputPath}`);
|
|
5748
6043
|
}
|
|
5749
6044
|
function createShareCommand() {
|
|
5750
|
-
return new
|
|
6045
|
+
return new Command55("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
6046
|
await runShareAction(projectPath, options);
|
|
5752
6047
|
});
|
|
5753
6048
|
}
|
|
5754
6049
|
|
|
5755
6050
|
// src/commands/skill/index.ts
|
|
5756
|
-
import { Command as
|
|
6051
|
+
import { Command as Command63 } from "commander";
|
|
5757
6052
|
|
|
5758
6053
|
// src/commands/skill/list.ts
|
|
5759
|
-
import { Command as
|
|
5760
|
-
import * as
|
|
5761
|
-
import * as
|
|
6054
|
+
import { Command as Command56 } from "commander";
|
|
6055
|
+
import * as fs26 from "fs";
|
|
6056
|
+
import * as path45 from "path";
|
|
5762
6057
|
import { parse } from "yaml";
|
|
5763
6058
|
function scanDirectory(dirPath, source) {
|
|
5764
|
-
if (!
|
|
5765
|
-
const entries =
|
|
6059
|
+
if (!fs26.existsSync(dirPath)) return [];
|
|
6060
|
+
const entries = fs26.readdirSync(dirPath, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
5766
6061
|
const skills = [];
|
|
5767
6062
|
for (const name of entries) {
|
|
5768
|
-
const yamlPath =
|
|
5769
|
-
if (!
|
|
6063
|
+
const yamlPath = path45.join(dirPath, name, "skill.yaml");
|
|
6064
|
+
if (!fs26.existsSync(yamlPath)) continue;
|
|
5770
6065
|
try {
|
|
5771
|
-
const raw =
|
|
6066
|
+
const raw = fs26.readFileSync(yamlPath, "utf-8");
|
|
5772
6067
|
const parsed = parse(raw);
|
|
5773
6068
|
const result = SkillMetadataSchema.safeParse(parsed);
|
|
5774
6069
|
if (result.success) {
|
|
@@ -5786,10 +6081,10 @@ function scanDirectory(dirPath, source) {
|
|
|
5786
6081
|
}
|
|
5787
6082
|
function collectCommunitySkills(seen, allSkills) {
|
|
5788
6083
|
const globalDir = resolveGlobalSkillsDir();
|
|
5789
|
-
const skillsDir =
|
|
5790
|
-
const communityBase =
|
|
5791
|
-
const communityPlatformDir =
|
|
5792
|
-
const lockfilePath =
|
|
6084
|
+
const skillsDir = path45.dirname(globalDir);
|
|
6085
|
+
const communityBase = path45.join(skillsDir, "community");
|
|
6086
|
+
const communityPlatformDir = path45.join(communityBase, "claude-code");
|
|
6087
|
+
const lockfilePath = path45.join(communityBase, "skills-lock.json");
|
|
5793
6088
|
const lockfile = readLockfile2(lockfilePath);
|
|
5794
6089
|
const communitySkills = scanDirectory(communityPlatformDir, "community");
|
|
5795
6090
|
for (const skill of communitySkills) {
|
|
@@ -5859,7 +6154,7 @@ function printSkillsVerbose(skills) {
|
|
|
5859
6154
|
for (const s of skills) printSkillEntry(s);
|
|
5860
6155
|
}
|
|
5861
6156
|
function createListCommand3() {
|
|
5862
|
-
return new
|
|
6157
|
+
return new Command56("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
6158
|
const globalOpts = cmd.optsWithGlobals();
|
|
5864
6159
|
const skills = collectSkills({ filter: resolveFilter(opts) });
|
|
5865
6160
|
if (globalOpts.json) {
|
|
@@ -5874,9 +6169,9 @@ function createListCommand3() {
|
|
|
5874
6169
|
}
|
|
5875
6170
|
|
|
5876
6171
|
// src/commands/skill/run.ts
|
|
5877
|
-
import { Command as
|
|
5878
|
-
import * as
|
|
5879
|
-
import * as
|
|
6172
|
+
import { Command as Command57 } from "commander";
|
|
6173
|
+
import * as fs27 from "fs";
|
|
6174
|
+
import * as path46 from "path";
|
|
5880
6175
|
import { parse as parse2 } from "yaml";
|
|
5881
6176
|
|
|
5882
6177
|
// src/skill/complexity.ts
|
|
@@ -5972,10 +6267,10 @@ ${options.principles}`);
|
|
|
5972
6267
|
|
|
5973
6268
|
// src/commands/skill/run.ts
|
|
5974
6269
|
function loadSkillMetadata(skillDir) {
|
|
5975
|
-
const yamlPath =
|
|
5976
|
-
if (!
|
|
6270
|
+
const yamlPath = path46.join(skillDir, "skill.yaml");
|
|
6271
|
+
if (!fs27.existsSync(yamlPath)) return null;
|
|
5977
6272
|
try {
|
|
5978
|
-
const result = SkillMetadataSchema.safeParse(parse2(
|
|
6273
|
+
const result = SkillMetadataSchema.safeParse(parse2(fs27.readFileSync(yamlPath, "utf-8")));
|
|
5979
6274
|
return result.success ? result.data : null;
|
|
5980
6275
|
} catch {
|
|
5981
6276
|
return null;
|
|
@@ -5987,22 +6282,22 @@ function resolveComplexity(metadata, requested, projectPath) {
|
|
|
5987
6282
|
return requested;
|
|
5988
6283
|
}
|
|
5989
6284
|
function loadPrinciples(projectPath) {
|
|
5990
|
-
const principlesPath =
|
|
5991
|
-
return
|
|
6285
|
+
const principlesPath = path46.join(projectPath, "docs", "principles.md");
|
|
6286
|
+
return fs27.existsSync(principlesPath) ? fs27.readFileSync(principlesPath, "utf-8") : void 0;
|
|
5992
6287
|
}
|
|
5993
6288
|
function readMostRecentFileInDir(dirPath) {
|
|
5994
|
-
const files =
|
|
5995
|
-
if (files.length > 0) return
|
|
6289
|
+
const files = fs27.readdirSync(dirPath).map((f) => ({ name: f, mtime: fs27.statSync(path46.join(dirPath, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
|
|
6290
|
+
if (files.length > 0) return fs27.readFileSync(path46.join(dirPath, files[0].name), "utf-8");
|
|
5996
6291
|
return void 0;
|
|
5997
6292
|
}
|
|
5998
6293
|
function loadPriorState(metadata, projectPath) {
|
|
5999
6294
|
if (!metadata?.state.persistent || metadata.state.files.length === 0) return void 0;
|
|
6000
6295
|
for (const stateFilePath of metadata.state.files) {
|
|
6001
|
-
const fullPath =
|
|
6002
|
-
if (!
|
|
6003
|
-
const stat =
|
|
6296
|
+
const fullPath = path46.join(projectPath, stateFilePath);
|
|
6297
|
+
if (!fs27.existsSync(fullPath)) continue;
|
|
6298
|
+
const stat = fs27.statSync(fullPath);
|
|
6004
6299
|
if (stat.isDirectory()) return readMostRecentFileInDir(fullPath);
|
|
6005
|
-
return
|
|
6300
|
+
return fs27.readFileSync(fullPath, "utf-8");
|
|
6006
6301
|
}
|
|
6007
6302
|
return void 0;
|
|
6008
6303
|
}
|
|
@@ -6022,9 +6317,9 @@ function resolvePhaseState(metadata, projectPath, phase) {
|
|
|
6022
6317
|
}
|
|
6023
6318
|
function appendProjectState(content, metadata, projectPath, hasPathOpt) {
|
|
6024
6319
|
if (!metadata?.state.persistent || !hasPathOpt) return content;
|
|
6025
|
-
const stateFile =
|
|
6026
|
-
if (!
|
|
6027
|
-
const stateContent =
|
|
6320
|
+
const stateFile = path46.join(projectPath, ".harness", "state.json");
|
|
6321
|
+
if (!fs27.existsSync(stateFile)) return content;
|
|
6322
|
+
const stateContent = fs27.readFileSync(stateFile, "utf-8");
|
|
6028
6323
|
return content + `
|
|
6029
6324
|
|
|
6030
6325
|
---
|
|
@@ -6036,14 +6331,14 @@ ${stateContent}
|
|
|
6036
6331
|
}
|
|
6037
6332
|
async function runSkill(name, opts) {
|
|
6038
6333
|
const skillsDir = resolveSkillsDir();
|
|
6039
|
-
const skillDir =
|
|
6040
|
-
if (!
|
|
6334
|
+
const skillDir = path46.join(skillsDir, name);
|
|
6335
|
+
if (!fs27.existsSync(skillDir)) {
|
|
6041
6336
|
logger.error(`Skill not found: ${name}`);
|
|
6042
6337
|
process.exit(ExitCode.ERROR);
|
|
6043
6338
|
return;
|
|
6044
6339
|
}
|
|
6045
6340
|
const metadata = loadSkillMetadata(skillDir);
|
|
6046
|
-
const projectPath = opts.path ?
|
|
6341
|
+
const projectPath = opts.path ? path46.resolve(opts.path) : process.cwd();
|
|
6047
6342
|
const complexity = resolveComplexity(
|
|
6048
6343
|
metadata,
|
|
6049
6344
|
opts.complexity ?? "standard",
|
|
@@ -6070,14 +6365,14 @@ async function runSkill(name, opts) {
|
|
|
6070
6365
|
...stateWarning !== void 0 && { stateWarning },
|
|
6071
6366
|
...opts.party !== void 0 && { party: opts.party }
|
|
6072
6367
|
});
|
|
6073
|
-
const skillMdPath =
|
|
6074
|
-
if (!
|
|
6368
|
+
const skillMdPath = path46.join(skillDir, "SKILL.md");
|
|
6369
|
+
if (!fs27.existsSync(skillMdPath)) {
|
|
6075
6370
|
logger.error(`SKILL.md not found for skill: ${name}`);
|
|
6076
6371
|
process.exit(ExitCode.ERROR);
|
|
6077
6372
|
return;
|
|
6078
6373
|
}
|
|
6079
6374
|
const content = appendProjectState(
|
|
6080
|
-
|
|
6375
|
+
fs27.readFileSync(skillMdPath, "utf-8"),
|
|
6081
6376
|
metadata,
|
|
6082
6377
|
projectPath,
|
|
6083
6378
|
!!opts.path
|
|
@@ -6086,13 +6381,13 @@ async function runSkill(name, opts) {
|
|
|
6086
6381
|
process.exit(ExitCode.SUCCESS);
|
|
6087
6382
|
}
|
|
6088
6383
|
function createRunCommand2() {
|
|
6089
|
-
return new
|
|
6384
|
+
return new Command57("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
6385
|
}
|
|
6091
6386
|
|
|
6092
6387
|
// src/commands/skill/validate.ts
|
|
6093
|
-
import { Command as
|
|
6094
|
-
import * as
|
|
6095
|
-
import * as
|
|
6388
|
+
import { Command as Command58 } from "commander";
|
|
6389
|
+
import * as fs28 from "fs";
|
|
6390
|
+
import * as path47 from "path";
|
|
6096
6391
|
import { parse as parse3 } from "yaml";
|
|
6097
6392
|
var BEHAVIORAL_REQUIRED_SECTIONS = [
|
|
6098
6393
|
"## When to Use",
|
|
@@ -6104,11 +6399,11 @@ var BEHAVIORAL_REQUIRED_SECTIONS = [
|
|
|
6104
6399
|
];
|
|
6105
6400
|
var KNOWLEDGE_REQUIRED_SECTIONS = ["## Instructions"];
|
|
6106
6401
|
function validateSkillMd(name, skillMdPath, skillType, errors) {
|
|
6107
|
-
if (!
|
|
6402
|
+
if (!fs28.existsSync(skillMdPath)) {
|
|
6108
6403
|
errors.push(`${name}: missing SKILL.md`);
|
|
6109
6404
|
return;
|
|
6110
6405
|
}
|
|
6111
|
-
const mdContent =
|
|
6406
|
+
const mdContent = fs28.readFileSync(skillMdPath, "utf-8");
|
|
6112
6407
|
if (!mdContent.trim().startsWith("# ")) {
|
|
6113
6408
|
errors.push(`${name}/SKILL.md: must start with an h1 heading`);
|
|
6114
6409
|
}
|
|
@@ -6133,20 +6428,20 @@ function validateSkillMd(name, skillMdPath, skillType, errors) {
|
|
|
6133
6428
|
}
|
|
6134
6429
|
}
|
|
6135
6430
|
function validateSkillEntry(name, skillsDir, errors) {
|
|
6136
|
-
const skillDir =
|
|
6137
|
-
const yamlPath =
|
|
6138
|
-
if (!
|
|
6431
|
+
const skillDir = path47.join(skillsDir, name);
|
|
6432
|
+
const yamlPath = path47.join(skillDir, "skill.yaml");
|
|
6433
|
+
if (!fs28.existsSync(yamlPath)) {
|
|
6139
6434
|
errors.push(`${name}: missing skill.yaml`);
|
|
6140
6435
|
return false;
|
|
6141
6436
|
}
|
|
6142
6437
|
try {
|
|
6143
|
-
const raw =
|
|
6438
|
+
const raw = fs28.readFileSync(yamlPath, "utf-8");
|
|
6144
6439
|
const result = SkillMetadataSchema.safeParse(parse3(raw));
|
|
6145
6440
|
if (!result.success) {
|
|
6146
6441
|
errors.push(`${name}/skill.yaml: ${result.error.message}`);
|
|
6147
6442
|
return false;
|
|
6148
6443
|
}
|
|
6149
|
-
validateSkillMd(name,
|
|
6444
|
+
validateSkillMd(name, path47.join(skillDir, "SKILL.md"), result.data.type, errors);
|
|
6150
6445
|
return true;
|
|
6151
6446
|
} catch (e) {
|
|
6152
6447
|
errors.push(`${name}: parse error \u2014 ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -6154,15 +6449,15 @@ function validateSkillEntry(name, skillsDir, errors) {
|
|
|
6154
6449
|
}
|
|
6155
6450
|
}
|
|
6156
6451
|
function createValidateCommand2() {
|
|
6157
|
-
return new
|
|
6452
|
+
return new Command58("validate").description("Validate all skill.yaml files and SKILL.md structure").action(async (_opts, cmd) => {
|
|
6158
6453
|
const globalOpts = cmd.optsWithGlobals();
|
|
6159
6454
|
const skillsDir = resolveSkillsDir();
|
|
6160
|
-
if (!
|
|
6455
|
+
if (!fs28.existsSync(skillsDir)) {
|
|
6161
6456
|
logger.info("No skills directory found.");
|
|
6162
6457
|
process.exit(ExitCode.SUCCESS);
|
|
6163
6458
|
return;
|
|
6164
6459
|
}
|
|
6165
|
-
const entries =
|
|
6460
|
+
const entries = fs28.readdirSync(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
6166
6461
|
const errors = [];
|
|
6167
6462
|
let validated = 0;
|
|
6168
6463
|
for (const name of entries) {
|
|
@@ -6184,24 +6479,24 @@ function createValidateCommand2() {
|
|
|
6184
6479
|
}
|
|
6185
6480
|
|
|
6186
6481
|
// src/commands/skill/info.ts
|
|
6187
|
-
import { Command as
|
|
6188
|
-
import * as
|
|
6189
|
-
import * as
|
|
6482
|
+
import { Command as Command59 } from "commander";
|
|
6483
|
+
import * as fs29 from "fs";
|
|
6484
|
+
import * as path48 from "path";
|
|
6190
6485
|
import { parse as parse4 } from "yaml";
|
|
6191
6486
|
function loadSkillMetadata2(name) {
|
|
6192
6487
|
const skillsDir = resolveSkillsDir();
|
|
6193
|
-
const skillDir =
|
|
6194
|
-
if (!
|
|
6488
|
+
const skillDir = path48.join(skillsDir, name);
|
|
6489
|
+
if (!fs29.existsSync(skillDir)) {
|
|
6195
6490
|
logger.error(`Skill not found: ${name}`);
|
|
6196
6491
|
return { ok: false, exitCode: ExitCode.ERROR };
|
|
6197
6492
|
}
|
|
6198
|
-
const yamlPath =
|
|
6199
|
-
if (!
|
|
6493
|
+
const yamlPath = path48.join(skillDir, "skill.yaml");
|
|
6494
|
+
if (!fs29.existsSync(yamlPath)) {
|
|
6200
6495
|
logger.error(`skill.yaml not found for skill: ${name}`);
|
|
6201
6496
|
return { ok: false, exitCode: ExitCode.ERROR };
|
|
6202
6497
|
}
|
|
6203
6498
|
try {
|
|
6204
|
-
const raw =
|
|
6499
|
+
const raw = fs29.readFileSync(yamlPath, "utf-8");
|
|
6205
6500
|
const parsed = parse4(raw);
|
|
6206
6501
|
const result = SkillMetadataSchema.safeParse(parsed);
|
|
6207
6502
|
if (!result.success) {
|
|
@@ -6230,7 +6525,7 @@ function printSkillInfo(skill) {
|
|
|
6230
6525
|
console.log(`Persistent: ${skill.state.persistent}`);
|
|
6231
6526
|
}
|
|
6232
6527
|
function createInfoCommand() {
|
|
6233
|
-
return new
|
|
6528
|
+
return new Command59("info").description("Show metadata for a skill").argument("<name>", "Skill name (e.g., harness-tdd)").action(async (name, _opts, cmd) => {
|
|
6234
6529
|
const globalOpts = cmd.optsWithGlobals();
|
|
6235
6530
|
const loaded = loadSkillMetadata2(name);
|
|
6236
6531
|
if (!loaded.ok) {
|
|
@@ -6247,7 +6542,7 @@ function createInfoCommand() {
|
|
|
6247
6542
|
}
|
|
6248
6543
|
|
|
6249
6544
|
// src/commands/skill/search.ts
|
|
6250
|
-
import { Command as
|
|
6545
|
+
import { Command as Command60 } from "commander";
|
|
6251
6546
|
async function runSearch(query, opts) {
|
|
6252
6547
|
const results = await searchNpmRegistry(query, opts.registry);
|
|
6253
6548
|
return results.filter((r) => {
|
|
@@ -6292,15 +6587,15 @@ async function runSearchAction(query, opts, globalOpts) {
|
|
|
6292
6587
|
}
|
|
6293
6588
|
}
|
|
6294
6589
|
function createSearchCommand() {
|
|
6295
|
-
return new
|
|
6590
|
+
return new Command60("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
6591
|
await runSearchAction(query, opts, cmd.optsWithGlobals());
|
|
6297
6592
|
});
|
|
6298
6593
|
}
|
|
6299
6594
|
|
|
6300
6595
|
// src/commands/skill/create.ts
|
|
6301
|
-
import { Command as
|
|
6302
|
-
import * as
|
|
6303
|
-
import * as
|
|
6596
|
+
import { Command as Command61 } from "commander";
|
|
6597
|
+
import * as path49 from "path";
|
|
6598
|
+
import * as fs30 from "fs";
|
|
6304
6599
|
import YAML from "yaml";
|
|
6305
6600
|
var KEBAB_CASE_RE = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
|
|
6306
6601
|
function buildReadme(name, description) {
|
|
@@ -6384,22 +6679,22 @@ function runCreate(name, opts) {
|
|
|
6384
6679
|
if (!KEBAB_CASE_RE.test(name)) {
|
|
6385
6680
|
throw new Error(`Invalid skill name "${name}". Must be kebab-case (e.g., my-skill).`);
|
|
6386
6681
|
}
|
|
6387
|
-
const baseDir = opts.outputDir ??
|
|
6388
|
-
const skillDir =
|
|
6389
|
-
if (
|
|
6682
|
+
const baseDir = opts.outputDir ?? path49.join(process.cwd(), "agents", "skills", "claude-code");
|
|
6683
|
+
const skillDir = path49.join(baseDir, name);
|
|
6684
|
+
if (fs30.existsSync(skillDir)) {
|
|
6390
6685
|
throw new Error(`Skill directory already exists: ${skillDir}`);
|
|
6391
6686
|
}
|
|
6392
|
-
|
|
6687
|
+
fs30.mkdirSync(skillDir, { recursive: true });
|
|
6393
6688
|
const description = opts.description || `A community skill: ${name}`;
|
|
6394
6689
|
const skillYaml = buildSkillYaml(name, opts);
|
|
6395
|
-
const skillYamlPath =
|
|
6396
|
-
|
|
6690
|
+
const skillYamlPath = path49.join(skillDir, "skill.yaml");
|
|
6691
|
+
fs30.writeFileSync(skillYamlPath, YAML.stringify(skillYaml));
|
|
6397
6692
|
const skillMd = buildSkillMd(name, description);
|
|
6398
|
-
const skillMdPath =
|
|
6399
|
-
|
|
6693
|
+
const skillMdPath = path49.join(skillDir, "SKILL.md");
|
|
6694
|
+
fs30.writeFileSync(skillMdPath, skillMd);
|
|
6400
6695
|
const readme = buildReadme(name, description);
|
|
6401
|
-
const readmePath =
|
|
6402
|
-
|
|
6696
|
+
const readmePath = path49.join(skillDir, "README.md");
|
|
6697
|
+
fs30.writeFileSync(readmePath, readme);
|
|
6403
6698
|
return {
|
|
6404
6699
|
name,
|
|
6405
6700
|
directory: skillDir,
|
|
@@ -6413,12 +6708,12 @@ function printCreateResult(name, result) {
|
|
|
6413
6708
|
}
|
|
6414
6709
|
logger.info(`
|
|
6415
6710
|
Next steps:`);
|
|
6416
|
-
logger.info(` 1. Edit ${
|
|
6711
|
+
logger.info(` 1. Edit ${path49.join(result.directory, "SKILL.md")} with your skill content`);
|
|
6417
6712
|
logger.info(` 2. Run: harness skill validate ${name}`);
|
|
6418
6713
|
logger.info(` 3. Run: harness skills publish`);
|
|
6419
6714
|
}
|
|
6420
6715
|
function createCreateCommand() {
|
|
6421
|
-
return new
|
|
6716
|
+
return new Command61("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
6717
|
const globalOpts = cmd.optsWithGlobals();
|
|
6423
6718
|
try {
|
|
6424
6719
|
const result = runCreate(name, {
|
|
@@ -6441,26 +6736,26 @@ function createCreateCommand() {
|
|
|
6441
6736
|
}
|
|
6442
6737
|
|
|
6443
6738
|
// src/commands/skill/publish.ts
|
|
6444
|
-
import { Command as
|
|
6445
|
-
import * as
|
|
6446
|
-
import * as
|
|
6739
|
+
import { Command as Command62 } from "commander";
|
|
6740
|
+
import * as fs32 from "fs";
|
|
6741
|
+
import * as path51 from "path";
|
|
6447
6742
|
import { execFileSync as execFileSync5 } from "child_process";
|
|
6448
6743
|
|
|
6449
6744
|
// src/registry/validator.ts
|
|
6450
|
-
import * as
|
|
6451
|
-
import * as
|
|
6745
|
+
import * as fs31 from "fs";
|
|
6746
|
+
import * as path50 from "path";
|
|
6452
6747
|
import { parse as parse5 } from "yaml";
|
|
6453
6748
|
import semver4 from "semver";
|
|
6454
6749
|
async function validateForPublish(skillDir, registryUrl) {
|
|
6455
6750
|
const errors = [];
|
|
6456
|
-
const skillYamlPath =
|
|
6457
|
-
if (!
|
|
6751
|
+
const skillYamlPath = path50.join(skillDir, "skill.yaml");
|
|
6752
|
+
if (!fs31.existsSync(skillYamlPath)) {
|
|
6458
6753
|
errors.push("skill.yaml not found. Create one with: harness skill create <name>");
|
|
6459
6754
|
return { valid: false, errors };
|
|
6460
6755
|
}
|
|
6461
6756
|
let skillMeta;
|
|
6462
6757
|
try {
|
|
6463
|
-
const raw =
|
|
6758
|
+
const raw = fs31.readFileSync(skillYamlPath, "utf-8");
|
|
6464
6759
|
const parsed = parse5(raw);
|
|
6465
6760
|
const result = SkillMetadataSchema.safeParse(parsed);
|
|
6466
6761
|
if (!result.success) {
|
|
@@ -6482,11 +6777,11 @@ async function validateForPublish(skillDir, registryUrl) {
|
|
|
6482
6777
|
if (!skillMeta.triggers || skillMeta.triggers.length === 0) {
|
|
6483
6778
|
errors.push("At least one trigger is required. Add triggers to skill.yaml.");
|
|
6484
6779
|
}
|
|
6485
|
-
const skillMdPath =
|
|
6486
|
-
if (!
|
|
6780
|
+
const skillMdPath = path50.join(skillDir, "SKILL.md");
|
|
6781
|
+
if (!fs31.existsSync(skillMdPath)) {
|
|
6487
6782
|
errors.push("SKILL.md not found. Create it with content describing your skill.");
|
|
6488
6783
|
} else {
|
|
6489
|
-
const content =
|
|
6784
|
+
const content = fs31.readFileSync(skillMdPath, "utf-8");
|
|
6490
6785
|
if (!content.includes("## When to Use")) {
|
|
6491
6786
|
errors.push('SKILL.md must contain a "## When to Use" section.');
|
|
6492
6787
|
}
|
|
@@ -6566,11 +6861,11 @@ ${errorList}`);
|
|
|
6566
6861
|
}
|
|
6567
6862
|
const meta = validation.skillMeta;
|
|
6568
6863
|
const pkg = derivePackageJson(meta);
|
|
6569
|
-
const pkgPath =
|
|
6570
|
-
|
|
6571
|
-
const readmePath =
|
|
6572
|
-
if (!
|
|
6573
|
-
const skillMdContent =
|
|
6864
|
+
const pkgPath = path51.join(skillDir, "package.json");
|
|
6865
|
+
fs32.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
6866
|
+
const readmePath = path51.join(skillDir, "README.md");
|
|
6867
|
+
if (!fs32.existsSync(readmePath)) {
|
|
6868
|
+
const skillMdContent = fs32.readFileSync(path51.join(skillDir, "SKILL.md"), "utf-8");
|
|
6574
6869
|
const readme = `# ${pkg.name}
|
|
6575
6870
|
|
|
6576
6871
|
${meta.description}
|
|
@@ -6584,7 +6879,7 @@ harness install ${meta.name}
|
|
|
6584
6879
|
---
|
|
6585
6880
|
|
|
6586
6881
|
${skillMdContent}`;
|
|
6587
|
-
|
|
6882
|
+
fs32.writeFileSync(readmePath, readme);
|
|
6588
6883
|
}
|
|
6589
6884
|
if (opts.dryRun) {
|
|
6590
6885
|
return {
|
|
@@ -6610,7 +6905,7 @@ ${skillMdContent}`;
|
|
|
6610
6905
|
};
|
|
6611
6906
|
}
|
|
6612
6907
|
function createPublishCommand() {
|
|
6613
|
-
return new
|
|
6908
|
+
return new Command62("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
6909
|
const globalOpts = cmd.optsWithGlobals();
|
|
6615
6910
|
const skillDir = opts.dir || process.cwd();
|
|
6616
6911
|
try {
|
|
@@ -6635,7 +6930,7 @@ function createPublishCommand() {
|
|
|
6635
6930
|
|
|
6636
6931
|
// src/commands/skill/index.ts
|
|
6637
6932
|
function createSkillCommand() {
|
|
6638
|
-
const command = new
|
|
6933
|
+
const command = new Command63("skill").description("Skill management commands");
|
|
6639
6934
|
command.addCommand(createListCommand3());
|
|
6640
6935
|
command.addCommand(createRunCommand2());
|
|
6641
6936
|
command.addCommand(createValidateCommand2());
|
|
@@ -6647,7 +6942,7 @@ function createSkillCommand() {
|
|
|
6647
6942
|
}
|
|
6648
6943
|
|
|
6649
6944
|
// src/commands/snapshot.ts
|
|
6650
|
-
import { Command as
|
|
6945
|
+
import { Command as Command64 } from "commander";
|
|
6651
6946
|
import { execSync as execSync5 } from "child_process";
|
|
6652
6947
|
import chalk9 from "chalk";
|
|
6653
6948
|
function getCommitHash3(cwd) {
|
|
@@ -6829,7 +7124,7 @@ function registerListCommand(parent) {
|
|
|
6829
7124
|
});
|
|
6830
7125
|
}
|
|
6831
7126
|
function createSnapshotCommand() {
|
|
6832
|
-
const command = new
|
|
7127
|
+
const command = new Command64("snapshot").description("Architecture timeline snapshot commands");
|
|
6833
7128
|
registerCaptureCommand(command);
|
|
6834
7129
|
registerTrendsCommand(command);
|
|
6835
7130
|
registerListCommand(command);
|
|
@@ -6837,11 +7132,11 @@ function createSnapshotCommand() {
|
|
|
6837
7132
|
}
|
|
6838
7133
|
|
|
6839
7134
|
// src/commands/state/index.ts
|
|
6840
|
-
import { Command as
|
|
7135
|
+
import { Command as Command69 } from "commander";
|
|
6841
7136
|
|
|
6842
7137
|
// src/commands/state/show.ts
|
|
6843
|
-
import { Command as
|
|
6844
|
-
import * as
|
|
7138
|
+
import { Command as Command65 } from "commander";
|
|
7139
|
+
import * as path52 from "path";
|
|
6845
7140
|
function printStateText(state, stream) {
|
|
6846
7141
|
if (stream) console.log(`Stream: ${stream}`);
|
|
6847
7142
|
console.log(`Schema Version: ${state.schemaVersion}`);
|
|
@@ -6865,9 +7160,9 @@ function printStateProgress(progress) {
|
|
|
6865
7160
|
}
|
|
6866
7161
|
}
|
|
6867
7162
|
function createShowCommand() {
|
|
6868
|
-
return new
|
|
7163
|
+
return new Command65("show").description("Show current project state").option("--path <path>", "Project root path", ".").option("--stream <name>", "Target a specific stream").action(async (opts, cmd) => {
|
|
6869
7164
|
const globalOpts = cmd.optsWithGlobals();
|
|
6870
|
-
const result = await loadState(
|
|
7165
|
+
const result = await loadState(path52.resolve(opts.path), opts.stream);
|
|
6871
7166
|
if (!result.ok) {
|
|
6872
7167
|
logger.error(result.error.message);
|
|
6873
7168
|
process.exit(ExitCode.ERROR);
|
|
@@ -6882,9 +7177,9 @@ function createShowCommand() {
|
|
|
6882
7177
|
}
|
|
6883
7178
|
|
|
6884
7179
|
// src/commands/state/reset.ts
|
|
6885
|
-
import { Command as
|
|
6886
|
-
import * as
|
|
6887
|
-
import * as
|
|
7180
|
+
import { Command as Command66 } from "commander";
|
|
7181
|
+
import * as fs33 from "fs";
|
|
7182
|
+
import * as path53 from "path";
|
|
6888
7183
|
import * as readline from "readline";
|
|
6889
7184
|
async function resolveStatePath(projectPath, stream) {
|
|
6890
7185
|
if (stream) {
|
|
@@ -6893,22 +7188,22 @@ async function resolveStatePath(projectPath, stream) {
|
|
|
6893
7188
|
logger.error(streamResult.error.message);
|
|
6894
7189
|
process.exit(ExitCode.ERROR);
|
|
6895
7190
|
}
|
|
6896
|
-
return
|
|
7191
|
+
return path53.join(streamResult.value, "state.json");
|
|
6897
7192
|
}
|
|
6898
|
-
return
|
|
7193
|
+
return path53.join(projectPath, ".harness", "state.json");
|
|
6899
7194
|
}
|
|
6900
7195
|
async function confirmReset() {
|
|
6901
7196
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
6902
|
-
const answer = await new Promise((
|
|
6903
|
-
rl.question("Reset project state? This cannot be undone. [y/N] ",
|
|
7197
|
+
const answer = await new Promise((resolve33) => {
|
|
7198
|
+
rl.question("Reset project state? This cannot be undone. [y/N] ", resolve33);
|
|
6904
7199
|
});
|
|
6905
7200
|
rl.close();
|
|
6906
7201
|
return answer.toLowerCase() === "y" || answer.toLowerCase() === "yes";
|
|
6907
7202
|
}
|
|
6908
7203
|
async function runReset(opts) {
|
|
6909
|
-
const projectPath =
|
|
7204
|
+
const projectPath = path53.resolve(opts.path);
|
|
6910
7205
|
const statePath = await resolveStatePath(projectPath, opts.stream);
|
|
6911
|
-
if (!
|
|
7206
|
+
if (!fs33.existsSync(statePath)) {
|
|
6912
7207
|
logger.info("No state file found. Nothing to reset.");
|
|
6913
7208
|
process.exit(ExitCode.SUCCESS);
|
|
6914
7209
|
}
|
|
@@ -6917,7 +7212,7 @@ async function runReset(opts) {
|
|
|
6917
7212
|
process.exit(ExitCode.SUCCESS);
|
|
6918
7213
|
}
|
|
6919
7214
|
try {
|
|
6920
|
-
|
|
7215
|
+
fs33.unlinkSync(statePath);
|
|
6921
7216
|
logger.success("Project state reset.");
|
|
6922
7217
|
} catch (e) {
|
|
6923
7218
|
logger.error(`Failed to reset state: ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -6926,15 +7221,15 @@ async function runReset(opts) {
|
|
|
6926
7221
|
process.exit(ExitCode.SUCCESS);
|
|
6927
7222
|
}
|
|
6928
7223
|
function createResetCommand() {
|
|
6929
|
-
return new
|
|
7224
|
+
return new Command66("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
7225
|
}
|
|
6931
7226
|
|
|
6932
7227
|
// src/commands/state/learn.ts
|
|
6933
|
-
import { Command as
|
|
6934
|
-
import * as
|
|
7228
|
+
import { Command as Command67 } from "commander";
|
|
7229
|
+
import * as path54 from "path";
|
|
6935
7230
|
function createLearnCommand() {
|
|
6936
|
-
return new
|
|
6937
|
-
const projectPath =
|
|
7231
|
+
return new Command67("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) => {
|
|
7232
|
+
const projectPath = path54.resolve(opts.path);
|
|
6938
7233
|
const result = await appendLearning(projectPath, message, void 0, void 0, opts.stream);
|
|
6939
7234
|
if (!result.ok) {
|
|
6940
7235
|
logger.error(result.error.message);
|
|
@@ -6947,10 +7242,10 @@ function createLearnCommand() {
|
|
|
6947
7242
|
}
|
|
6948
7243
|
|
|
6949
7244
|
// src/commands/state/streams.ts
|
|
6950
|
-
import { Command as
|
|
6951
|
-
import * as
|
|
7245
|
+
import { Command as Command68 } from "commander";
|
|
7246
|
+
import * as path55 from "path";
|
|
6952
7247
|
async function runListStreams(opts, globalOpts) {
|
|
6953
|
-
const projectPath =
|
|
7248
|
+
const projectPath = path55.resolve(opts.path);
|
|
6954
7249
|
const indexResult = await loadStreamIndex(projectPath);
|
|
6955
7250
|
const result = await listStreams(projectPath);
|
|
6956
7251
|
if (!result.ok) {
|
|
@@ -6971,7 +7266,7 @@ async function runListStreams(opts, globalOpts) {
|
|
|
6971
7266
|
process.exit(ExitCode.SUCCESS);
|
|
6972
7267
|
}
|
|
6973
7268
|
async function runCreateStream(name, opts) {
|
|
6974
|
-
const result = await createStream(
|
|
7269
|
+
const result = await createStream(path55.resolve(opts.path), name, opts.branch);
|
|
6975
7270
|
if (!result.ok) {
|
|
6976
7271
|
logger.error(result.error.message);
|
|
6977
7272
|
process.exit(ExitCode.ERROR);
|
|
@@ -6980,7 +7275,7 @@ async function runCreateStream(name, opts) {
|
|
|
6980
7275
|
process.exit(ExitCode.SUCCESS);
|
|
6981
7276
|
}
|
|
6982
7277
|
async function runArchiveStream(name, opts) {
|
|
6983
|
-
const result = await archiveStream(
|
|
7278
|
+
const result = await archiveStream(path55.resolve(opts.path), name);
|
|
6984
7279
|
if (!result.ok) {
|
|
6985
7280
|
logger.error(result.error.message);
|
|
6986
7281
|
process.exit(ExitCode.ERROR);
|
|
@@ -6989,7 +7284,7 @@ async function runArchiveStream(name, opts) {
|
|
|
6989
7284
|
process.exit(ExitCode.SUCCESS);
|
|
6990
7285
|
}
|
|
6991
7286
|
async function runActivateStream(name, opts) {
|
|
6992
|
-
const result = await setActiveStream(
|
|
7287
|
+
const result = await setActiveStream(path55.resolve(opts.path), name);
|
|
6993
7288
|
if (!result.ok) {
|
|
6994
7289
|
logger.error(result.error.message);
|
|
6995
7290
|
process.exit(ExitCode.ERROR);
|
|
@@ -6998,7 +7293,7 @@ async function runActivateStream(name, opts) {
|
|
|
6998
7293
|
process.exit(ExitCode.SUCCESS);
|
|
6999
7294
|
}
|
|
7000
7295
|
function createStreamsCommand() {
|
|
7001
|
-
const command = new
|
|
7296
|
+
const command = new Command68("streams").description("Manage state streams");
|
|
7002
7297
|
command.command("list").description("List all known streams").option("--path <path>", "Project root path", ".").action(async (opts, cmd) => runListStreams(opts, cmd.optsWithGlobals()));
|
|
7003
7298
|
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
7299
|
command.command("archive <name>").description("Archive a stream").option("--path <path>", "Project root path", ".").action(async (name, opts) => runArchiveStream(name, opts));
|
|
@@ -7008,7 +7303,7 @@ function createStreamsCommand() {
|
|
|
7008
7303
|
|
|
7009
7304
|
// src/commands/state/index.ts
|
|
7010
7305
|
function createStateCommand() {
|
|
7011
|
-
const command = new
|
|
7306
|
+
const command = new Command69("state").description("Project state management commands");
|
|
7012
7307
|
command.addCommand(createShowCommand());
|
|
7013
7308
|
command.addCommand(createResetCommand());
|
|
7014
7309
|
command.addCommand(createLearnCommand());
|
|
@@ -7017,7 +7312,7 @@ function createStateCommand() {
|
|
|
7017
7312
|
}
|
|
7018
7313
|
|
|
7019
7314
|
// src/commands/taint.ts
|
|
7020
|
-
import { Command as
|
|
7315
|
+
import { Command as Command70 } from "commander";
|
|
7021
7316
|
function getProjectRoot() {
|
|
7022
7317
|
return process.cwd();
|
|
7023
7318
|
}
|
|
@@ -7089,14 +7384,143 @@ function registerStatusCommand(taint) {
|
|
|
7089
7384
|
});
|
|
7090
7385
|
}
|
|
7091
7386
|
function createTaintCommand() {
|
|
7092
|
-
const taint = new
|
|
7387
|
+
const taint = new Command70("taint").description("Manage sentinel session taint state");
|
|
7093
7388
|
registerClearCommand(taint);
|
|
7094
7389
|
registerStatusCommand(taint);
|
|
7095
7390
|
return taint;
|
|
7096
7391
|
}
|
|
7097
7392
|
|
|
7393
|
+
// src/commands/telemetry/index.ts
|
|
7394
|
+
import { Command as Command73 } from "commander";
|
|
7395
|
+
|
|
7396
|
+
// src/commands/telemetry/identify.ts
|
|
7397
|
+
import { Command as Command71 } from "commander";
|
|
7398
|
+
import * as fs34 from "fs";
|
|
7399
|
+
import * as path56 from "path";
|
|
7400
|
+
function telemetryFilePath(cwd) {
|
|
7401
|
+
return path56.join(cwd, ".harness", "telemetry.json");
|
|
7402
|
+
}
|
|
7403
|
+
function writeTelemetryFile(cwd, data) {
|
|
7404
|
+
const filePath = telemetryFilePath(cwd);
|
|
7405
|
+
const dir = path56.dirname(filePath);
|
|
7406
|
+
fs34.mkdirSync(dir, { recursive: true });
|
|
7407
|
+
fs34.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8");
|
|
7408
|
+
}
|
|
7409
|
+
var IDENTITY_FIELDS = ["project", "team", "alias"];
|
|
7410
|
+
function applyIdentityFields(opts, identity) {
|
|
7411
|
+
for (const field of IDENTITY_FIELDS) {
|
|
7412
|
+
if (opts[field]) identity[field] = opts[field];
|
|
7413
|
+
}
|
|
7414
|
+
}
|
|
7415
|
+
function printIdentity(identity) {
|
|
7416
|
+
for (const field of IDENTITY_FIELDS) {
|
|
7417
|
+
if (identity[field]) logger.info(` ${field.padEnd(7)}: ${identity[field]}`);
|
|
7418
|
+
}
|
|
7419
|
+
}
|
|
7420
|
+
function createIdentifyCommand() {
|
|
7421
|
+
const cmd = new Command71("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) => {
|
|
7422
|
+
const cwd = process.cwd();
|
|
7423
|
+
if (opts.clear) {
|
|
7424
|
+
writeTelemetryFile(cwd, { identity: {} });
|
|
7425
|
+
logger.success("Telemetry identity cleared.");
|
|
7426
|
+
return;
|
|
7427
|
+
}
|
|
7428
|
+
const hasField = IDENTITY_FIELDS.some((f) => opts[f]);
|
|
7429
|
+
if (!hasField) {
|
|
7430
|
+
logger.error("Provide at least one of --project, --team, --alias, or --clear.");
|
|
7431
|
+
process.exitCode = 1;
|
|
7432
|
+
return;
|
|
7433
|
+
}
|
|
7434
|
+
const existingIdentity = readIdentity(cwd);
|
|
7435
|
+
const existing = { identity: { ...existingIdentity } };
|
|
7436
|
+
applyIdentityFields(opts, existing.identity);
|
|
7437
|
+
writeTelemetryFile(cwd, existing);
|
|
7438
|
+
logger.success("Telemetry identity updated:");
|
|
7439
|
+
printIdentity(existing.identity);
|
|
7440
|
+
});
|
|
7441
|
+
return cmd;
|
|
7442
|
+
}
|
|
7443
|
+
|
|
7444
|
+
// src/commands/telemetry/status.ts
|
|
7445
|
+
import { Command as Command72 } from "commander";
|
|
7446
|
+
function gatherEnvOverrides() {
|
|
7447
|
+
const overrides = {};
|
|
7448
|
+
if (process.env.DO_NOT_TRACK) overrides.DO_NOT_TRACK = process.env.DO_NOT_TRACK;
|
|
7449
|
+
if (process.env.HARNESS_TELEMETRY_OPTOUT)
|
|
7450
|
+
overrides.HARNESS_TELEMETRY_OPTOUT = process.env.HARNESS_TELEMETRY_OPTOUT;
|
|
7451
|
+
return overrides;
|
|
7452
|
+
}
|
|
7453
|
+
function resolveDisabledReason() {
|
|
7454
|
+
if (process.env.DO_NOT_TRACK === "1") return "DO_NOT_TRACK=1";
|
|
7455
|
+
if (process.env.HARNESS_TELEMETRY_OPTOUT === "1") return "HARNESS_TELEMETRY_OPTOUT=1";
|
|
7456
|
+
return "telemetry.enabled is false in config";
|
|
7457
|
+
}
|
|
7458
|
+
function printHumanStatus(result) {
|
|
7459
|
+
logger.info(`Telemetry: ${result.consent.allowed ? "enabled" : "disabled"}`);
|
|
7460
|
+
if (!result.consent.allowed && result.consent.reason) {
|
|
7461
|
+
logger.info(` Reason: ${result.consent.reason}`);
|
|
7462
|
+
}
|
|
7463
|
+
logger.info(`Install ID: ${result.installId ?? "not yet created"}`);
|
|
7464
|
+
const { identity } = result;
|
|
7465
|
+
const hasIdentity = identity.project || identity.team || identity.alias;
|
|
7466
|
+
if (hasIdentity) {
|
|
7467
|
+
logger.info("Identity:");
|
|
7468
|
+
for (const [key, value] of Object.entries(identity)) {
|
|
7469
|
+
if (value) logger.info(` ${key.padEnd(7)}: ${value}`);
|
|
7470
|
+
}
|
|
7471
|
+
} else {
|
|
7472
|
+
logger.info("Identity: not configured");
|
|
7473
|
+
}
|
|
7474
|
+
const overrideKeys = Object.keys(result.envOverrides);
|
|
7475
|
+
if (overrideKeys.length > 0) {
|
|
7476
|
+
logger.info("Env overrides:");
|
|
7477
|
+
for (const key of overrideKeys) {
|
|
7478
|
+
logger.info(` ${key}=${result.envOverrides[key]}`);
|
|
7479
|
+
}
|
|
7480
|
+
}
|
|
7481
|
+
}
|
|
7482
|
+
function createStatusCommand() {
|
|
7483
|
+
const cmd = new Command72("status").description("Show current telemetry consent state, install ID, and identity").option("--json", "Output as JSON").action((opts) => {
|
|
7484
|
+
const cwd = process.cwd();
|
|
7485
|
+
const envOverrides = gatherEnvOverrides();
|
|
7486
|
+
const consent = resolveConsent(cwd, void 0);
|
|
7487
|
+
let installId = null;
|
|
7488
|
+
let identity = {};
|
|
7489
|
+
if (consent.allowed) {
|
|
7490
|
+
identity = readIdentity(cwd);
|
|
7491
|
+
try {
|
|
7492
|
+
installId = getOrCreateInstallId(cwd);
|
|
7493
|
+
} catch {
|
|
7494
|
+
}
|
|
7495
|
+
}
|
|
7496
|
+
const result = {
|
|
7497
|
+
consent: {
|
|
7498
|
+
allowed: consent.allowed,
|
|
7499
|
+
...!consent.allowed ? { reason: resolveDisabledReason() } : {}
|
|
7500
|
+
},
|
|
7501
|
+
installId,
|
|
7502
|
+
identity,
|
|
7503
|
+
envOverrides
|
|
7504
|
+
};
|
|
7505
|
+
if (opts.json) {
|
|
7506
|
+
console.log(JSON.stringify(result, null, 2));
|
|
7507
|
+
return;
|
|
7508
|
+
}
|
|
7509
|
+
printHumanStatus(result);
|
|
7510
|
+
});
|
|
7511
|
+
return cmd;
|
|
7512
|
+
}
|
|
7513
|
+
|
|
7514
|
+
// src/commands/telemetry/index.ts
|
|
7515
|
+
function createTelemetryCommand() {
|
|
7516
|
+
const command = new Command73("telemetry").description("Telemetry identity and status management");
|
|
7517
|
+
command.addCommand(createIdentifyCommand());
|
|
7518
|
+
command.addCommand(createStatusCommand());
|
|
7519
|
+
return command;
|
|
7520
|
+
}
|
|
7521
|
+
|
|
7098
7522
|
// src/commands/traceability.ts
|
|
7099
|
-
import { Command as
|
|
7523
|
+
import { Command as Command74 } from "commander";
|
|
7100
7524
|
import chalk10 from "chalk";
|
|
7101
7525
|
function confidenceLabel(maxConfidence) {
|
|
7102
7526
|
if (maxConfidence >= 0.8) return "explicit";
|
|
@@ -7212,7 +7636,7 @@ async function runTraceability(options) {
|
|
|
7212
7636
|
const projectPath = process.cwd();
|
|
7213
7637
|
const store = await loadGraphStore(projectPath);
|
|
7214
7638
|
if (!store) handleNoStore(mode);
|
|
7215
|
-
const graphModule = await import("./dist-
|
|
7639
|
+
const graphModule = await import("./dist-QW5G3GX3.js");
|
|
7216
7640
|
const filterOptions = buildFilterOptions(options);
|
|
7217
7641
|
const results = graphModule.queryTraceability(store, filterOptions);
|
|
7218
7642
|
if (results.length === 0) handleEmptyResults(mode);
|
|
@@ -7227,7 +7651,7 @@ async function runTraceability(options) {
|
|
|
7227
7651
|
process.exit(ExitCode.SUCCESS);
|
|
7228
7652
|
}
|
|
7229
7653
|
function createTraceabilityCommand() {
|
|
7230
|
-
return new
|
|
7654
|
+
return new Command74("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
7655
|
const globalOpts = cmd.optsWithGlobals();
|
|
7232
7656
|
await runTraceability({
|
|
7233
7657
|
spec: opts.spec,
|
|
@@ -7240,15 +7664,15 @@ function createTraceabilityCommand() {
|
|
|
7240
7664
|
}
|
|
7241
7665
|
|
|
7242
7666
|
// src/commands/uninstall.ts
|
|
7243
|
-
import * as
|
|
7244
|
-
import { Command as
|
|
7667
|
+
import * as path57 from "path";
|
|
7668
|
+
import { Command as Command75 } from "commander";
|
|
7245
7669
|
async function runUninstall(skillName, options) {
|
|
7246
7670
|
const packageName = resolvePackageName(skillName);
|
|
7247
7671
|
const shortName = extractSkillName(packageName);
|
|
7248
7672
|
const globalDir = resolveGlobalSkillsDir();
|
|
7249
|
-
const skillsDir =
|
|
7250
|
-
const communityBase =
|
|
7251
|
-
const lockfilePath =
|
|
7673
|
+
const skillsDir = path57.dirname(globalDir);
|
|
7674
|
+
const communityBase = path57.join(skillsDir, "community");
|
|
7675
|
+
const lockfilePath = path57.join(communityBase, "skills-lock.json");
|
|
7252
7676
|
const lockfile = readLockfile2(lockfilePath);
|
|
7253
7677
|
const entry = lockfile.skills[packageName];
|
|
7254
7678
|
if (!entry) {
|
|
@@ -7278,7 +7702,7 @@ async function runUninstall(skillName, options) {
|
|
|
7278
7702
|
return result;
|
|
7279
7703
|
}
|
|
7280
7704
|
function createUninstallCommand() {
|
|
7281
|
-
const cmd = new
|
|
7705
|
+
const cmd = new Command75("uninstall");
|
|
7282
7706
|
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
7707
|
try {
|
|
7284
7708
|
const result = await runUninstall(skill, opts);
|
|
@@ -7297,9 +7721,9 @@ function createUninstallCommand() {
|
|
|
7297
7721
|
}
|
|
7298
7722
|
|
|
7299
7723
|
// src/commands/uninstall-constraints.ts
|
|
7300
|
-
import * as
|
|
7301
|
-
import * as
|
|
7302
|
-
import { Command as
|
|
7724
|
+
import * as fs35 from "fs/promises";
|
|
7725
|
+
import * as path58 from "path";
|
|
7726
|
+
import { Command as Command76 } from "commander";
|
|
7303
7727
|
async function runUninstallConstraints(options) {
|
|
7304
7728
|
const { packageName, configPath, lockfilePath } = options;
|
|
7305
7729
|
const lockfileResult = await readLockfile(lockfilePath);
|
|
@@ -7319,7 +7743,7 @@ async function runUninstallConstraints(options) {
|
|
|
7319
7743
|
}
|
|
7320
7744
|
let localConfig;
|
|
7321
7745
|
try {
|
|
7322
|
-
const raw = await
|
|
7746
|
+
const raw = await fs35.readFile(configPath, "utf-8");
|
|
7323
7747
|
localConfig = JSON.parse(raw);
|
|
7324
7748
|
} catch (err) {
|
|
7325
7749
|
return {
|
|
@@ -7356,11 +7780,11 @@ async function runUninstallConstraints(options) {
|
|
|
7356
7780
|
};
|
|
7357
7781
|
}
|
|
7358
7782
|
function createUninstallConstraintsCommand() {
|
|
7359
|
-
const cmd = new
|
|
7783
|
+
const cmd = new Command76("uninstall-constraints");
|
|
7360
7784
|
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
7785
|
let configPath;
|
|
7362
7786
|
if (opts.config) {
|
|
7363
|
-
configPath =
|
|
7787
|
+
configPath = path58.resolve(opts.config);
|
|
7364
7788
|
} else {
|
|
7365
7789
|
const found = findConfigFile();
|
|
7366
7790
|
if (!found.ok) {
|
|
@@ -7369,8 +7793,8 @@ function createUninstallConstraintsCommand() {
|
|
|
7369
7793
|
}
|
|
7370
7794
|
configPath = found.value;
|
|
7371
7795
|
}
|
|
7372
|
-
const projectRoot =
|
|
7373
|
-
const lockfilePath =
|
|
7796
|
+
const projectRoot = path58.dirname(configPath);
|
|
7797
|
+
const lockfilePath = path58.join(projectRoot, ".harness", "constraints.lock.json");
|
|
7374
7798
|
const result = await runUninstallConstraints({
|
|
7375
7799
|
packageName: name,
|
|
7376
7800
|
configPath,
|
|
@@ -7395,9 +7819,10 @@ function createUninstallConstraintsCommand() {
|
|
|
7395
7819
|
}
|
|
7396
7820
|
|
|
7397
7821
|
// src/commands/update.ts
|
|
7398
|
-
import { Command as
|
|
7399
|
-
import { execFileSync as execFileSync6 } from "child_process";
|
|
7822
|
+
import { Command as Command77 } from "commander";
|
|
7823
|
+
import { execFile, execFileSync as execFileSync6 } from "child_process";
|
|
7400
7824
|
import { realpathSync } from "fs";
|
|
7825
|
+
import { promisify } from "util";
|
|
7401
7826
|
import readline2 from "readline";
|
|
7402
7827
|
import chalk11 from "chalk";
|
|
7403
7828
|
function detectPackageManager() {
|
|
@@ -7417,25 +7842,32 @@ function detectPackageManager() {
|
|
|
7417
7842
|
}
|
|
7418
7843
|
return "npm";
|
|
7419
7844
|
}
|
|
7420
|
-
|
|
7421
|
-
|
|
7845
|
+
var execFileAsync = promisify(execFile);
|
|
7846
|
+
async function getLatestVersionAsync(pkg) {
|
|
7847
|
+
const { stdout } = await execFileAsync("npm", ["view", pkg, "dist-tags.latest"], {
|
|
7422
7848
|
encoding: "utf-8",
|
|
7423
7849
|
timeout: 15e3
|
|
7424
7850
|
});
|
|
7425
|
-
return
|
|
7851
|
+
return stdout.trim();
|
|
7426
7852
|
}
|
|
7427
|
-
function
|
|
7853
|
+
function getInstalledVersions(pm, packages) {
|
|
7854
|
+
const versions = {};
|
|
7428
7855
|
try {
|
|
7429
|
-
const output = execFileSync6(pm, ["list", "-g", "
|
|
7856
|
+
const output = execFileSync6(pm, ["list", "-g", "--json"], {
|
|
7430
7857
|
encoding: "utf-8",
|
|
7431
7858
|
timeout: 15e3
|
|
7432
7859
|
});
|
|
7433
7860
|
const data = JSON.parse(output);
|
|
7434
7861
|
const deps = data.dependencies ?? {};
|
|
7435
|
-
|
|
7862
|
+
for (const pkg of packages) {
|
|
7863
|
+
versions[pkg] = deps[pkg]?.version ?? null;
|
|
7864
|
+
}
|
|
7436
7865
|
} catch {
|
|
7437
|
-
|
|
7866
|
+
for (const pkg of packages) {
|
|
7867
|
+
versions[pkg] = null;
|
|
7868
|
+
}
|
|
7438
7869
|
}
|
|
7870
|
+
return versions;
|
|
7439
7871
|
}
|
|
7440
7872
|
function getInstalledPackages(pm) {
|
|
7441
7873
|
try {
|
|
@@ -7455,10 +7887,10 @@ function prompt(question) {
|
|
|
7455
7887
|
input: process.stdin,
|
|
7456
7888
|
output: process.stdout
|
|
7457
7889
|
});
|
|
7458
|
-
return new Promise((
|
|
7890
|
+
return new Promise((resolve33) => {
|
|
7459
7891
|
rl.question(question, (answer) => {
|
|
7460
7892
|
rl.close();
|
|
7461
|
-
|
|
7893
|
+
resolve33(answer.trim().toLowerCase());
|
|
7462
7894
|
});
|
|
7463
7895
|
});
|
|
7464
7896
|
}
|
|
@@ -7477,27 +7909,25 @@ async function offerRegeneration() {
|
|
|
7477
7909
|
console.log(` ${chalk11.cyan(`harness generate${isGlobal ? " --global" : ""}`)}`);
|
|
7478
7910
|
}
|
|
7479
7911
|
}
|
|
7480
|
-
async function
|
|
7481
|
-
if (opts.version) return void 0;
|
|
7912
|
+
async function checkAllPackages(packages, installedVersions) {
|
|
7482
7913
|
logger.info("Checking for updates...");
|
|
7483
|
-
|
|
7484
|
-
|
|
7485
|
-
|
|
7486
|
-
|
|
7487
|
-
|
|
7488
|
-
|
|
7489
|
-
|
|
7490
|
-
|
|
7491
|
-
|
|
7492
|
-
|
|
7493
|
-
|
|
7494
|
-
|
|
7495
|
-
|
|
7496
|
-
|
|
7497
|
-
|
|
7498
|
-
console.log("");
|
|
7914
|
+
const results = await Promise.allSettled(
|
|
7915
|
+
packages.map(async (pkg) => {
|
|
7916
|
+
const latest = await getLatestVersionAsync(pkg);
|
|
7917
|
+
const current = installedVersions[pkg] ?? null;
|
|
7918
|
+
return { pkg, current, latest, outdated: !current || current !== latest };
|
|
7919
|
+
})
|
|
7920
|
+
);
|
|
7921
|
+
const outdated = [];
|
|
7922
|
+
for (const result of results) {
|
|
7923
|
+
if (result.status === "rejected") {
|
|
7924
|
+
continue;
|
|
7925
|
+
}
|
|
7926
|
+
if (result.value.outdated) {
|
|
7927
|
+
outdated.push(result.value);
|
|
7928
|
+
}
|
|
7499
7929
|
}
|
|
7500
|
-
return
|
|
7930
|
+
return { hasUpdates: outdated.length > 0, outdated };
|
|
7501
7931
|
}
|
|
7502
7932
|
function buildInstallPackages(packages, opts) {
|
|
7503
7933
|
const pm = detectPackageManager();
|
|
@@ -7515,12 +7945,30 @@ async function runUpdateAction(opts, globalOpts) {
|
|
|
7515
7945
|
if (globalOpts.verbose) {
|
|
7516
7946
|
logger.info(`Detected package manager: ${pm}`);
|
|
7517
7947
|
}
|
|
7518
|
-
const currentVersion = getInstalledVersion(pm);
|
|
7519
|
-
await checkForUpdates(pm, opts, currentVersion);
|
|
7520
7948
|
const packages = getInstalledPackages(pm);
|
|
7521
7949
|
if (globalOpts.verbose) {
|
|
7522
7950
|
logger.info(`Installed packages: ${packages.join(", ")}`);
|
|
7523
7951
|
}
|
|
7952
|
+
if (opts.regenerate) {
|
|
7953
|
+
await offerRegeneration();
|
|
7954
|
+
process.exit(ExitCode.SUCCESS);
|
|
7955
|
+
}
|
|
7956
|
+
if (!opts.version && !opts.force) {
|
|
7957
|
+
const installedVersions = getInstalledVersions(pm, packages);
|
|
7958
|
+
const { hasUpdates, outdated } = await checkAllPackages(packages, installedVersions);
|
|
7959
|
+
if (!hasUpdates) {
|
|
7960
|
+
logger.success("All packages are up to date");
|
|
7961
|
+
await offerRegeneration();
|
|
7962
|
+
process.exit(ExitCode.SUCCESS);
|
|
7963
|
+
}
|
|
7964
|
+
console.log("");
|
|
7965
|
+
for (const { pkg, current, latest } of outdated) {
|
|
7966
|
+
const shortName = pkg.replace("@harness-engineering/", "");
|
|
7967
|
+
const currentStr = current ? chalk11.dim(`v${current}`) : chalk11.dim("not installed");
|
|
7968
|
+
logger.info(`${shortName}: ${currentStr} \u2192 ${chalk11.green(`v${latest}`)}`);
|
|
7969
|
+
}
|
|
7970
|
+
console.log("");
|
|
7971
|
+
}
|
|
7524
7972
|
const { installPkgs, installCmd } = buildInstallPackages(packages, opts);
|
|
7525
7973
|
if (globalOpts.verbose) {
|
|
7526
7974
|
logger.info(`Running: ${installCmd}`);
|
|
@@ -7540,16 +7988,19 @@ async function runUpdateAction(opts, globalOpts) {
|
|
|
7540
7988
|
process.exit(ExitCode.SUCCESS);
|
|
7541
7989
|
}
|
|
7542
7990
|
function createUpdateCommand() {
|
|
7543
|
-
return new
|
|
7991
|
+
return new Command77("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(
|
|
7992
|
+
"--regenerate",
|
|
7993
|
+
"Only regenerate slash commands and agent definitions (skip package updates)"
|
|
7994
|
+
).action(async (opts, cmd) => {
|
|
7544
7995
|
const globalOpts = cmd.optsWithGlobals();
|
|
7545
7996
|
await runUpdateAction(opts, globalOpts);
|
|
7546
7997
|
});
|
|
7547
7998
|
}
|
|
7548
7999
|
|
|
7549
8000
|
// src/commands/usage.ts
|
|
7550
|
-
import { Command as
|
|
8001
|
+
import { Command as Command78 } from "commander";
|
|
7551
8002
|
async function loadAndPriceRecords(cwd, includeClaudeSessions = false) {
|
|
7552
|
-
const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-
|
|
8003
|
+
const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-TZQUURSP.js");
|
|
7553
8004
|
const records = readCostRecords(cwd);
|
|
7554
8005
|
if (includeClaudeSessions) {
|
|
7555
8006
|
const ccRecords = parseCCRecords();
|
|
@@ -7574,6 +8025,13 @@ function formatTokenCount(count) {
|
|
|
7574
8025
|
if (count >= 1e3) return (count / 1e3).toFixed(1) + "K";
|
|
7575
8026
|
return String(count);
|
|
7576
8027
|
}
|
|
8028
|
+
function formatPercent(ratio) {
|
|
8029
|
+
return (ratio * 100).toFixed(1) + "%";
|
|
8030
|
+
}
|
|
8031
|
+
function computeCacheHitRate(cacheReadTokens, inputTokens) {
|
|
8032
|
+
if (cacheReadTokens == null || cacheReadTokens === 0 || inputTokens === 0) return null;
|
|
8033
|
+
return cacheReadTokens / inputTokens;
|
|
8034
|
+
}
|
|
7577
8035
|
function formatModels(models) {
|
|
7578
8036
|
if (models.length === 0) return "unknown";
|
|
7579
8037
|
if (models.length === 1) return models[0] ?? "unknown";
|
|
@@ -7593,15 +8051,25 @@ function registerDailyCommand(usage) {
|
|
|
7593
8051
|
}
|
|
7594
8052
|
return;
|
|
7595
8053
|
}
|
|
7596
|
-
const { aggregateByDay } = await import("./dist-
|
|
8054
|
+
const { aggregateByDay } = await import("./dist-TZQUURSP.js");
|
|
7597
8055
|
const dailyData = aggregateByDay(records);
|
|
7598
8056
|
const limited = dailyData.slice(0, days);
|
|
7599
8057
|
if (globalOpts.json) {
|
|
7600
|
-
|
|
8058
|
+
const enriched = limited.map((day) => {
|
|
8059
|
+
const hitRate = computeCacheHitRate(day.cacheReadTokens, day.tokens.inputTokens);
|
|
8060
|
+
return {
|
|
8061
|
+
...day,
|
|
8062
|
+
...hitRate != null ? { cacheHitRate: Math.round(hitRate * 1e3) / 1e3 } : {}
|
|
8063
|
+
};
|
|
8064
|
+
});
|
|
8065
|
+
console.log(JSON.stringify(enriched, null, 2));
|
|
7601
8066
|
return;
|
|
7602
8067
|
}
|
|
7603
|
-
const
|
|
7604
|
-
const
|
|
8068
|
+
const hasCacheData = limited.some((d) => d.cacheReadTokens != null && d.cacheReadTokens > 0);
|
|
8069
|
+
const cacheHeader = hasCacheData ? " | Cache " : "";
|
|
8070
|
+
const cacheDivider = hasCacheData ? " | ------" : "";
|
|
8071
|
+
const header = "Date | Sessions | Input | Output | Model(s) | Cost " + cacheHeader;
|
|
8072
|
+
const divider = "-------------|----------|-----------|-----------|------------------------------|-------" + cacheDivider;
|
|
7605
8073
|
logger.info(header);
|
|
7606
8074
|
logger.info(divider);
|
|
7607
8075
|
for (const day of limited) {
|
|
@@ -7611,7 +8079,13 @@ function registerDailyCommand(usage) {
|
|
|
7611
8079
|
const output = formatTokenCount(day.tokens.outputTokens).padStart(9);
|
|
7612
8080
|
const models = formatModels(day.models).padEnd(28);
|
|
7613
8081
|
const cost = formatMicroUSD(day.costMicroUSD);
|
|
7614
|
-
|
|
8082
|
+
const cacheCol = hasCacheData ? (() => {
|
|
8083
|
+
const rate = computeCacheHitRate(day.cacheReadTokens, day.tokens.inputTokens);
|
|
8084
|
+
return " | " + (rate != null ? formatPercent(rate).padStart(5) : " -");
|
|
8085
|
+
})() : "";
|
|
8086
|
+
logger.info(
|
|
8087
|
+
`${date} | ${sessions} | ${input} | ${output} | ${models} | ${cost}${cacheCol}`
|
|
8088
|
+
);
|
|
7615
8089
|
}
|
|
7616
8090
|
});
|
|
7617
8091
|
}
|
|
@@ -7629,7 +8103,7 @@ function registerSessionsCommand(usage) {
|
|
|
7629
8103
|
}
|
|
7630
8104
|
return;
|
|
7631
8105
|
}
|
|
7632
|
-
const { aggregateBySession } = await import("./dist-
|
|
8106
|
+
const { aggregateBySession } = await import("./dist-TZQUURSP.js");
|
|
7633
8107
|
const sessionData = aggregateBySession(records);
|
|
7634
8108
|
const limited = sessionData.slice(0, limit);
|
|
7635
8109
|
if (globalOpts.json) {
|
|
@@ -7688,6 +8162,12 @@ function printSessionDetail(match) {
|
|
|
7688
8162
|
if (match.cacheCreationTokens != null) {
|
|
7689
8163
|
logger.info(` Cache creation tokens: ${formatTokenCount(match.cacheCreationTokens)}`);
|
|
7690
8164
|
}
|
|
8165
|
+
const hitRate = computeCacheHitRate(match.cacheReadTokens, match.tokens.inputTokens);
|
|
8166
|
+
if (hitRate != null) {
|
|
8167
|
+
logger.info("");
|
|
8168
|
+
logger.info("Cache Performance:");
|
|
8169
|
+
logger.info(` Cache hit rate: ${formatPercent(hitRate)}`);
|
|
8170
|
+
}
|
|
7691
8171
|
logger.info("");
|
|
7692
8172
|
logger.info(`Cost: ${formatMicroUSD(match.costMicroUSD)}`);
|
|
7693
8173
|
}
|
|
@@ -7696,7 +8176,7 @@ function registerSessionCommand(usage) {
|
|
|
7696
8176
|
const globalOpts = cmd.optsWithGlobals();
|
|
7697
8177
|
const cwd = process.cwd();
|
|
7698
8178
|
const records = await loadAndPriceRecords(cwd, globalOpts.includeClaudeSessions);
|
|
7699
|
-
const { aggregateBySession } = await import("./dist-
|
|
8179
|
+
const { aggregateBySession } = await import("./dist-TZQUURSP.js");
|
|
7700
8180
|
const sessionData = aggregateBySession(records);
|
|
7701
8181
|
const match = sessionData.find((s) => s.sessionId === id);
|
|
7702
8182
|
if (!match) {
|
|
@@ -7705,7 +8185,12 @@ function registerSessionCommand(usage) {
|
|
|
7705
8185
|
return;
|
|
7706
8186
|
}
|
|
7707
8187
|
if (globalOpts.json) {
|
|
7708
|
-
|
|
8188
|
+
const hitRate = computeCacheHitRate(match.cacheReadTokens, match.tokens.inputTokens);
|
|
8189
|
+
const enriched = {
|
|
8190
|
+
...match,
|
|
8191
|
+
...hitRate != null ? { cacheHitRate: Math.round(hitRate * 1e3) / 1e3 } : {}
|
|
8192
|
+
};
|
|
8193
|
+
console.log(JSON.stringify(enriched, null, 2));
|
|
7709
8194
|
return;
|
|
7710
8195
|
}
|
|
7711
8196
|
printSessionDetail(match);
|
|
@@ -7724,7 +8209,7 @@ function registerLatestCommand(usage) {
|
|
|
7724
8209
|
}
|
|
7725
8210
|
return;
|
|
7726
8211
|
}
|
|
7727
|
-
const { aggregateBySession } = await import("./dist-
|
|
8212
|
+
const { aggregateBySession } = await import("./dist-TZQUURSP.js");
|
|
7728
8213
|
const sessionData = aggregateBySession(records);
|
|
7729
8214
|
const latest = sessionData[0];
|
|
7730
8215
|
if (!latest) {
|
|
@@ -7750,7 +8235,7 @@ function registerLatestCommand(usage) {
|
|
|
7750
8235
|
});
|
|
7751
8236
|
}
|
|
7752
8237
|
function createUsageCommand() {
|
|
7753
|
-
const usage = new
|
|
8238
|
+
const usage = new Command78("usage").description("Token usage and cost tracking");
|
|
7754
8239
|
usage.option(
|
|
7755
8240
|
"--include-claude-sessions",
|
|
7756
8241
|
"Include Claude Code session data from ~/.claude/projects/"
|
|
@@ -7763,15 +8248,15 @@ function createUsageCommand() {
|
|
|
7763
8248
|
}
|
|
7764
8249
|
|
|
7765
8250
|
// src/commands/validate.ts
|
|
7766
|
-
import { Command as
|
|
7767
|
-
import * as
|
|
8251
|
+
import { Command as Command79 } from "commander";
|
|
8252
|
+
import * as path59 from "path";
|
|
7768
8253
|
async function runValidate(options) {
|
|
7769
8254
|
const configResult = resolveConfig(options.configPath);
|
|
7770
8255
|
if (!configResult.ok) {
|
|
7771
8256
|
return configResult;
|
|
7772
8257
|
}
|
|
7773
8258
|
const config = configResult.value;
|
|
7774
|
-
const cwd = options.cwd ?? (options.configPath ?
|
|
8259
|
+
const cwd = options.cwd ?? (options.configPath ? path59.dirname(path59.resolve(options.configPath)) : process.cwd());
|
|
7775
8260
|
const result = {
|
|
7776
8261
|
valid: true,
|
|
7777
8262
|
checks: {
|
|
@@ -7781,7 +8266,7 @@ async function runValidate(options) {
|
|
|
7781
8266
|
},
|
|
7782
8267
|
issues: []
|
|
7783
8268
|
};
|
|
7784
|
-
const agentsMapPath =
|
|
8269
|
+
const agentsMapPath = path59.resolve(cwd, config.agentsMapPath);
|
|
7785
8270
|
const agentsResult = await validateAgentsMap(agentsMapPath);
|
|
7786
8271
|
if (agentsResult.ok) {
|
|
7787
8272
|
result.checks.agentsMap = true;
|
|
@@ -7826,11 +8311,11 @@ function resolveValidateMode(globalOpts) {
|
|
|
7826
8311
|
return OutputMode.TEXT;
|
|
7827
8312
|
}
|
|
7828
8313
|
async function printCrossCheckWarnings(mode) {
|
|
7829
|
-
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-
|
|
8314
|
+
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-M4NP2UF5.js");
|
|
7830
8315
|
const cwd = process.cwd();
|
|
7831
8316
|
const crossResult = await runCrossCheck2({
|
|
7832
|
-
specsDir:
|
|
7833
|
-
plansDir:
|
|
8317
|
+
specsDir: path59.join(cwd, "docs", "specs"),
|
|
8318
|
+
plansDir: path59.join(cwd, "docs", "plans"),
|
|
7834
8319
|
projectPath: cwd
|
|
7835
8320
|
});
|
|
7836
8321
|
if (!crossResult.ok || crossResult.value.warnings === 0) return;
|
|
@@ -7842,7 +8327,7 @@ async function printCrossCheckWarnings(mode) {
|
|
|
7842
8327
|
${crossResult.value.warnings} warnings`);
|
|
7843
8328
|
}
|
|
7844
8329
|
function createValidateCommand3() {
|
|
7845
|
-
const command = new
|
|
8330
|
+
const command = new Command79("validate").description("Run all validation checks").option("--cross-check", "Run cross-artifact consistency validation").action(async (opts, cmd) => {
|
|
7846
8331
|
const globalOpts = cmd.optsWithGlobals();
|
|
7847
8332
|
const mode = resolveValidateMode(globalOpts);
|
|
7848
8333
|
const formatter = new OutputFormatter(mode);
|
|
@@ -7871,6 +8356,7 @@ function createValidateCommand3() {
|
|
|
7871
8356
|
// src/commands/_registry.ts
|
|
7872
8357
|
var commandCreators = [
|
|
7873
8358
|
createAddCommand,
|
|
8359
|
+
createAdoptionCommand,
|
|
7874
8360
|
createAgentCommand,
|
|
7875
8361
|
createBlueprintCommand,
|
|
7876
8362
|
createCheckArchCommand,
|
|
@@ -7881,6 +8367,7 @@ var commandCreators = [
|
|
|
7881
8367
|
createCheckSecurityCommand,
|
|
7882
8368
|
createCICommand,
|
|
7883
8369
|
createCleanupCommand,
|
|
8370
|
+
createCleanupSessionsCommand,
|
|
7884
8371
|
createCreateSkillCommand,
|
|
7885
8372
|
createDashboardCommand,
|
|
7886
8373
|
createDoctorCommand,
|
|
@@ -7914,6 +8401,7 @@ var commandCreators = [
|
|
|
7914
8401
|
createSnapshotCommand,
|
|
7915
8402
|
createStateCommand,
|
|
7916
8403
|
createTaintCommand,
|
|
8404
|
+
createTelemetryCommand,
|
|
7917
8405
|
createTraceabilityCommand,
|
|
7918
8406
|
createUninstallCommand,
|
|
7919
8407
|
createUninstallConstraintsCommand,
|
|
@@ -7924,7 +8412,7 @@ var commandCreators = [
|
|
|
7924
8412
|
|
|
7925
8413
|
// src/index.ts
|
|
7926
8414
|
function createProgram() {
|
|
7927
|
-
const program = new
|
|
8415
|
+
const program = new Command80();
|
|
7928
8416
|
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
8417
|
for (const creator of commandCreators) {
|
|
7930
8418
|
program.addCommand(creator());
|