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,515 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cli-error-diagnostics
|
|
3
|
+
description: Error handling and diagnostic patterns for CLI tools covering structured error messages, actionable suggestions, verbose mode, diagnostic commands, log files, and crash reports. Use when building CLI tools that need clear, helpful error output.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CLI Error Diagnostics
|
|
8
|
+
|
|
9
|
+
Build CLI tools that produce clear, actionable error messages and provide diagnostic capabilities for troubleshooting.
|
|
10
|
+
|
|
11
|
+
## Structured Error Messages
|
|
12
|
+
|
|
13
|
+
Every error message must answer three questions: What happened? Why did it happen? What can the user do about it?
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Error: Failed to deploy to production.
|
|
17
|
+
Cause: Authentication token expired 2 hours ago.
|
|
18
|
+
Fix: Run `mycli auth login` to refresh your credentials.
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import chalk from 'chalk';
|
|
23
|
+
|
|
24
|
+
interface CliError {
|
|
25
|
+
message: string;
|
|
26
|
+
cause?: string;
|
|
27
|
+
fix?: string;
|
|
28
|
+
code?: string;
|
|
29
|
+
details?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function formatError(error: CliError): string {
|
|
33
|
+
const lines: string[] = [];
|
|
34
|
+
|
|
35
|
+
lines.push(chalk.red(`Error${error.code ? ` [${error.code}]` : ''}: ${error.message}`));
|
|
36
|
+
|
|
37
|
+
if (error.cause) {
|
|
38
|
+
lines.push(chalk.dim(` Cause: ${error.cause}`));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (error.details) {
|
|
42
|
+
lines.push(chalk.dim(` Details: ${error.details}`));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (error.fix) {
|
|
46
|
+
lines.push(chalk.cyan(` Fix: ${error.fix}`));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return lines.join('\n');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Usage
|
|
53
|
+
function handleDeployError(error: unknown): never {
|
|
54
|
+
if (error instanceof AuthExpiredError) {
|
|
55
|
+
console.error(formatError({
|
|
56
|
+
message: 'Failed to deploy to production.',
|
|
57
|
+
cause: `Authentication token expired ${error.expiredAgo}.`,
|
|
58
|
+
fix: 'Run `mycli auth login` to refresh your credentials.',
|
|
59
|
+
code: 'AUTH_EXPIRED',
|
|
60
|
+
}));
|
|
61
|
+
process.exit(77);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (error instanceof ConfigNotFoundError) {
|
|
65
|
+
console.error(formatError({
|
|
66
|
+
message: 'No configuration file found.',
|
|
67
|
+
cause: `Searched in ${error.searchedPaths.join(', ')}.`,
|
|
68
|
+
fix: 'Run `mycli init` to create a configuration file.',
|
|
69
|
+
code: 'CONFIG_NOT_FOUND',
|
|
70
|
+
}));
|
|
71
|
+
process.exit(65);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Unknown error
|
|
75
|
+
console.error(formatError({
|
|
76
|
+
message: 'An unexpected error occurred.',
|
|
77
|
+
cause: (error as Error).message,
|
|
78
|
+
fix: 'Run with --verbose for more details, or file an issue at https://github.com/example/mycli/issues',
|
|
79
|
+
code: 'INTERNAL',
|
|
80
|
+
}));
|
|
81
|
+
process.exit(70);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Anti-pattern**: `Error: Something went wrong` -- no context, no cause, no fix.
|
|
86
|
+
**Anti-pattern**: Printing a raw stack trace to users. Stack traces belong in `--verbose` mode or log files.
|
|
87
|
+
|
|
88
|
+
## Actionable Suggestions
|
|
89
|
+
|
|
90
|
+
### "Did You Mean?" for Typos
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { distance } from 'fastest-levenshtein';
|
|
94
|
+
|
|
95
|
+
function suggestCommand(input: string, validCommands: string[]): string | null {
|
|
96
|
+
const MAX_DISTANCE = 3;
|
|
97
|
+
|
|
98
|
+
const suggestions = validCommands
|
|
99
|
+
.map((cmd) => ({ cmd, dist: distance(input, cmd) }))
|
|
100
|
+
.filter(({ dist }) => dist <= MAX_DISTANCE)
|
|
101
|
+
.sort((a, b) => a.dist - b.dist);
|
|
102
|
+
|
|
103
|
+
return suggestions.length > 0 ? suggestions[0].cmd : null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Usage
|
|
107
|
+
function handleUnknownCommand(input: string): never {
|
|
108
|
+
const suggestion = suggestCommand(input, ['deploy', 'status', 'logs', 'config', 'auth']);
|
|
109
|
+
|
|
110
|
+
const error: CliError = {
|
|
111
|
+
message: `Unknown command: ${input}`,
|
|
112
|
+
code: 'UNKNOWN_COMMAND',
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (suggestion) {
|
|
116
|
+
error.fix = `Did you mean \`mycli ${suggestion}\`?`;
|
|
117
|
+
} else {
|
|
118
|
+
error.fix = 'Run `mycli --help` to see available commands.';
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
console.error(formatError(error));
|
|
122
|
+
process.exit(2);
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Context-Aware Suggestions
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// Suggest fixes based on common error patterns
|
|
130
|
+
function suggestFix(error: Error): string | undefined {
|
|
131
|
+
const msg = error.message.toLowerCase();
|
|
132
|
+
|
|
133
|
+
if (msg.includes('eacces') || msg.includes('permission denied')) {
|
|
134
|
+
return process.platform === 'win32'
|
|
135
|
+
? 'Try running the terminal as Administrator.'
|
|
136
|
+
: 'Try running with `sudo` or check file permissions with `ls -la`.';
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (msg.includes('econnrefused')) {
|
|
140
|
+
return 'The server may be down. Check your network connection or verify the API URL in your config.';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (msg.includes('enotfound') || msg.includes('getaddrinfo')) {
|
|
144
|
+
return 'DNS resolution failed. Check your internet connection or verify the hostname.';
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (msg.includes('certificate') || msg.includes('ssl') || msg.includes('tls')) {
|
|
148
|
+
return 'TLS certificate validation failed. If behind a corporate proxy, set NODE_EXTRA_CA_CERTS.';
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (msg.includes('out of memory') || msg.includes('heap')) {
|
|
152
|
+
return 'Try increasing memory with NODE_OPTIONS="--max-old-space-size=4096".';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Verbose / Debug Mode
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
enum LogLevel {
|
|
163
|
+
Quiet = 0,
|
|
164
|
+
Normal = 1,
|
|
165
|
+
Verbose = 2,
|
|
166
|
+
Debug = 3,
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
class Logger {
|
|
170
|
+
constructor(private level: LogLevel) {}
|
|
171
|
+
|
|
172
|
+
error(msg: string, details?: string): void {
|
|
173
|
+
console.error(chalk.red(`Error: ${msg}`));
|
|
174
|
+
if (details && this.level >= LogLevel.Verbose) {
|
|
175
|
+
console.error(chalk.dim(details));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
warn(msg: string): void {
|
|
180
|
+
if (this.level >= LogLevel.Normal) {
|
|
181
|
+
console.error(chalk.yellow(`Warning: ${msg}`));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
info(msg: string): void {
|
|
186
|
+
if (this.level >= LogLevel.Normal) {
|
|
187
|
+
console.error(msg);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
verbose(msg: string): void {
|
|
192
|
+
if (this.level >= LogLevel.Verbose) {
|
|
193
|
+
console.error(chalk.dim(` ${msg}`));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
debug(msg: string): void {
|
|
198
|
+
if (this.level >= LogLevel.Debug) {
|
|
199
|
+
console.error(chalk.gray(`[debug] ${msg}`));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Structured debug: show timing, context
|
|
204
|
+
debugTiming(label: string, startTime: number): void {
|
|
205
|
+
if (this.level >= LogLevel.Debug) {
|
|
206
|
+
const elapsed = Date.now() - startTime;
|
|
207
|
+
console.error(chalk.gray(`[debug] ${label}: ${elapsed}ms`));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Initialize from flags
|
|
213
|
+
function createLogger(options: { verbose?: boolean; quiet?: boolean; debug?: boolean }): Logger {
|
|
214
|
+
if (options.debug) return new Logger(LogLevel.Debug);
|
|
215
|
+
if (options.verbose) return new Logger(LogLevel.Verbose);
|
|
216
|
+
if (options.quiet) return new Logger(LogLevel.Quiet);
|
|
217
|
+
return new Logger(LogLevel.Normal);
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
# Normal output
|
|
223
|
+
$ mycli deploy staging
|
|
224
|
+
Deploying to staging...
|
|
225
|
+
✓ Deployed v1.2.0 to staging
|
|
226
|
+
|
|
227
|
+
# Verbose output
|
|
228
|
+
$ mycli deploy staging --verbose
|
|
229
|
+
Loading config from /home/user/.config/mycli/config.toml
|
|
230
|
+
Resolved environment: staging (from argument)
|
|
231
|
+
Authenticating with token from keyring
|
|
232
|
+
Building from tag v1.2.0
|
|
233
|
+
Deploying to staging...
|
|
234
|
+
Creating deployment manifest
|
|
235
|
+
Uploading 3 artifacts (12.4 MB)
|
|
236
|
+
Running health checks (attempt 1/3)
|
|
237
|
+
✓ Deployed v1.2.0 to staging in 34s
|
|
238
|
+
|
|
239
|
+
# Debug output
|
|
240
|
+
$ mycli deploy staging --debug
|
|
241
|
+
[debug] Config paths searched: .mycli.toml, /home/user/.config/mycli/config.toml
|
|
242
|
+
[debug] Config loaded: { environment: 'staging', replicas: 1 }
|
|
243
|
+
[debug] Auth token expires in 3420s
|
|
244
|
+
[debug] API request: POST https://api.example.com/deployments
|
|
245
|
+
[debug] API response: 201 Created (234ms)
|
|
246
|
+
[debug] Health check: GET https://staging.example.com/healthz -> 200 (89ms)
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Diagnostic Commands
|
|
250
|
+
|
|
251
|
+
### `mycli doctor` / `mycli check`
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
interface Check {
|
|
255
|
+
name: string;
|
|
256
|
+
check: () => Promise<CheckResult>;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
interface CheckResult {
|
|
260
|
+
status: 'ok' | 'warn' | 'fail';
|
|
261
|
+
message: string;
|
|
262
|
+
fix?: string;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const diagnosticChecks: Check[] = [
|
|
266
|
+
{
|
|
267
|
+
name: 'Configuration file',
|
|
268
|
+
check: async () => {
|
|
269
|
+
const configPath = getConfigPath();
|
|
270
|
+
if (fs.existsSync(configPath)) {
|
|
271
|
+
return { status: 'ok', message: `Found at ${configPath}` };
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
status: 'warn',
|
|
275
|
+
message: 'No config file found',
|
|
276
|
+
fix: 'Run `mycli init` to create one',
|
|
277
|
+
};
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
name: 'Authentication',
|
|
282
|
+
check: async () => {
|
|
283
|
+
const token = await getStoredToken();
|
|
284
|
+
if (!token) {
|
|
285
|
+
return { status: 'fail', message: 'Not authenticated', fix: 'Run `mycli auth login`' };
|
|
286
|
+
}
|
|
287
|
+
if (isTokenExpired(token)) {
|
|
288
|
+
return { status: 'fail', message: 'Token expired', fix: 'Run `mycli auth login`' };
|
|
289
|
+
}
|
|
290
|
+
return { status: 'ok', message: `Authenticated as ${token.user}` };
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
name: 'API connectivity',
|
|
295
|
+
check: async () => {
|
|
296
|
+
try {
|
|
297
|
+
const start = Date.now();
|
|
298
|
+
await fetch(`${getApiUrl()}/health`);
|
|
299
|
+
const elapsed = Date.now() - start;
|
|
300
|
+
return { status: 'ok', message: `Reachable (${elapsed}ms)` };
|
|
301
|
+
} catch (error) {
|
|
302
|
+
return {
|
|
303
|
+
status: 'fail',
|
|
304
|
+
message: `Cannot reach API: ${(error as Error).message}`,
|
|
305
|
+
fix: 'Check your network connection and API URL in config',
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
name: 'Required tools',
|
|
312
|
+
check: async () => {
|
|
313
|
+
const missing: string[] = [];
|
|
314
|
+
for (const tool of ['git', 'docker']) {
|
|
315
|
+
try {
|
|
316
|
+
execFileSync('which', [tool], { stdio: 'pipe' });
|
|
317
|
+
} catch {
|
|
318
|
+
missing.push(tool);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (missing.length > 0) {
|
|
322
|
+
return { status: 'fail', message: `Missing: ${missing.join(', ')}`, fix: `Install ${missing.join(' and ')}` };
|
|
323
|
+
}
|
|
324
|
+
return { status: 'ok', message: 'git, docker found' };
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
];
|
|
328
|
+
|
|
329
|
+
async function runDoctor(): Promise<void> {
|
|
330
|
+
console.log(chalk.bold('\nDiagnostics\n'));
|
|
331
|
+
|
|
332
|
+
let hasFailures = false;
|
|
333
|
+
|
|
334
|
+
for (const check of diagnosticChecks) {
|
|
335
|
+
const result = await check.check();
|
|
336
|
+
const icon = result.status === 'ok' ? chalk.green('✓')
|
|
337
|
+
: result.status === 'warn' ? chalk.yellow('⚠')
|
|
338
|
+
: chalk.red('✗');
|
|
339
|
+
|
|
340
|
+
console.log(` ${icon} ${check.name}: ${result.message}`);
|
|
341
|
+
if (result.fix) {
|
|
342
|
+
console.log(chalk.cyan(` Fix: ${result.fix}`));
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (result.status === 'fail') hasFailures = true;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
console.log('');
|
|
349
|
+
process.exit(hasFailures ? 1 : 0);
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
```
|
|
354
|
+
$ mycli doctor
|
|
355
|
+
|
|
356
|
+
Diagnostics
|
|
357
|
+
|
|
358
|
+
✓ Configuration file: Found at /home/user/.config/mycli/config.toml
|
|
359
|
+
✗ Authentication: Token expired
|
|
360
|
+
Fix: Run `mycli auth login`
|
|
361
|
+
✓ API connectivity: Reachable (89ms)
|
|
362
|
+
✓ Required tools: git, docker found
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
## Log File Locations
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
import path from 'path';
|
|
369
|
+
import os from 'os';
|
|
370
|
+
import fs from 'fs';
|
|
371
|
+
|
|
372
|
+
function getLogDir(appName: string): string {
|
|
373
|
+
if (process.platform === 'win32') {
|
|
374
|
+
return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'), appName, 'logs');
|
|
375
|
+
}
|
|
376
|
+
const stateDir = process.env.XDG_STATE_HOME || path.join(os.homedir(), '.local', 'state');
|
|
377
|
+
return path.join(stateDir, appName);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function writeLogFile(appName: string, content: string): string {
|
|
381
|
+
const logDir = getLogDir(appName);
|
|
382
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
383
|
+
|
|
384
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
385
|
+
const logPath = path.join(logDir, `${appName}-${timestamp}.log`);
|
|
386
|
+
|
|
387
|
+
fs.writeFileSync(logPath, content, 'utf-8');
|
|
388
|
+
|
|
389
|
+
// Rotate: keep only last 10 log files
|
|
390
|
+
const files = fs.readdirSync(logDir)
|
|
391
|
+
.filter((f) => f.endsWith('.log'))
|
|
392
|
+
.sort()
|
|
393
|
+
.reverse();
|
|
394
|
+
|
|
395
|
+
for (const file of files.slice(10)) {
|
|
396
|
+
fs.unlinkSync(path.join(logDir, file));
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return logPath;
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
## Crash Report Formatting
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
function generateCrashReport(error: Error): string {
|
|
407
|
+
const report = [
|
|
408
|
+
`mycli crash report`,
|
|
409
|
+
`==================`,
|
|
410
|
+
``,
|
|
411
|
+
`Date: ${new Date().toISOString()}`,
|
|
412
|
+
`Version: ${getVersion()}`,
|
|
413
|
+
`Node.js: ${process.version}`,
|
|
414
|
+
`OS: ${os.platform()} ${os.release()} (${os.arch()})`,
|
|
415
|
+
`Shell: ${process.env.SHELL || process.env.ComSpec || 'unknown'}`,
|
|
416
|
+
``,
|
|
417
|
+
`Error: ${error.message}`,
|
|
418
|
+
``,
|
|
419
|
+
`Stack trace:`,
|
|
420
|
+
error.stack || ' (no stack trace available)',
|
|
421
|
+
``,
|
|
422
|
+
`Configuration:`,
|
|
423
|
+
` Config path: ${getConfigPath() || 'not found'}`,
|
|
424
|
+
` API URL: ${getApiUrl()}`,
|
|
425
|
+
``,
|
|
426
|
+
`Environment:`,
|
|
427
|
+
` MYCLI_* vars: ${Object.keys(process.env).filter((k) => k.startsWith('MYCLI_')).join(', ') || 'none'}`,
|
|
428
|
+
` NODE_ENV: ${process.env.NODE_ENV || 'not set'}`,
|
|
429
|
+
` CI: ${process.env.CI || 'not set'}`,
|
|
430
|
+
].join('\n');
|
|
431
|
+
|
|
432
|
+
return report;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
function handleUnexpectedError(error: Error): never {
|
|
436
|
+
const report = generateCrashReport(error);
|
|
437
|
+
const logPath = writeLogFile('mycli', report);
|
|
438
|
+
|
|
439
|
+
console.error(formatError({
|
|
440
|
+
message: 'An unexpected error occurred.',
|
|
441
|
+
code: 'CRASH',
|
|
442
|
+
fix: [
|
|
443
|
+
`A crash report has been saved to: ${logPath}`,
|
|
444
|
+
`Please file an issue at https://github.com/example/mycli/issues`,
|
|
445
|
+
`and include the crash report.`,
|
|
446
|
+
].join('\n '),
|
|
447
|
+
}));
|
|
448
|
+
|
|
449
|
+
process.exit(70);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Global error handlers
|
|
453
|
+
process.on('uncaughtException', handleUnexpectedError);
|
|
454
|
+
process.on('unhandledRejection', (reason) => {
|
|
455
|
+
handleUnexpectedError(reason instanceof Error ? reason : new Error(String(reason)));
|
|
456
|
+
});
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
## Error Codes
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
// Define a complete error code catalog
|
|
463
|
+
const ERROR_CODES = {
|
|
464
|
+
// Authentication (100-199)
|
|
465
|
+
AUTH_EXPIRED: { code: 100, exit: 77, message: 'Authentication token has expired' },
|
|
466
|
+
AUTH_INVALID: { code: 101, exit: 77, message: 'Invalid authentication credentials' },
|
|
467
|
+
AUTH_MISSING: { code: 102, exit: 77, message: 'No authentication credentials found' },
|
|
468
|
+
|
|
469
|
+
// Configuration (200-299)
|
|
470
|
+
CONFIG_NOT_FOUND: { code: 200, exit: 65, message: 'Configuration file not found' },
|
|
471
|
+
CONFIG_INVALID: { code: 201, exit: 65, message: 'Configuration file is invalid' },
|
|
472
|
+
CONFIG_VERSION: { code: 202, exit: 65, message: 'Configuration version not supported' },
|
|
473
|
+
|
|
474
|
+
// Network (300-399)
|
|
475
|
+
NET_UNREACHABLE: { code: 300, exit: 69, message: 'API server is unreachable' },
|
|
476
|
+
NET_TIMEOUT: { code: 301, exit: 69, message: 'Request timed out' },
|
|
477
|
+
NET_SSL: { code: 302, exit: 69, message: 'TLS certificate verification failed' },
|
|
478
|
+
|
|
479
|
+
// Input (400-499)
|
|
480
|
+
INPUT_INVALID: { code: 400, exit: 65, message: 'Invalid input data' },
|
|
481
|
+
INPUT_MISSING: { code: 401, exit: 64, message: 'Required input not provided' },
|
|
482
|
+
} as const;
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**Rule**: Error codes should be documented in `mycli --help` or `mycli help errors` so users and scripts can handle specific failures.
|
|
486
|
+
|
|
487
|
+
## Colored Error Output
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
// Error output respects NO_COLOR and non-TTY
|
|
491
|
+
function printError(error: CliError): void {
|
|
492
|
+
const useColor = process.stderr.isTTY && process.env.NO_COLOR === undefined;
|
|
493
|
+
|
|
494
|
+
const red = useColor ? (s: string) => `\x1b[31m${s}\x1b[0m` : (s: string) => s;
|
|
495
|
+
const dim = useColor ? (s: string) => `\x1b[2m${s}\x1b[0m` : (s: string) => s;
|
|
496
|
+
const cyan = useColor ? (s: string) => `\x1b[36m${s}\x1b[0m` : (s: string) => s;
|
|
497
|
+
|
|
498
|
+
process.stderr.write(red(`Error: ${error.message}`) + '\n');
|
|
499
|
+
if (error.cause) process.stderr.write(dim(` Cause: ${error.cause}`) + '\n');
|
|
500
|
+
if (error.fix) process.stderr.write(cyan(` Fix: ${error.fix}`) + '\n');
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## Output Checklist
|
|
505
|
+
|
|
506
|
+
- [ ] Every error message includes what happened, why, and how to fix it
|
|
507
|
+
- [ ] "Did you mean?" suggestions for typos in commands and flags
|
|
508
|
+
- [ ] `--verbose` flag shows detailed progress and context
|
|
509
|
+
- [ ] `--debug` flag shows raw API requests, timing, and internal state
|
|
510
|
+
- [ ] `mycli doctor` command checks all prerequisites and dependencies
|
|
511
|
+
- [ ] Log files written to XDG state directory with automatic rotation
|
|
512
|
+
- [ ] Crash reports include version, OS, Node.js version, and sanitized config
|
|
513
|
+
- [ ] Defined error codes documented and machine-readable
|
|
514
|
+
- [ ] Errors go to stderr, never stdout
|
|
515
|
+
- [ ] Colors degrade gracefully with NO_COLOR and non-TTY
|