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,479 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cli-shell-integration
|
|
3
|
+
description: Shell integration patterns for CLI tools covering completion generation, man pages, piping, signal handling, stdin processing, and cross-platform shell support. Use when building CLI tools that need deep integration with bash, zsh, fish, and PowerShell.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CLI Shell Integration
|
|
8
|
+
|
|
9
|
+
Build CLI tools that integrate seamlessly with shell environments through completions, piping, signals, and cross-platform support.
|
|
10
|
+
|
|
11
|
+
## Shell Completion Generation
|
|
12
|
+
|
|
13
|
+
Tab completion is the single most impactful UX feature for CLI tools. Generate completions for all major shells.
|
|
14
|
+
|
|
15
|
+
### Bash Completions
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Generated completion script for bash
|
|
19
|
+
# Install: mycli completion bash > /etc/bash_completion.d/mycli
|
|
20
|
+
# Or: mycli completion bash >> ~/.bashrc
|
|
21
|
+
|
|
22
|
+
_mycli_completions() {
|
|
23
|
+
local cur prev words cword
|
|
24
|
+
_init_completion || return
|
|
25
|
+
|
|
26
|
+
case "${prev}" in
|
|
27
|
+
deploy)
|
|
28
|
+
COMPREPLY=($(compgen -W "staging production dev" -- "${cur}"))
|
|
29
|
+
return
|
|
30
|
+
;;
|
|
31
|
+
--format|-f)
|
|
32
|
+
COMPREPLY=($(compgen -W "table json csv" -- "${cur}"))
|
|
33
|
+
return
|
|
34
|
+
;;
|
|
35
|
+
--tag|-t)
|
|
36
|
+
# Dynamic completion: fetch git tags
|
|
37
|
+
COMPREPLY=($(compgen -W "$(git tag 2>/dev/null)" -- "${cur}"))
|
|
38
|
+
return
|
|
39
|
+
;;
|
|
40
|
+
esac
|
|
41
|
+
|
|
42
|
+
if [[ "${cur}" == -* ]]; then
|
|
43
|
+
COMPREPLY=($(compgen -W "--help --version --verbose --quiet --force --format --tag --dry-run" -- "${cur}"))
|
|
44
|
+
return
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
COMPREPLY=($(compgen -W "deploy status logs config auth" -- "${cur}"))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
complete -F _mycli_completions mycli
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Zsh Completions
|
|
54
|
+
|
|
55
|
+
```zsh
|
|
56
|
+
# Generated completion script for zsh
|
|
57
|
+
# Install: mycli completion zsh > "${fpath[1]}/_mycli"
|
|
58
|
+
|
|
59
|
+
#compdef mycli
|
|
60
|
+
|
|
61
|
+
_mycli() {
|
|
62
|
+
local -a commands
|
|
63
|
+
commands=(
|
|
64
|
+
'deploy:Deploy to an environment'
|
|
65
|
+
'status:Show deployment status'
|
|
66
|
+
'logs:View application logs'
|
|
67
|
+
'config:Manage configuration'
|
|
68
|
+
'auth:Authentication commands'
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
_arguments -C \
|
|
72
|
+
'(-h --help)'{-h,--help}'[Show help]' \
|
|
73
|
+
'(-V --version)'{-V,--version}'[Show version]' \
|
|
74
|
+
'(-v --verbose)'{-v,--verbose}'[Verbose output]' \
|
|
75
|
+
'1:command:->command' \
|
|
76
|
+
'*::arg:->args'
|
|
77
|
+
|
|
78
|
+
case $state in
|
|
79
|
+
command)
|
|
80
|
+
_describe 'command' commands
|
|
81
|
+
;;
|
|
82
|
+
args)
|
|
83
|
+
case $words[1] in
|
|
84
|
+
deploy)
|
|
85
|
+
_arguments \
|
|
86
|
+
'1:environment:(staging production dev)' \
|
|
87
|
+
'(-t --tag)'{-t,--tag}'[Git tag]:tag:_git_tags' \
|
|
88
|
+
'(-f --force)'{-f,--force}'[Skip confirmation]' \
|
|
89
|
+
'--dry-run[Preview only]' \
|
|
90
|
+
'--no-cache[Build without cache]'
|
|
91
|
+
;;
|
|
92
|
+
config)
|
|
93
|
+
local -a config_commands
|
|
94
|
+
config_commands=(
|
|
95
|
+
'get:Get a config value'
|
|
96
|
+
'set:Set a config value'
|
|
97
|
+
'list:List all config values'
|
|
98
|
+
)
|
|
99
|
+
_describe 'config command' config_commands
|
|
100
|
+
;;
|
|
101
|
+
esac
|
|
102
|
+
;;
|
|
103
|
+
esac
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
_mycli
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Fish Completions
|
|
110
|
+
|
|
111
|
+
```fish
|
|
112
|
+
# Generated completion script for fish
|
|
113
|
+
# Install: mycli completion fish > ~/.config/fish/completions/mycli.fish
|
|
114
|
+
|
|
115
|
+
# Disable file completions for mycli
|
|
116
|
+
complete -c mycli -f
|
|
117
|
+
|
|
118
|
+
# Top-level commands
|
|
119
|
+
complete -c mycli -n __fish_use_subcommand -a deploy -d 'Deploy to an environment'
|
|
120
|
+
complete -c mycli -n __fish_use_subcommand -a status -d 'Show deployment status'
|
|
121
|
+
complete -c mycli -n __fish_use_subcommand -a logs -d 'View application logs'
|
|
122
|
+
complete -c mycli -n __fish_use_subcommand -a config -d 'Manage configuration'
|
|
123
|
+
|
|
124
|
+
# Global flags
|
|
125
|
+
complete -c mycli -s h -l help -d 'Show help'
|
|
126
|
+
complete -c mycli -s V -l version -d 'Show version'
|
|
127
|
+
complete -c mycli -s v -l verbose -d 'Verbose output'
|
|
128
|
+
|
|
129
|
+
# Deploy subcommand
|
|
130
|
+
complete -c mycli -n '__fish_seen_subcommand_from deploy' -a 'staging production dev'
|
|
131
|
+
complete -c mycli -n '__fish_seen_subcommand_from deploy' -s t -l tag -d 'Git tag' -r
|
|
132
|
+
complete -c mycli -n '__fish_seen_subcommand_from deploy' -s f -l force -d 'Skip confirmation'
|
|
133
|
+
complete -c mycli -n '__fish_seen_subcommand_from deploy' -l dry-run -d 'Preview only'
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### PowerShell Completions
|
|
137
|
+
|
|
138
|
+
```powershell
|
|
139
|
+
# Generated completion script for PowerShell
|
|
140
|
+
# Install: mycli completion powershell >> $PROFILE
|
|
141
|
+
|
|
142
|
+
Register-ArgumentCompleter -CommandName mycli -Native -ScriptBlock {
|
|
143
|
+
param($wordToComplete, $commandAst, $cursorPosition)
|
|
144
|
+
|
|
145
|
+
$commands = @{
|
|
146
|
+
'deploy' = 'Deploy to an environment'
|
|
147
|
+
'status' = 'Show deployment status'
|
|
148
|
+
'logs' = 'View application logs'
|
|
149
|
+
'config' = 'Manage configuration'
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
$words = $commandAst.ToString().Split(' ')
|
|
153
|
+
|
|
154
|
+
if ($words.Count -eq 2) {
|
|
155
|
+
$commands.GetEnumerator() | Where-Object { $_.Key -like "$wordToComplete*" } | ForEach-Object {
|
|
156
|
+
[System.Management.Automation.CompletionResult]::new($_.Key, $_.Key, 'ParameterValue', $_.Value)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Programmatic Completion Generation
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// Node.js - Generate completions from Commander.js definitions
|
|
166
|
+
import { Command } from 'commander';
|
|
167
|
+
|
|
168
|
+
function generateCompletions(program: Command, shell: 'bash' | 'zsh' | 'fish' | 'powershell'): string {
|
|
169
|
+
const commands = program.commands.map((cmd) => ({
|
|
170
|
+
name: cmd.name(),
|
|
171
|
+
description: cmd.description(),
|
|
172
|
+
options: cmd.options.map((opt) => ({
|
|
173
|
+
short: opt.short,
|
|
174
|
+
long: opt.long,
|
|
175
|
+
description: opt.description,
|
|
176
|
+
required: opt.required,
|
|
177
|
+
})),
|
|
178
|
+
}));
|
|
179
|
+
|
|
180
|
+
switch (shell) {
|
|
181
|
+
case 'bash': return generateBashCompletions(program.name(), commands);
|
|
182
|
+
case 'zsh': return generateZshCompletions(program.name(), commands);
|
|
183
|
+
case 'fish': return generateFishCompletions(program.name(), commands);
|
|
184
|
+
case 'powershell': return generatePowerShellCompletions(program.name(), commands);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Add completion subcommand
|
|
189
|
+
program
|
|
190
|
+
.command('completion')
|
|
191
|
+
.argument('<shell>', 'Shell type: bash, zsh, fish, powershell')
|
|
192
|
+
.description('Generate shell completion script')
|
|
193
|
+
.action((shell) => {
|
|
194
|
+
console.log(generateCompletions(program, shell));
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Rule**: Provide an installation instruction in `mycli completion --help` that tells the user exactly where to put the output.
|
|
199
|
+
|
|
200
|
+
## Man Page Generation
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// Generate man page from Commander.js program definition
|
|
204
|
+
// Uses marked-man or a custom generator
|
|
205
|
+
|
|
206
|
+
function generateManPage(program: Command): string {
|
|
207
|
+
const name = program.name();
|
|
208
|
+
const version = program.version();
|
|
209
|
+
|
|
210
|
+
return `
|
|
211
|
+
.TH ${name.toUpperCase()} 1 "${new Date().toISOString().slice(0, 10)}" "v${version}" "${name} manual"
|
|
212
|
+
.SH NAME
|
|
213
|
+
${name} \\- ${program.description()}
|
|
214
|
+
.SH SYNOPSIS
|
|
215
|
+
.B ${name}
|
|
216
|
+
[\\fIcommand\\fR]
|
|
217
|
+
[\\fIoptions\\fR]
|
|
218
|
+
.SH DESCRIPTION
|
|
219
|
+
${program.description()}
|
|
220
|
+
.SH COMMANDS
|
|
221
|
+
${program.commands.map((cmd) => `.TP\n.B ${cmd.name()}\n${cmd.description()}`).join('\n')}
|
|
222
|
+
.SH OPTIONS
|
|
223
|
+
${program.options.map((opt) => `.TP\n.BR ${opt.flags}\n${opt.description}`).join('\n')}
|
|
224
|
+
.SH EXIT STATUS
|
|
225
|
+
.TP
|
|
226
|
+
.B 0
|
|
227
|
+
Success
|
|
228
|
+
.TP
|
|
229
|
+
.B 1
|
|
230
|
+
General error
|
|
231
|
+
.TP
|
|
232
|
+
.B 2
|
|
233
|
+
Invalid arguments
|
|
234
|
+
.SH FILES
|
|
235
|
+
.TP
|
|
236
|
+
.I ~/.config/${name}/config.toml
|
|
237
|
+
Global configuration file
|
|
238
|
+
.TP
|
|
239
|
+
.I .${name}.toml
|
|
240
|
+
Project-specific configuration
|
|
241
|
+
.SH BUGS
|
|
242
|
+
Report bugs at https://github.com/example/${name}/issues
|
|
243
|
+
.SH AUTHORS
|
|
244
|
+
Written by the ${name} team.
|
|
245
|
+
`;
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
# Install man page
|
|
251
|
+
mycli man > /usr/local/share/man/man1/mycli.1
|
|
252
|
+
# Or during package installation:
|
|
253
|
+
install -Dm644 mycli.1 /usr/local/share/man/man1/mycli.1
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Piping and Streaming Output
|
|
257
|
+
|
|
258
|
+
### JSON Lines (JSONL / NDJSON)
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// Stream output as newline-delimited JSON for piping
|
|
262
|
+
async function streamResults(query: string): Promise<void> {
|
|
263
|
+
const stream = createResultStream(query);
|
|
264
|
+
|
|
265
|
+
for await (const item of stream) {
|
|
266
|
+
// One JSON object per line -- parseable by jq, mlr, and other tools
|
|
267
|
+
process.stdout.write(JSON.stringify(item) + '\n');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Usage: mycli search "query" --format jsonl | jq '.name'
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### CSV Output
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
function toCsv(data: Record<string, unknown>[]): string {
|
|
278
|
+
if (data.length === 0) return '';
|
|
279
|
+
|
|
280
|
+
const headers = Object.keys(data[0]);
|
|
281
|
+
const rows = data.map((row) =>
|
|
282
|
+
headers.map((h) => {
|
|
283
|
+
const value = String(row[h] ?? '');
|
|
284
|
+
// Escape fields containing commas, quotes, or newlines
|
|
285
|
+
return value.includes(',') || value.includes('"') || value.includes('\n')
|
|
286
|
+
? `"${value.replace(/"/g, '""')}"`
|
|
287
|
+
: value;
|
|
288
|
+
}).join(',')
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
return [headers.join(','), ...rows].join('\n');
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Usage: mycli list --format csv | csvtool col 1,3 -
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Rule**: When `stdout` is piped (not a TTY), default to machine-readable output (JSON). When it is a TTY, default to human-readable output (table).
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
function defaultFormat(): 'table' | 'json' {
|
|
301
|
+
return process.stdout.isTTY ? 'table' : 'json';
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Signal Handling
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
// Graceful shutdown on SIGINT (Ctrl+C) and SIGTERM
|
|
309
|
+
let isShuttingDown = false;
|
|
310
|
+
|
|
311
|
+
async function gracefulShutdown(signal: string): Promise<void> {
|
|
312
|
+
if (isShuttingDown) {
|
|
313
|
+
// Second signal: force exit
|
|
314
|
+
console.error('\nForce exiting...');
|
|
315
|
+
process.exit(130);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
isShuttingDown = true;
|
|
319
|
+
console.error(`\nReceived ${signal}. Cleaning up...`);
|
|
320
|
+
|
|
321
|
+
try {
|
|
322
|
+
await cleanup(); // Close connections, flush buffers, remove temp files
|
|
323
|
+
process.exit(signal === 'SIGINT' ? 130 : 143);
|
|
324
|
+
} catch (error) {
|
|
325
|
+
console.error(`Cleanup failed: ${(error as Error).message}`);
|
|
326
|
+
process.exit(1);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
331
|
+
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
332
|
+
|
|
333
|
+
// Windows: handle Ctrl+C via readline
|
|
334
|
+
if (process.platform === 'win32') {
|
|
335
|
+
const readline = await import('readline');
|
|
336
|
+
const rl = readline.createInterface({ input: process.stdin });
|
|
337
|
+
rl.on('SIGINT', () => process.emit('SIGINT' as any));
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**Rule**: Exit code 130 for SIGINT (128 + signal number 2). Exit code 143 for SIGTERM (128 + signal number 15).
|
|
342
|
+
**Rule**: On first Ctrl+C, clean up gracefully. On second Ctrl+C, exit immediately.
|
|
343
|
+
|
|
344
|
+
## stdin Input Handling
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
// Read from stdin when piped, or from file argument
|
|
348
|
+
async function getInput(fileArg?: string): Promise<string> {
|
|
349
|
+
// Explicit file argument
|
|
350
|
+
if (fileArg && fileArg !== '-') {
|
|
351
|
+
return fs.promises.readFile(fileArg, 'utf-8');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Read from stdin (piped or '-' argument)
|
|
355
|
+
if (!process.stdin.isTTY || fileArg === '-') {
|
|
356
|
+
const chunks: Buffer[] = [];
|
|
357
|
+
for await (const chunk of process.stdin) {
|
|
358
|
+
chunks.push(chunk);
|
|
359
|
+
}
|
|
360
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// No input provided
|
|
364
|
+
console.error('Error: No input provided. Pass a filename or pipe data via stdin.');
|
|
365
|
+
console.error(' mycli process input.txt');
|
|
366
|
+
console.error(' cat input.txt | mycli process');
|
|
367
|
+
console.error(' mycli process - # read from stdin explicitly');
|
|
368
|
+
process.exit(2);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Streaming stdin for large inputs
|
|
372
|
+
async function* streamStdin(): AsyncGenerator<string> {
|
|
373
|
+
const rl = readline.createInterface({ input: process.stdin });
|
|
374
|
+
for await (const line of rl) {
|
|
375
|
+
yield line;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**Rule**: `-` as a filename means "read from stdin". This is a Unix convention that many tools follow.
|
|
381
|
+
|
|
382
|
+
## Shell Alias and Function Patterns
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
# Common patterns users create -- design your CLI to support these
|
|
386
|
+
|
|
387
|
+
# Alias with default flags
|
|
388
|
+
alias deploy='mycli deploy --verbose'
|
|
389
|
+
|
|
390
|
+
# Function wrapper with environment detection
|
|
391
|
+
mydeploy() {
|
|
392
|
+
local env="${1:-staging}"
|
|
393
|
+
mycli deploy "$env" --tag "$(git describe --tags --abbrev=0)"
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
# Pipeline composition
|
|
397
|
+
alias deploy-status='mycli status --format json | jq ".environments[] | select(.status != \"healthy\")"'
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**Design for composition**: Output structured data that `jq`, `grep`, `awk`, and `cut` can process.
|
|
401
|
+
|
|
402
|
+
## PATH Management
|
|
403
|
+
|
|
404
|
+
```bash
|
|
405
|
+
# Installation should add the binary to a standard PATH location
|
|
406
|
+
|
|
407
|
+
# Option 1: Install to /usr/local/bin (requires sudo)
|
|
408
|
+
sudo install -m 755 mycli /usr/local/bin/mycli
|
|
409
|
+
|
|
410
|
+
# Option 2: Install to ~/.local/bin (no sudo, XDG-friendly)
|
|
411
|
+
install -Dm 755 mycli ~/.local/bin/mycli
|
|
412
|
+
# User adds to PATH in .bashrc/.zshrc: export PATH="$HOME/.local/bin:$PATH"
|
|
413
|
+
|
|
414
|
+
# Option 3: npm global install
|
|
415
|
+
npm install -g mycli # Goes to npm prefix/bin
|
|
416
|
+
|
|
417
|
+
# Option 4: Cargo install
|
|
418
|
+
cargo install mycli # Goes to ~/.cargo/bin
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
## Cross-Platform Considerations
|
|
422
|
+
|
|
423
|
+
| Feature | Unix (bash/zsh/fish) | Windows (cmd) | Windows (PowerShell) |
|
|
424
|
+
|---------|---------------------|---------------|---------------------|
|
|
425
|
+
| Path separator | `/` | `\` | `/` or `\` |
|
|
426
|
+
| Env var syntax | `$VAR` | `%VAR%` | `$env:VAR` |
|
|
427
|
+
| Pipe | `\|` | `\|` | `\|` |
|
|
428
|
+
| Redirect | `>`, `2>` | `>`, `2>` | `>`, `2>` |
|
|
429
|
+
| Null device | `/dev/null` | `NUL` | `$null` |
|
|
430
|
+
| Home directory | `$HOME` or `~` | `%USERPROFILE%` | `$HOME` or `~` |
|
|
431
|
+
| Glob expansion | Shell expands `*.txt` | App must expand | PowerShell expands |
|
|
432
|
+
| ANSI colors | Supported | Requires VT support (Win 10+) | Supported |
|
|
433
|
+
| Signals | SIGINT, SIGTERM | Limited (Ctrl+C) | Limited |
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
// Cross-platform helpers
|
|
437
|
+
import os from 'os';
|
|
438
|
+
|
|
439
|
+
function getHomeDir(): string {
|
|
440
|
+
return os.homedir(); // Works on all platforms
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function getNullDevice(): string {
|
|
444
|
+
return process.platform === 'win32' ? 'NUL' : '/dev/null';
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function getPathSeparator(): string {
|
|
448
|
+
return process.platform === 'win32' ? ';' : ':';
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Handle Windows glob expansion (Node.js does not expand globs on Windows)
|
|
452
|
+
async function expandGlobs(patterns: string[]): Promise<string[]> {
|
|
453
|
+
if (process.platform !== 'win32') return patterns; // Shell already expanded
|
|
454
|
+
|
|
455
|
+
const { glob } = await import('glob');
|
|
456
|
+
const expanded: string[] = [];
|
|
457
|
+
for (const pattern of patterns) {
|
|
458
|
+
if (pattern.includes('*') || pattern.includes('?')) {
|
|
459
|
+
expanded.push(...await glob(pattern));
|
|
460
|
+
} else {
|
|
461
|
+
expanded.push(pattern);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return expanded;
|
|
465
|
+
}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
## Output Checklist
|
|
469
|
+
|
|
470
|
+
- [ ] Shell completions generated for bash, zsh, fish, and PowerShell
|
|
471
|
+
- [ ] Completion install instructions included in `mycli completion --help`
|
|
472
|
+
- [ ] Man page generated and installable
|
|
473
|
+
- [ ] Output streams to stdout as JSON Lines when piped
|
|
474
|
+
- [ ] SIGINT/SIGTERM handled with graceful cleanup
|
|
475
|
+
- [ ] Second Ctrl+C forces immediate exit
|
|
476
|
+
- [ ] stdin accepted via pipe or `-` argument
|
|
477
|
+
- [ ] Output format auto-detected based on TTY status
|
|
478
|
+
- [ ] Cross-platform path and signal handling
|
|
479
|
+
- [ ] Binary installs to a standard PATH location
|