cfsa-antigravity 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,728 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vscode-extension-development
|
|
3
|
+
description: VS Code extension development covering the Extension API, activation events, TreeViews, Webviews, Language Server Protocol, debugging, publishing, and testing. Use when building VS Code extensions that add commands, views, language support, or custom editors.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# VS Code Extension Development
|
|
8
|
+
|
|
9
|
+
Build VS Code extensions that integrate deeply with the editor through commands, views, language features, and custom UI.
|
|
10
|
+
|
|
11
|
+
## Extension API Overview
|
|
12
|
+
|
|
13
|
+
| API Surface | What It Provides |
|
|
14
|
+
|------------|-----------------|
|
|
15
|
+
| `vscode.commands` | Register and execute commands |
|
|
16
|
+
| `vscode.window` | Editors, terminals, notifications, quick picks, webviews |
|
|
17
|
+
| `vscode.workspace` | Files, folders, configuration, file system watcher |
|
|
18
|
+
| `vscode.languages` | Language features (completion, hover, diagnostics) |
|
|
19
|
+
| `vscode.debug` | Debug adapters and debug sessions |
|
|
20
|
+
| `vscode.extensions` | Access other extensions, extension context |
|
|
21
|
+
| `vscode.env` | Environment info (machine ID, app name, clipboard) |
|
|
22
|
+
| `vscode.authentication` | OAuth-based authentication |
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// extension.ts - Entry point
|
|
26
|
+
import * as vscode from 'vscode';
|
|
27
|
+
|
|
28
|
+
export function activate(context: vscode.ExtensionContext) {
|
|
29
|
+
// Register a simple command
|
|
30
|
+
const disposable = vscode.commands.registerCommand(
|
|
31
|
+
'myext.helloWorld',
|
|
32
|
+
() => {
|
|
33
|
+
vscode.window.showInformationMessage('Hello from My Extension!');
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
context.subscriptions.push(disposable);
|
|
37
|
+
|
|
38
|
+
// Register a text editor command (only active when editor is focused)
|
|
39
|
+
context.subscriptions.push(
|
|
40
|
+
vscode.commands.registerTextEditorCommand(
|
|
41
|
+
'myext.insertTimestamp',
|
|
42
|
+
(textEditor, edit) => {
|
|
43
|
+
const timestamp = new Date().toISOString();
|
|
44
|
+
edit.insert(textEditor.selection.active, timestamp);
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// Status bar item
|
|
50
|
+
const statusBar = vscode.window.createStatusBarItem(
|
|
51
|
+
vscode.StatusBarAlignment.Right,
|
|
52
|
+
100
|
|
53
|
+
);
|
|
54
|
+
statusBar.text = '$(sync~spin) My Extension';
|
|
55
|
+
statusBar.command = 'myext.showStatus';
|
|
56
|
+
statusBar.tooltip = 'Click to show extension status';
|
|
57
|
+
statusBar.show();
|
|
58
|
+
context.subscriptions.push(statusBar);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function deactivate() {
|
|
62
|
+
// Clean up resources
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Rule**: Every disposable must be added to `context.subscriptions` for automatic cleanup when the extension is deactivated.
|
|
67
|
+
|
|
68
|
+
## Activation Events
|
|
69
|
+
|
|
70
|
+
Extensions are loaded lazily. Declare activation events to tell VS Code when to load your extension.
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"activationEvents": [
|
|
75
|
+
"onCommand:myext.helloWorld",
|
|
76
|
+
"onLanguage:python",
|
|
77
|
+
"onView:myext.sidebar",
|
|
78
|
+
"workspaceContains:.myextrc",
|
|
79
|
+
"onFileSystem:myext-fs",
|
|
80
|
+
"onUri",
|
|
81
|
+
"onStartupFinished",
|
|
82
|
+
"*"
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
| Event | When It Fires |
|
|
88
|
+
|-------|--------------|
|
|
89
|
+
| `onCommand:id` | When the command is invoked |
|
|
90
|
+
| `onLanguage:lang` | When a file of that language is opened |
|
|
91
|
+
| `onView:viewId` | When the view is visible |
|
|
92
|
+
| `workspaceContains:glob` | When workspace has matching files |
|
|
93
|
+
| `onFileSystem:scheme` | When a file with that URI scheme is accessed |
|
|
94
|
+
| `onUri` | When a `vscode://` URI is opened for this extension |
|
|
95
|
+
| `onStartupFinished` | After VS Code startup completes |
|
|
96
|
+
| `*` | On startup (avoid -- slows VS Code launch) |
|
|
97
|
+
|
|
98
|
+
**Rule**: Never use `*` activation unless absolutely necessary. It forces your extension to load at startup, impacting VS Code performance.
|
|
99
|
+
**Rule**: For commands, VS Code automatically adds `onCommand:` activation events from `contributes.commands`. You only need to declare activation events for non-command triggers.
|
|
100
|
+
|
|
101
|
+
## package.json `contributes` Schema
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"contributes": {
|
|
106
|
+
"commands": [
|
|
107
|
+
{
|
|
108
|
+
"command": "myext.helloWorld",
|
|
109
|
+
"title": "Hello World",
|
|
110
|
+
"category": "My Extension",
|
|
111
|
+
"icon": "$(megaphone)"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"command": "myext.analyze",
|
|
115
|
+
"title": "Analyze File",
|
|
116
|
+
"category": "My Extension",
|
|
117
|
+
"enablement": "editorLangId == typescript"
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
|
|
121
|
+
"keybindings": [
|
|
122
|
+
{
|
|
123
|
+
"command": "myext.analyze",
|
|
124
|
+
"key": "ctrl+shift+a",
|
|
125
|
+
"mac": "cmd+shift+a",
|
|
126
|
+
"when": "editorTextFocus && editorLangId == typescript"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
|
|
130
|
+
"menus": {
|
|
131
|
+
"editor/context": [
|
|
132
|
+
{
|
|
133
|
+
"command": "myext.analyze",
|
|
134
|
+
"group": "myext",
|
|
135
|
+
"when": "editorLangId == typescript"
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"view/title": [
|
|
139
|
+
{
|
|
140
|
+
"command": "myext.refresh",
|
|
141
|
+
"group": "navigation",
|
|
142
|
+
"when": "view == myext.sidebar"
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
"viewsContainers": {
|
|
148
|
+
"activitybar": [
|
|
149
|
+
{
|
|
150
|
+
"id": "myext-sidebar",
|
|
151
|
+
"title": "My Extension",
|
|
152
|
+
"icon": "resources/icon.svg"
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
"views": {
|
|
158
|
+
"myext-sidebar": [
|
|
159
|
+
{
|
|
160
|
+
"id": "myext.itemsList",
|
|
161
|
+
"name": "Items",
|
|
162
|
+
"contextualTitle": "My Extension Items"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "myext.details",
|
|
166
|
+
"name": "Details",
|
|
167
|
+
"type": "webview"
|
|
168
|
+
}
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
"configuration": {
|
|
173
|
+
"title": "My Extension",
|
|
174
|
+
"properties": {
|
|
175
|
+
"myext.apiUrl": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"default": "https://api.example.com",
|
|
178
|
+
"description": "API endpoint URL",
|
|
179
|
+
"scope": "resource"
|
|
180
|
+
},
|
|
181
|
+
"myext.maxResults": {
|
|
182
|
+
"type": "number",
|
|
183
|
+
"default": 50,
|
|
184
|
+
"minimum": 10,
|
|
185
|
+
"maximum": 200,
|
|
186
|
+
"description": "Maximum number of results to display"
|
|
187
|
+
},
|
|
188
|
+
"myext.autoAnalyze": {
|
|
189
|
+
"type": "boolean",
|
|
190
|
+
"default": true,
|
|
191
|
+
"description": "Automatically analyze files on save"
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## TreeView and Data Provider
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// TreeView with async data loading
|
|
203
|
+
interface TreeItem {
|
|
204
|
+
id: string;
|
|
205
|
+
label: string;
|
|
206
|
+
description?: string;
|
|
207
|
+
iconPath?: vscode.ThemeIcon;
|
|
208
|
+
children?: TreeItem[];
|
|
209
|
+
contextValue?: string; // For context menu filtering
|
|
210
|
+
command?: vscode.Command; // Action on click
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
class ItemsProvider implements vscode.TreeDataProvider<TreeItem> {
|
|
214
|
+
private _onDidChangeTreeData = new vscode.EventEmitter<TreeItem | undefined>();
|
|
215
|
+
readonly onDidChangeTreeData = this._onDidChangeTreeData.event;
|
|
216
|
+
|
|
217
|
+
private items: TreeItem[] = [];
|
|
218
|
+
|
|
219
|
+
refresh(): void {
|
|
220
|
+
this._onDidChangeTreeData.fire(undefined);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
getTreeItem(element: TreeItem): vscode.TreeItem {
|
|
224
|
+
const treeItem = new vscode.TreeItem(
|
|
225
|
+
element.label,
|
|
226
|
+
element.children
|
|
227
|
+
? vscode.TreeItemCollapsibleState.Collapsed
|
|
228
|
+
: vscode.TreeItemCollapsibleState.None
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
treeItem.id = element.id;
|
|
232
|
+
treeItem.description = element.description;
|
|
233
|
+
treeItem.iconPath = element.iconPath;
|
|
234
|
+
treeItem.contextValue = element.contextValue;
|
|
235
|
+
treeItem.command = element.command;
|
|
236
|
+
treeItem.tooltip = new vscode.MarkdownString(`**${element.label}**\n\n${element.description || ''}`);
|
|
237
|
+
|
|
238
|
+
return treeItem;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
async getChildren(element?: TreeItem): Promise<TreeItem[]> {
|
|
242
|
+
if (!element) {
|
|
243
|
+
// Root level -- fetch from API or workspace
|
|
244
|
+
this.items = await this.fetchItems();
|
|
245
|
+
return this.items;
|
|
246
|
+
}
|
|
247
|
+
return element.children || [];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
private async fetchItems(): Promise<TreeItem[]> {
|
|
251
|
+
// Fetch data from your service
|
|
252
|
+
const data = await fetchFromApi();
|
|
253
|
+
return data.map((item) => ({
|
|
254
|
+
id: item.id,
|
|
255
|
+
label: item.name,
|
|
256
|
+
description: item.status,
|
|
257
|
+
iconPath: new vscode.ThemeIcon(
|
|
258
|
+
item.status === 'pass' ? 'check' : 'error',
|
|
259
|
+
item.status === 'pass'
|
|
260
|
+
? new vscode.ThemeColor('testing.iconPassed')
|
|
261
|
+
: new vscode.ThemeColor('testing.iconFailed')
|
|
262
|
+
),
|
|
263
|
+
contextValue: 'item',
|
|
264
|
+
command: {
|
|
265
|
+
command: 'myext.openItem',
|
|
266
|
+
title: 'Open Item',
|
|
267
|
+
arguments: [item.id],
|
|
268
|
+
},
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Register in activate()
|
|
274
|
+
export function activate(context: vscode.ExtensionContext) {
|
|
275
|
+
const provider = new ItemsProvider();
|
|
276
|
+
const treeView = vscode.window.createTreeView('myext.itemsList', {
|
|
277
|
+
treeDataProvider: provider,
|
|
278
|
+
showCollapseAll: true,
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
context.subscriptions.push(
|
|
282
|
+
treeView,
|
|
283
|
+
vscode.commands.registerCommand('myext.refresh', () => provider.refresh()),
|
|
284
|
+
vscode.commands.registerCommand('myext.openItem', (id: string) => openItem(id)),
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Webview Communication
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
// Create a Webview panel with bidirectional communication
|
|
293
|
+
function createDetailPanel(
|
|
294
|
+
context: vscode.ExtensionContext,
|
|
295
|
+
data: ItemDetail
|
|
296
|
+
): vscode.WebviewPanel {
|
|
297
|
+
const panel = vscode.window.createWebviewPanel(
|
|
298
|
+
'myext.detail',
|
|
299
|
+
`Detail: ${data.name}`,
|
|
300
|
+
vscode.ViewColumn.Beside,
|
|
301
|
+
{
|
|
302
|
+
enableScripts: true,
|
|
303
|
+
retainContextWhenHidden: true,
|
|
304
|
+
localResourceRoots: [
|
|
305
|
+
vscode.Uri.joinPath(context.extensionUri, 'media'),
|
|
306
|
+
],
|
|
307
|
+
}
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
// Get URI for bundled resources
|
|
311
|
+
const scriptUri = panel.webview.asWebviewUri(
|
|
312
|
+
vscode.Uri.joinPath(context.extensionUri, 'media', 'webview.js')
|
|
313
|
+
);
|
|
314
|
+
const styleUri = panel.webview.asWebviewUri(
|
|
315
|
+
vscode.Uri.joinPath(context.extensionUri, 'media', 'webview.css')
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
// Set HTML content with CSP
|
|
319
|
+
panel.webview.html = `
|
|
320
|
+
<!DOCTYPE html>
|
|
321
|
+
<html lang="en">
|
|
322
|
+
<head>
|
|
323
|
+
<meta charset="UTF-8">
|
|
324
|
+
<meta http-equiv="Content-Security-Policy"
|
|
325
|
+
content="default-src 'none';
|
|
326
|
+
style-src ${panel.webview.cspSource};
|
|
327
|
+
script-src 'nonce-${getNonce()}';
|
|
328
|
+
img-src ${panel.webview.cspSource} https:;">
|
|
329
|
+
<link href="${styleUri}" rel="stylesheet">
|
|
330
|
+
</head>
|
|
331
|
+
<body>
|
|
332
|
+
<div id="app"></div>
|
|
333
|
+
<script nonce="${getNonce()}" src="${scriptUri}"></script>
|
|
334
|
+
</body>
|
|
335
|
+
</html>
|
|
336
|
+
`;
|
|
337
|
+
|
|
338
|
+
// Send data to webview
|
|
339
|
+
panel.webview.postMessage({ type: 'setData', data });
|
|
340
|
+
|
|
341
|
+
// Receive messages from webview
|
|
342
|
+
panel.webview.onDidReceiveMessage(
|
|
343
|
+
async (message) => {
|
|
344
|
+
switch (message.type) {
|
|
345
|
+
case 'save':
|
|
346
|
+
await saveItem(message.data);
|
|
347
|
+
vscode.window.showInformationMessage('Saved!');
|
|
348
|
+
break;
|
|
349
|
+
case 'openExternal':
|
|
350
|
+
vscode.env.openExternal(vscode.Uri.parse(message.url));
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
undefined,
|
|
355
|
+
context.subscriptions
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
return panel;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function getNonce(): string {
|
|
362
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
363
|
+
let nonce = '';
|
|
364
|
+
for (let i = 0; i < 32; i++) {
|
|
365
|
+
nonce += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
366
|
+
}
|
|
367
|
+
return nonce;
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
// webview.js - Runs inside the Webview (sandboxed browser context)
|
|
373
|
+
const vscode = acquireVsCodeApi();
|
|
374
|
+
|
|
375
|
+
// Receive messages from extension
|
|
376
|
+
window.addEventListener('message', (event) => {
|
|
377
|
+
const message = event.data;
|
|
378
|
+
switch (message.type) {
|
|
379
|
+
case 'setData':
|
|
380
|
+
renderData(message.data);
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
// Send messages to extension
|
|
386
|
+
function handleSave(data) {
|
|
387
|
+
vscode.postMessage({ type: 'save', data });
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Persist webview state across visibility changes
|
|
391
|
+
const previousState = vscode.getState();
|
|
392
|
+
if (previousState) {
|
|
393
|
+
restoreState(previousState);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function updateState(newState) {
|
|
397
|
+
vscode.setState(newState);
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**Rule**: Always set a Content Security Policy on webviews. Use nonces for scripts.
|
|
402
|
+
**Rule**: Use `webview.asWebviewUri()` for all resource URIs. Never construct `vscode-webview-resource://` URIs manually.
|
|
403
|
+
|
|
404
|
+
## Language Server Protocol Integration
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
// client/extension.ts - LSP client
|
|
408
|
+
import {
|
|
409
|
+
LanguageClient,
|
|
410
|
+
LanguageClientOptions,
|
|
411
|
+
ServerOptions,
|
|
412
|
+
TransportKind,
|
|
413
|
+
} from 'vscode-languageclient/node';
|
|
414
|
+
|
|
415
|
+
let client: LanguageClient;
|
|
416
|
+
|
|
417
|
+
export function activate(context: vscode.ExtensionContext) {
|
|
418
|
+
const serverModule = context.asAbsolutePath(
|
|
419
|
+
path.join('server', 'out', 'server.js')
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
const serverOptions: ServerOptions = {
|
|
423
|
+
run: { module: serverModule, transport: TransportKind.ipc },
|
|
424
|
+
debug: {
|
|
425
|
+
module: serverModule,
|
|
426
|
+
transport: TransportKind.ipc,
|
|
427
|
+
options: { execArgv: ['--nolazy', '--inspect=6009'] },
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
const clientOptions: LanguageClientOptions = {
|
|
432
|
+
documentSelector: [
|
|
433
|
+
{ scheme: 'file', language: 'myLanguage' },
|
|
434
|
+
],
|
|
435
|
+
synchronize: {
|
|
436
|
+
fileEvents: vscode.workspace.createFileSystemWatcher('**/.myextrc'),
|
|
437
|
+
},
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
client = new LanguageClient(
|
|
441
|
+
'myext-language-server',
|
|
442
|
+
'My Language Server',
|
|
443
|
+
serverOptions,
|
|
444
|
+
clientOptions
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
client.start();
|
|
448
|
+
context.subscriptions.push(client);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export function deactivate(): Thenable<void> | undefined {
|
|
452
|
+
return client?.stop();
|
|
453
|
+
}
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
// server/server.ts - LSP server
|
|
458
|
+
import {
|
|
459
|
+
createConnection,
|
|
460
|
+
TextDocuments,
|
|
461
|
+
ProposedFeatures,
|
|
462
|
+
InitializeParams,
|
|
463
|
+
TextDocumentSyncKind,
|
|
464
|
+
CompletionItem,
|
|
465
|
+
CompletionItemKind,
|
|
466
|
+
Diagnostic,
|
|
467
|
+
DiagnosticSeverity,
|
|
468
|
+
} from 'vscode-languageserver/node';
|
|
469
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
470
|
+
|
|
471
|
+
const connection = createConnection(ProposedFeatures.all);
|
|
472
|
+
const documents = new TextDocuments(TextDocument);
|
|
473
|
+
|
|
474
|
+
connection.onInitialize((params: InitializeParams) => {
|
|
475
|
+
return {
|
|
476
|
+
capabilities: {
|
|
477
|
+
textDocumentSync: TextDocumentSyncKind.Incremental,
|
|
478
|
+
completionProvider: {
|
|
479
|
+
resolveProvider: true,
|
|
480
|
+
triggerCharacters: ['.', ':'],
|
|
481
|
+
},
|
|
482
|
+
hoverProvider: true,
|
|
483
|
+
definitionProvider: true,
|
|
484
|
+
diagnosticProvider: {
|
|
485
|
+
interFileDependencies: false,
|
|
486
|
+
workspaceDiagnostics: false,
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
// Completion
|
|
493
|
+
connection.onCompletion((_textDocumentPosition) => {
|
|
494
|
+
return [
|
|
495
|
+
{
|
|
496
|
+
label: 'myFunction',
|
|
497
|
+
kind: CompletionItemKind.Function,
|
|
498
|
+
detail: 'A useful function',
|
|
499
|
+
documentation: 'Does something useful with the given parameters.',
|
|
500
|
+
},
|
|
501
|
+
];
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
// Diagnostics on document change
|
|
505
|
+
documents.onDidChangeContent((change) => {
|
|
506
|
+
validateDocument(change.document);
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
async function validateDocument(textDocument: TextDocument): Promise<void> {
|
|
510
|
+
const diagnostics: Diagnostic[] = [];
|
|
511
|
+
const text = textDocument.getText();
|
|
512
|
+
|
|
513
|
+
// Example: flag lines with TODO
|
|
514
|
+
const lines = text.split('\n');
|
|
515
|
+
for (let i = 0; i < lines.length; i++) {
|
|
516
|
+
const todoIndex = lines[i].indexOf('TODO');
|
|
517
|
+
if (todoIndex !== -1) {
|
|
518
|
+
diagnostics.push({
|
|
519
|
+
severity: DiagnosticSeverity.Warning,
|
|
520
|
+
range: {
|
|
521
|
+
start: { line: i, character: todoIndex },
|
|
522
|
+
end: { line: i, character: todoIndex + 4 },
|
|
523
|
+
},
|
|
524
|
+
message: 'TODO found - consider addressing this.',
|
|
525
|
+
source: 'myext',
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
connection.sendDiagnostics({ uri: textDocument.uri, diagnostics });
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
documents.listen(connection);
|
|
534
|
+
connection.listen();
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
## Debugging Extensions
|
|
538
|
+
|
|
539
|
+
```json
|
|
540
|
+
// .vscode/launch.json - Debug configuration
|
|
541
|
+
{
|
|
542
|
+
"version": "0.2.0",
|
|
543
|
+
"configurations": [
|
|
544
|
+
{
|
|
545
|
+
"name": "Run Extension",
|
|
546
|
+
"type": "extensionHost",
|
|
547
|
+
"request": "launch",
|
|
548
|
+
"args": [
|
|
549
|
+
"--extensionDevelopmentPath=${workspaceFolder}"
|
|
550
|
+
],
|
|
551
|
+
"outFiles": [
|
|
552
|
+
"${workspaceFolder}/out/**/*.js"
|
|
553
|
+
],
|
|
554
|
+
"preLaunchTask": "npm: watch"
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"name": "Extension Tests",
|
|
558
|
+
"type": "extensionHost",
|
|
559
|
+
"request": "launch",
|
|
560
|
+
"args": [
|
|
561
|
+
"--extensionDevelopmentPath=${workspaceFolder}",
|
|
562
|
+
"--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
|
|
563
|
+
],
|
|
564
|
+
"outFiles": [
|
|
565
|
+
"${workspaceFolder}/out/test/**/*.js"
|
|
566
|
+
],
|
|
567
|
+
"preLaunchTask": "npm: watch"
|
|
568
|
+
}
|
|
569
|
+
]
|
|
570
|
+
}
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
## Publishing to Marketplace
|
|
574
|
+
|
|
575
|
+
```bash
|
|
576
|
+
# Install vsce (Visual Studio Code Extension CLI)
|
|
577
|
+
npm install -g @vscode/vsce
|
|
578
|
+
|
|
579
|
+
# Package extension
|
|
580
|
+
vsce package
|
|
581
|
+
# Creates myext-1.0.0.vsix
|
|
582
|
+
|
|
583
|
+
# Publish to Visual Studio Marketplace
|
|
584
|
+
vsce publish
|
|
585
|
+
# Requires Personal Access Token from Azure DevOps
|
|
586
|
+
|
|
587
|
+
# Publish specific version
|
|
588
|
+
vsce publish 1.0.1
|
|
589
|
+
# Automatically updates package.json version
|
|
590
|
+
|
|
591
|
+
# Publish to Open VSX (alternative marketplace for VS Codium)
|
|
592
|
+
npx ovsx publish myext-1.0.0.vsix -p <token>
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
```json
|
|
596
|
+
// package.json - Required publisher field
|
|
597
|
+
{
|
|
598
|
+
"publisher": "your-publisher-id",
|
|
599
|
+
"repository": {
|
|
600
|
+
"type": "git",
|
|
601
|
+
"url": "https://github.com/you/myext"
|
|
602
|
+
},
|
|
603
|
+
"categories": ["Programming Languages", "Linters", "Other"],
|
|
604
|
+
"keywords": ["keyword1", "keyword2"],
|
|
605
|
+
"preview": false,
|
|
606
|
+
"icon": "icon.png",
|
|
607
|
+
"galleryBanner": {
|
|
608
|
+
"color": "#1e1e1e",
|
|
609
|
+
"theme": "dark"
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
## Telemetry and Settings
|
|
615
|
+
|
|
616
|
+
```typescript
|
|
617
|
+
// Respect VS Code telemetry settings
|
|
618
|
+
import TelemetryReporter from '@vscode/extension-telemetry';
|
|
619
|
+
|
|
620
|
+
const INSTRUMENTATION_KEY = 'your-app-insights-key';
|
|
621
|
+
let telemetry: TelemetryReporter;
|
|
622
|
+
|
|
623
|
+
export function activate(context: vscode.ExtensionContext) {
|
|
624
|
+
telemetry = new TelemetryReporter(INSTRUMENTATION_KEY);
|
|
625
|
+
context.subscriptions.push(telemetry);
|
|
626
|
+
|
|
627
|
+
// TelemetryReporter automatically respects telemetry.telemetryLevel setting
|
|
628
|
+
telemetry.sendTelemetryEvent('extensionActivated', {
|
|
629
|
+
vscodeVersion: vscode.version,
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// Read extension settings
|
|
634
|
+
function getConfig(): ExtensionConfig {
|
|
635
|
+
const config = vscode.workspace.getConfiguration('myext');
|
|
636
|
+
return {
|
|
637
|
+
apiUrl: config.get<string>('apiUrl', 'https://api.example.com'),
|
|
638
|
+
maxResults: config.get<number>('maxResults', 50),
|
|
639
|
+
autoAnalyze: config.get<boolean>('autoAnalyze', true),
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Watch for configuration changes
|
|
644
|
+
vscode.workspace.onDidChangeConfiguration((e) => {
|
|
645
|
+
if (e.affectsConfiguration('myext')) {
|
|
646
|
+
const newConfig = getConfig();
|
|
647
|
+
applyConfig(newConfig);
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
## Testing Extensions
|
|
653
|
+
|
|
654
|
+
```typescript
|
|
655
|
+
// test/suite/extension.test.ts
|
|
656
|
+
import * as assert from 'assert';
|
|
657
|
+
import * as vscode from 'vscode';
|
|
658
|
+
|
|
659
|
+
suite('Extension Test Suite', () => {
|
|
660
|
+
vscode.window.showInformationMessage('Start all tests.');
|
|
661
|
+
|
|
662
|
+
test('Extension should be present', () => {
|
|
663
|
+
assert.ok(vscode.extensions.getExtension('publisher.myext'));
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
test('Extension should activate', async () => {
|
|
667
|
+
const ext = vscode.extensions.getExtension('publisher.myext')!;
|
|
668
|
+
await ext.activate();
|
|
669
|
+
assert.ok(ext.isActive);
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
test('Command should be registered', async () => {
|
|
673
|
+
const commands = await vscode.commands.getCommands(true);
|
|
674
|
+
assert.ok(commands.includes('myext.helloWorld'));
|
|
675
|
+
});
|
|
676
|
+
|
|
677
|
+
test('Should insert timestamp', async () => {
|
|
678
|
+
const doc = await vscode.workspace.openTextDocument({ content: '' });
|
|
679
|
+
const editor = await vscode.window.showTextDocument(doc);
|
|
680
|
+
|
|
681
|
+
await vscode.commands.executeCommand('myext.insertTimestamp');
|
|
682
|
+
|
|
683
|
+
const text = editor.document.getText();
|
|
684
|
+
assert.match(text, /\d{4}-\d{2}-\d{2}T/);
|
|
685
|
+
});
|
|
686
|
+
});
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
```typescript
|
|
690
|
+
// test/suite/index.ts - Test runner
|
|
691
|
+
import path from 'path';
|
|
692
|
+
import Mocha from 'mocha';
|
|
693
|
+
import { glob } from 'glob';
|
|
694
|
+
|
|
695
|
+
export async function run(): Promise<void> {
|
|
696
|
+
const mocha = new Mocha({ ui: 'tdd', color: true, timeout: 10000 });
|
|
697
|
+
const testsRoot = path.resolve(__dirname);
|
|
698
|
+
|
|
699
|
+
const files = await glob('**/**.test.js', { cwd: testsRoot });
|
|
700
|
+
files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f)));
|
|
701
|
+
|
|
702
|
+
return new Promise((resolve, reject) => {
|
|
703
|
+
mocha.run((failures) => {
|
|
704
|
+
if (failures > 0) {
|
|
705
|
+
reject(new Error(`${failures} tests failed.`));
|
|
706
|
+
} else {
|
|
707
|
+
resolve();
|
|
708
|
+
}
|
|
709
|
+
});
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
## Output Checklist
|
|
715
|
+
|
|
716
|
+
- [ ] Activation events are specific (no `*` unless necessary)
|
|
717
|
+
- [ ] All disposables added to `context.subscriptions`
|
|
718
|
+
- [ ] Commands registered in `contributes.commands` with titles and categories
|
|
719
|
+
- [ ] Keybindings use `when` clauses for context-appropriate activation
|
|
720
|
+
- [ ] TreeView uses `onDidChangeTreeData` for reactive updates
|
|
721
|
+
- [ ] Webviews have Content Security Policy with nonces
|
|
722
|
+
- [ ] Webview resources loaded via `asWebviewUri()`
|
|
723
|
+
- [ ] LSP client and server properly configured with capabilities
|
|
724
|
+
- [ ] Extension tested with VS Code extension test framework
|
|
725
|
+
- [ ] `package.json` includes publisher, repository, categories, and icon
|
|
726
|
+
- [ ] Telemetry respects `telemetry.telemetryLevel` setting
|
|
727
|
+
- [ ] Configuration properties have types, defaults, and descriptions
|
|
728
|
+
- [ ] Published to Visual Studio Marketplace and/or Open VSX
|