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,477 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cli-ux-design
|
|
3
|
+
description: Terminal user experience patterns covering argument conventions, help text, colored output, progress indicators, interactive prompts, table formatting, exit codes, and subcommand design. Use when building command-line tools that need professional, user-friendly terminal interfaces.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CLI UX Design
|
|
8
|
+
|
|
9
|
+
Build command-line tools with professional terminal UX that follows established conventions and degrades gracefully.
|
|
10
|
+
|
|
11
|
+
## Argument and Flag Conventions
|
|
12
|
+
|
|
13
|
+
### POSIX / GNU Standards
|
|
14
|
+
|
|
15
|
+
| Convention | Example | Rule |
|
|
16
|
+
|-----------|---------|------|
|
|
17
|
+
| Short flags | `-v`, `-f` | Single character, single dash |
|
|
18
|
+
| Long flags | `--verbose`, `--file` | Full word, double dash |
|
|
19
|
+
| Combined short flags | `-vf` (same as `-v -f`) | Only boolean flags combine |
|
|
20
|
+
| Flag with value | `-f output.txt` or `--file=output.txt` | Space or `=` separator |
|
|
21
|
+
| Positional arguments | `mycli build src/` | After all flags |
|
|
22
|
+
| `--` separator | `mycli -- -f` | Everything after `--` is positional |
|
|
23
|
+
| Standard flags | `--help`, `--version`, `--verbose`, `--quiet` | Always implement these |
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// Node.js - Commander.js argument definitions
|
|
27
|
+
import { Command } from 'commander';
|
|
28
|
+
|
|
29
|
+
const program = new Command();
|
|
30
|
+
|
|
31
|
+
program
|
|
32
|
+
.name('deploy')
|
|
33
|
+
.description('Deploy application to production')
|
|
34
|
+
.version('1.2.0', '-V, --version', 'Display version number')
|
|
35
|
+
.argument('<environment>', 'Target environment (staging, production)')
|
|
36
|
+
.option('-f, --force', 'Skip confirmation prompts')
|
|
37
|
+
.option('-t, --tag <tag>', 'Deploy specific git tag')
|
|
38
|
+
.option('-r, --replicas <count>', 'Number of replicas', parseInt, 3)
|
|
39
|
+
.option('--no-cache', 'Build without cache')
|
|
40
|
+
.option('--dry-run', 'Show what would happen without executing')
|
|
41
|
+
.option('-v, --verbose', 'Enable verbose output')
|
|
42
|
+
.option('-q, --quiet', 'Suppress all output except errors')
|
|
43
|
+
.action(async (environment, options) => {
|
|
44
|
+
await deploy(environment, options);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
program.parse();
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```rust
|
|
51
|
+
// Rust - clap argument definitions
|
|
52
|
+
use clap::Parser;
|
|
53
|
+
|
|
54
|
+
#[derive(Parser)]
|
|
55
|
+
#[command(name = "deploy")]
|
|
56
|
+
#[command(about = "Deploy application to production")]
|
|
57
|
+
#[command(version)]
|
|
58
|
+
struct Cli {
|
|
59
|
+
/// Target environment (staging, production)
|
|
60
|
+
environment: String,
|
|
61
|
+
|
|
62
|
+
/// Skip confirmation prompts
|
|
63
|
+
#[arg(short, long)]
|
|
64
|
+
force: bool,
|
|
65
|
+
|
|
66
|
+
/// Deploy specific git tag
|
|
67
|
+
#[arg(short, long)]
|
|
68
|
+
tag: Option<String>,
|
|
69
|
+
|
|
70
|
+
/// Number of replicas
|
|
71
|
+
#[arg(short, long, default_value_t = 3)]
|
|
72
|
+
replicas: u32,
|
|
73
|
+
|
|
74
|
+
/// Build without cache
|
|
75
|
+
#[arg(long)]
|
|
76
|
+
no_cache: bool,
|
|
77
|
+
|
|
78
|
+
/// Show what would happen without executing
|
|
79
|
+
#[arg(long)]
|
|
80
|
+
dry_run: bool,
|
|
81
|
+
|
|
82
|
+
/// Enable verbose output
|
|
83
|
+
#[arg(short, long)]
|
|
84
|
+
verbose: bool,
|
|
85
|
+
|
|
86
|
+
/// Suppress all output except errors
|
|
87
|
+
#[arg(short, long)]
|
|
88
|
+
quiet: bool,
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Rule**: Every CLI must support `--help` and `--version`. These are non-negotiable.
|
|
93
|
+
**Anti-pattern**: Flags that require values but accept no space separator (`-foutput.txt`). Always support both `-f output.txt` and `--file=output.txt`.
|
|
94
|
+
|
|
95
|
+
## Help Text Formatting
|
|
96
|
+
|
|
97
|
+
Follow the `man` page convention: NAME, SYNOPSIS, DESCRIPTION, OPTIONS, EXAMPLES, EXIT STATUS.
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
USAGE:
|
|
101
|
+
deploy <environment> [options]
|
|
102
|
+
|
|
103
|
+
ARGUMENTS:
|
|
104
|
+
environment Target environment (staging, production)
|
|
105
|
+
|
|
106
|
+
OPTIONS:
|
|
107
|
+
-f, --force Skip confirmation prompts
|
|
108
|
+
-t, --tag <tag> Deploy specific git tag
|
|
109
|
+
-r, --replicas <count> Number of replicas (default: 3)
|
|
110
|
+
--no-cache Build without cache
|
|
111
|
+
--dry-run Show what would happen without executing
|
|
112
|
+
-v, --verbose Enable verbose output
|
|
113
|
+
-q, --quiet Suppress all output except errors
|
|
114
|
+
-h, --help Show this help message
|
|
115
|
+
-V, --version Show version number
|
|
116
|
+
|
|
117
|
+
EXAMPLES:
|
|
118
|
+
deploy staging Deploy to staging with defaults
|
|
119
|
+
deploy production --tag v1.2.0 Deploy specific tag to production
|
|
120
|
+
deploy staging --dry-run --verbose Preview staging deployment
|
|
121
|
+
|
|
122
|
+
ENVIRONMENT VARIABLES:
|
|
123
|
+
DEPLOY_TOKEN Authentication token (required)
|
|
124
|
+
DEPLOY_REGION Target region (default: us-east-1)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Rule**: Align option descriptions vertically. Short flag, long flag, value placeholder, then description.
|
|
128
|
+
**Rule**: Include at least 2-3 real-world examples in `--help` output. Examples are the most-read part of help text.
|
|
129
|
+
|
|
130
|
+
## Colored Output with NO_COLOR / TERM Support
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import chalk from 'chalk';
|
|
134
|
+
|
|
135
|
+
// Respect NO_COLOR standard (https://no-color.org)
|
|
136
|
+
// chalk does this automatically, but verify for custom implementations
|
|
137
|
+
function supportsColor(): boolean {
|
|
138
|
+
if (process.env.NO_COLOR !== undefined) return false;
|
|
139
|
+
if (process.env.FORCE_COLOR !== undefined) return true;
|
|
140
|
+
if (!process.stdout.isTTY) return false;
|
|
141
|
+
if (process.env.TERM === 'dumb') return false;
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Semantic color usage
|
|
146
|
+
const log = {
|
|
147
|
+
success: (msg: string) => console.log(chalk.green(` ✓ ${msg}`)),
|
|
148
|
+
error: (msg: string) => console.error(chalk.red(` ✗ ${msg}`)),
|
|
149
|
+
warning: (msg: string) => console.error(chalk.yellow(` ⚠ ${msg}`)),
|
|
150
|
+
info: (msg: string) => console.log(chalk.blue(` ℹ ${msg}`)),
|
|
151
|
+
dim: (msg: string) => console.log(chalk.dim(` ${msg}`)),
|
|
152
|
+
heading: (msg: string) => console.log(chalk.bold(`\n${msg}`)),
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// Usage
|
|
156
|
+
log.heading('Deploying to production');
|
|
157
|
+
log.info('Building from tag v1.2.0');
|
|
158
|
+
log.success('Build completed in 23s');
|
|
159
|
+
log.warning('Cache was stale, rebuilt from scratch');
|
|
160
|
+
log.error('Health check failed after 3 retries');
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Rule**: Errors and warnings go to `stderr`. Success and info go to `stdout`. This allows `mycli 2>/dev/null` to show only results.
|
|
164
|
+
**Rule**: Never use color as the only indicator of meaning. Pair with symbols: checkmark for success, X for error, triangle for warning.
|
|
165
|
+
|
|
166
|
+
## Progress Bars and Spinners
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import ora from 'ora';
|
|
170
|
+
import cliProgress from 'cli-progress';
|
|
171
|
+
|
|
172
|
+
// Spinner for indeterminate operations
|
|
173
|
+
async function withSpinner<T>(label: string, fn: () => Promise<T>): Promise<T> {
|
|
174
|
+
const spinner = ora(label).start();
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const result = await fn();
|
|
178
|
+
spinner.succeed();
|
|
179
|
+
return result;
|
|
180
|
+
} catch (error) {
|
|
181
|
+
spinner.fail();
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Usage
|
|
187
|
+
const config = await withSpinner('Loading configuration', loadConfig);
|
|
188
|
+
await withSpinner('Deploying to staging', () => deploy('staging'));
|
|
189
|
+
|
|
190
|
+
// Progress bar for determinate operations
|
|
191
|
+
function downloadWithProgress(url: string, total: number) {
|
|
192
|
+
const bar = new cliProgress.SingleBar({
|
|
193
|
+
format: ' Downloading |{bar}| {percentage}% | {value}/{total} MB',
|
|
194
|
+
barCompleteChar: '█',
|
|
195
|
+
barIncompleteChar: '░',
|
|
196
|
+
hideCursor: true,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
bar.start(total, 0);
|
|
200
|
+
|
|
201
|
+
// Update during download
|
|
202
|
+
onProgress((downloaded) => bar.update(downloaded));
|
|
203
|
+
onComplete(() => bar.stop());
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Rule**: Use spinners for operations with unknown duration. Use progress bars for operations with measurable progress.
|
|
208
|
+
**Anti-pattern**: Showing a spinner on a non-TTY. Check `process.stdout.isTTY` and fall back to simple log lines.
|
|
209
|
+
|
|
210
|
+
## Interactive Prompts with Non-TTY Fallback
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
import inquirer from 'inquirer';
|
|
214
|
+
|
|
215
|
+
async function confirmDeployment(environment: string, options: DeployOptions): Promise<boolean> {
|
|
216
|
+
// Non-interactive mode: use --force flag
|
|
217
|
+
if (!process.stdin.isTTY || options.force) {
|
|
218
|
+
if (!options.force) {
|
|
219
|
+
console.error('Error: Confirmation required. Use --force to skip or run in an interactive terminal.');
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const { confirmed } = await inquirer.prompt([
|
|
226
|
+
{
|
|
227
|
+
type: 'confirm',
|
|
228
|
+
name: 'confirmed',
|
|
229
|
+
message: `Deploy to ${environment}? This will affect live users.`,
|
|
230
|
+
default: false,
|
|
231
|
+
},
|
|
232
|
+
]);
|
|
233
|
+
|
|
234
|
+
return confirmed;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Select prompt with search
|
|
238
|
+
async function selectEnvironment(): Promise<string> {
|
|
239
|
+
if (!process.stdin.isTTY) {
|
|
240
|
+
console.error('Error: Environment selection requires an interactive terminal. Pass environment as argument.');
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const { environment } = await inquirer.prompt([
|
|
245
|
+
{
|
|
246
|
+
type: 'list',
|
|
247
|
+
name: 'environment',
|
|
248
|
+
message: 'Select target environment:',
|
|
249
|
+
choices: [
|
|
250
|
+
{ name: 'Development', value: 'dev' },
|
|
251
|
+
{ name: 'Staging', value: 'staging' },
|
|
252
|
+
{ name: 'Production (requires approval)', value: 'production' },
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
]);
|
|
256
|
+
|
|
257
|
+
return environment;
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Rule**: Every interactive prompt must have a non-interactive equivalent (flag or argument). CI/CD pipelines do not have TTYs.
|
|
262
|
+
|
|
263
|
+
## Table and List Formatting
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
import { table } from 'table';
|
|
267
|
+
|
|
268
|
+
// Simple aligned table
|
|
269
|
+
function printTable(headers: string[], rows: string[][]) {
|
|
270
|
+
const config = {
|
|
271
|
+
border: {
|
|
272
|
+
topBody: '─', topJoin: '┬', topLeft: '┌', topRight: '┐',
|
|
273
|
+
bottomBody: '─', bottomJoin: '┴', bottomLeft: '└', bottomRight: '┘',
|
|
274
|
+
bodyLeft: '│', bodyRight: '│', bodyJoin: '│',
|
|
275
|
+
joinBody: '─', joinLeft: '├', joinRight: '┤', joinJoin: '┼',
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
console.log(table([headers, ...rows], config));
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// For machine consumption, output JSON
|
|
283
|
+
function printOutput(data: unknown[], format: 'table' | 'json' | 'csv') {
|
|
284
|
+
switch (format) {
|
|
285
|
+
case 'json':
|
|
286
|
+
console.log(JSON.stringify(data, null, 2));
|
|
287
|
+
break;
|
|
288
|
+
case 'csv':
|
|
289
|
+
console.log(toCsv(data));
|
|
290
|
+
break;
|
|
291
|
+
case 'table':
|
|
292
|
+
default:
|
|
293
|
+
printTable(Object.keys(data[0] as object), data.map((row) => Object.values(row as object).map(String)));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
┌─────────────┬──────────┬────────┬─────────┐
|
|
300
|
+
│ Environment │ Status │ Uptime │ Version │
|
|
301
|
+
├─────────────┼──────────┼────────┼─────────┤
|
|
302
|
+
│ production │ healthy │ 14d │ v1.2.0 │
|
|
303
|
+
│ staging │ healthy │ 3d │ v1.3.0 │
|
|
304
|
+
│ development │ degraded │ 1h │ v1.3.1 │
|
|
305
|
+
└─────────────┴──────────┴────────┴─────────┘
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Paging Long Output
|
|
309
|
+
|
|
310
|
+
```typescript
|
|
311
|
+
import { spawn } from 'child_process';
|
|
312
|
+
|
|
313
|
+
function pageOutput(content: string) {
|
|
314
|
+
if (!process.stdout.isTTY) {
|
|
315
|
+
// Not a terminal, just print
|
|
316
|
+
process.stdout.write(content);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const pager = process.env.PAGER || 'less';
|
|
321
|
+
const pagerProcess = spawn(pager, ['-R'], { // -R for color passthrough
|
|
322
|
+
stdio: ['pipe', process.stdout, process.stderr],
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
pagerProcess.stdin.write(content);
|
|
326
|
+
pagerProcess.stdin.end();
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## Exit Codes and Meanings
|
|
331
|
+
|
|
332
|
+
| Code | Meaning | When to Use |
|
|
333
|
+
|------|---------|-------------|
|
|
334
|
+
| 0 | Success | Operation completed without errors |
|
|
335
|
+
| 1 | General error | Catch-all for failures |
|
|
336
|
+
| 2 | Misuse of command | Invalid arguments, missing required flags |
|
|
337
|
+
| 64 | Usage error (EX_USAGE) | Incorrect usage syntax |
|
|
338
|
+
| 65 | Data error (EX_DATAERR) | Input data was incorrect |
|
|
339
|
+
| 69 | Unavailable (EX_UNAVAILABLE) | Service unavailable |
|
|
340
|
+
| 70 | Internal error (EX_SOFTWARE) | Unexpected internal error |
|
|
341
|
+
| 73 | Can't create (EX_CANTCREAT) | Cannot create output file |
|
|
342
|
+
| 77 | Permission denied (EX_NOPERM) | Insufficient permissions |
|
|
343
|
+
| 130 | Interrupted (SIGINT) | User pressed Ctrl+C |
|
|
344
|
+
|
|
345
|
+
```typescript
|
|
346
|
+
// Define exit codes as constants
|
|
347
|
+
const EXIT = {
|
|
348
|
+
SUCCESS: 0,
|
|
349
|
+
ERROR: 1,
|
|
350
|
+
INVALID_ARGS: 2,
|
|
351
|
+
AUTH_FAILED: 77,
|
|
352
|
+
SERVICE_UNAVAILABLE: 69,
|
|
353
|
+
} as const;
|
|
354
|
+
|
|
355
|
+
// Use in main function
|
|
356
|
+
async function main() {
|
|
357
|
+
try {
|
|
358
|
+
const args = parseArgs(process.argv.slice(2));
|
|
359
|
+
if (!args) process.exit(EXIT.INVALID_ARGS);
|
|
360
|
+
|
|
361
|
+
await run(args);
|
|
362
|
+
process.exit(EXIT.SUCCESS);
|
|
363
|
+
} catch (error) {
|
|
364
|
+
if (error instanceof AuthError) process.exit(EXIT.AUTH_FAILED);
|
|
365
|
+
if (error instanceof NetworkError) process.exit(EXIT.SERVICE_UNAVAILABLE);
|
|
366
|
+
console.error(chalk.red(`Error: ${(error as Error).message}`));
|
|
367
|
+
process.exit(EXIT.ERROR);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**Rule**: Exit code 0 means success. Any non-zero means failure. Scripts and CI depend on this.
|
|
373
|
+
|
|
374
|
+
## stderr vs stdout Separation
|
|
375
|
+
|
|
376
|
+
| Stream | Content |
|
|
377
|
+
|--------|---------|
|
|
378
|
+
| `stdout` | Results, data, formatted output (piped to next command or file) |
|
|
379
|
+
| `stderr` | Errors, warnings, progress indicators, debug info (shown to user) |
|
|
380
|
+
|
|
381
|
+
```typescript
|
|
382
|
+
// Correct separation
|
|
383
|
+
console.log(JSON.stringify(results)); // stdout: pipeable data
|
|
384
|
+
console.error('Processing complete'); // stderr: status message
|
|
385
|
+
console.error(`Processed ${count} items`); // stderr: progress info
|
|
386
|
+
|
|
387
|
+
// Example: mycli list --format json 2>/dev/null | jq '.name'
|
|
388
|
+
// stdout (JSON data) goes to jq, stderr (progress) goes to /dev/null
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## Subcommand Patterns
|
|
392
|
+
|
|
393
|
+
```
|
|
394
|
+
mycli <command> [subcommand] [options] [arguments]
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
// Commander.js - Subcommand pattern
|
|
399
|
+
const program = new Command();
|
|
400
|
+
|
|
401
|
+
program
|
|
402
|
+
.name('mycli')
|
|
403
|
+
.description('My application CLI')
|
|
404
|
+
.version('1.0.0');
|
|
405
|
+
|
|
406
|
+
// mycli deploy <env>
|
|
407
|
+
program
|
|
408
|
+
.command('deploy')
|
|
409
|
+
.description('Deploy to an environment')
|
|
410
|
+
.argument('<environment>')
|
|
411
|
+
.option('--tag <tag>', 'Git tag to deploy')
|
|
412
|
+
.action(deploy);
|
|
413
|
+
|
|
414
|
+
// mycli config get <key>
|
|
415
|
+
const configCmd = program
|
|
416
|
+
.command('config')
|
|
417
|
+
.description('Manage configuration');
|
|
418
|
+
|
|
419
|
+
configCmd
|
|
420
|
+
.command('get')
|
|
421
|
+
.argument('<key>')
|
|
422
|
+
.description('Get a configuration value')
|
|
423
|
+
.action(configGet);
|
|
424
|
+
|
|
425
|
+
configCmd
|
|
426
|
+
.command('set')
|
|
427
|
+
.argument('<key>')
|
|
428
|
+
.argument('<value>')
|
|
429
|
+
.description('Set a configuration value')
|
|
430
|
+
.action(configSet);
|
|
431
|
+
|
|
432
|
+
configCmd
|
|
433
|
+
.command('list')
|
|
434
|
+
.description('List all configuration values')
|
|
435
|
+
.option('--format <format>', 'Output format', 'table')
|
|
436
|
+
.action(configList);
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## Version Display Conventions
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
$ mycli --version
|
|
443
|
+
mycli 1.2.0
|
|
444
|
+
|
|
445
|
+
$ mycli --version --verbose
|
|
446
|
+
mycli 1.2.0
|
|
447
|
+
Node.js: v20.11.0
|
|
448
|
+
OS: linux x64
|
|
449
|
+
Config: /home/user/.config/mycli/config.toml
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
## Popular CLI Libraries
|
|
453
|
+
|
|
454
|
+
| Language | Library | Strengths |
|
|
455
|
+
|----------|---------|-----------|
|
|
456
|
+
| Node.js | Commander.js | Simple, well-documented, widely used |
|
|
457
|
+
| Node.js | yargs | Rich feature set, middleware support |
|
|
458
|
+
| Node.js | Clipanion | Type-safe, used by Yarn |
|
|
459
|
+
| Deno | Cliffy | Native Deno support, inspired by Commander |
|
|
460
|
+
| Rust | clap | Derive macros, shell completions, fast |
|
|
461
|
+
| Go | cobra | Industry standard, used by kubectl, Hugo |
|
|
462
|
+
| Python | click | Decorator-based, composable |
|
|
463
|
+
| Python | typer | Type hints to CLI, built on click |
|
|
464
|
+
|
|
465
|
+
## Output Checklist
|
|
466
|
+
|
|
467
|
+
- [ ] `--help` and `--version` flags implemented
|
|
468
|
+
- [ ] Arguments follow POSIX/GNU conventions
|
|
469
|
+
- [ ] Help text includes real-world examples
|
|
470
|
+
- [ ] Colors respect NO_COLOR and non-TTY environments
|
|
471
|
+
- [ ] Errors and progress go to stderr, data goes to stdout
|
|
472
|
+
- [ ] Spinners/progress bars degrade to log lines on non-TTY
|
|
473
|
+
- [ ] Interactive prompts have non-interactive equivalents
|
|
474
|
+
- [ ] Table output has JSON/CSV alternative (`--format` flag)
|
|
475
|
+
- [ ] Exit codes follow Unix conventions (0 = success)
|
|
476
|
+
- [ ] Long output is paged when running in a terminal
|
|
477
|
+
- [ ] Subcommands have individual help text
|