claude-autopm 2.8.2 ā 2.8.4
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/README.md +399 -637
- package/install/install.js +15 -5
- package/package.json +2 -1
- package/packages/plugin-ai/LICENSE +21 -0
- package/packages/plugin-ai/README.md +316 -0
- package/packages/plugin-ai/agents/anthropic-claude-expert.md +579 -0
- package/packages/plugin-ai/agents/azure-openai-expert.md +1411 -0
- package/packages/plugin-ai/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-ai/agents/google-a2a-expert.md +1445 -0
- package/packages/plugin-ai/agents/huggingface-expert.md +2131 -0
- package/packages/plugin-ai/agents/langchain-expert.md +1427 -0
- package/packages/plugin-ai/agents/langgraph-workflow-expert.md +520 -0
- package/packages/plugin-ai/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-ai/commands/a2a-setup.md +886 -0
- package/packages/plugin-ai/commands/ai-model-deployment.md +481 -0
- package/packages/plugin-ai/commands/anthropic-optimize.md +793 -0
- package/packages/plugin-ai/commands/huggingface-deploy.md +789 -0
- package/packages/plugin-ai/commands/langchain-optimize.md +807 -0
- package/packages/plugin-ai/commands/llm-optimize.md +348 -0
- package/packages/plugin-ai/commands/openai-optimize.md +863 -0
- package/packages/plugin-ai/commands/rag-optimize.md +841 -0
- package/packages/plugin-ai/commands/rag-setup-scaffold.md +382 -0
- package/packages/plugin-ai/package.json +66 -0
- package/packages/plugin-ai/plugin.json +519 -0
- package/packages/plugin-ai/rules/ai-model-standards.md +449 -0
- package/packages/plugin-ai/rules/prompt-engineering-standards.md +509 -0
- package/packages/plugin-ai/scripts/examples/huggingface-inference-example.py +145 -0
- package/packages/plugin-ai/scripts/examples/langchain-rag-example.py +366 -0
- package/packages/plugin-ai/scripts/examples/mlflow-tracking-example.py +224 -0
- package/packages/plugin-ai/scripts/examples/openai-chat-example.py +425 -0
- package/packages/plugin-cloud/README.md +268 -0
- package/packages/plugin-cloud/agents/README.md +55 -0
- package/packages/plugin-cloud/agents/aws-cloud-architect.md +521 -0
- package/packages/plugin-cloud/agents/azure-cloud-architect.md +436 -0
- package/packages/plugin-cloud/agents/gcp-cloud-architect.md +385 -0
- package/packages/plugin-cloud/agents/gcp-cloud-functions-engineer.md +306 -0
- package/packages/plugin-cloud/agents/gemini-api-expert.md +880 -0
- package/packages/plugin-cloud/agents/kubernetes-orchestrator.md +566 -0
- package/packages/plugin-cloud/agents/openai-python-expert.md +1087 -0
- package/packages/plugin-cloud/agents/terraform-infrastructure-expert.md +454 -0
- package/packages/plugin-cloud/commands/cloud-cost-optimize.md +243 -0
- package/packages/plugin-cloud/commands/cloud-validate.md +196 -0
- package/packages/plugin-cloud/commands/infra-deploy.md +38 -0
- package/packages/plugin-cloud/commands/k8s-deploy.md +37 -0
- package/packages/plugin-cloud/commands/ssh-security.md +65 -0
- package/packages/plugin-cloud/commands/traefik-setup.md +65 -0
- package/packages/plugin-cloud/hooks/pre-cloud-deploy.js +456 -0
- package/packages/plugin-cloud/package.json +64 -0
- package/packages/plugin-cloud/plugin.json +338 -0
- package/packages/plugin-cloud/rules/cloud-security-compliance.md +313 -0
- package/packages/plugin-cloud/rules/infrastructure-pipeline.md +128 -0
- package/packages/plugin-cloud/scripts/examples/aws-validate.sh +30 -0
- package/packages/plugin-cloud/scripts/examples/azure-setup.sh +33 -0
- package/packages/plugin-cloud/scripts/examples/gcp-setup.sh +39 -0
- package/packages/plugin-cloud/scripts/examples/k8s-validate.sh +40 -0
- package/packages/plugin-cloud/scripts/examples/terraform-init.sh +26 -0
- package/packages/plugin-core/README.md +274 -0
- package/packages/plugin-core/agents/core/agent-manager.md +296 -0
- package/packages/plugin-core/agents/core/code-analyzer.md +131 -0
- package/packages/plugin-core/agents/core/file-analyzer.md +162 -0
- package/packages/plugin-core/agents/core/test-runner.md +200 -0
- package/packages/plugin-core/commands/code-rabbit.md +128 -0
- package/packages/plugin-core/commands/prompt.md +9 -0
- package/packages/plugin-core/commands/re-init.md +9 -0
- package/packages/plugin-core/hooks/context7-reminder.md +29 -0
- package/packages/plugin-core/hooks/enforce-agents.js +125 -0
- package/packages/plugin-core/hooks/enforce-agents.sh +35 -0
- package/packages/plugin-core/hooks/pre-agent-context7.js +224 -0
- package/packages/plugin-core/hooks/pre-command-context7.js +229 -0
- package/packages/plugin-core/hooks/strict-enforce-agents.sh +39 -0
- package/packages/plugin-core/hooks/test-hook.sh +21 -0
- package/packages/plugin-core/hooks/unified-context7-enforcement.sh +38 -0
- package/packages/plugin-core/package.json +45 -0
- package/packages/plugin-core/plugin.json +387 -0
- package/packages/plugin-core/rules/agent-coordination.md +549 -0
- package/packages/plugin-core/rules/agent-mandatory.md +170 -0
- package/packages/plugin-core/rules/ai-integration-patterns.md +219 -0
- package/packages/plugin-core/rules/command-pipelines.md +208 -0
- package/packages/plugin-core/rules/context-optimization.md +176 -0
- package/packages/plugin-core/rules/context7-enforcement.md +327 -0
- package/packages/plugin-core/rules/datetime.md +122 -0
- package/packages/plugin-core/rules/definition-of-done.md +272 -0
- package/packages/plugin-core/rules/development-environments.md +19 -0
- package/packages/plugin-core/rules/development-workflow.md +198 -0
- package/packages/plugin-core/rules/framework-path-rules.md +180 -0
- package/packages/plugin-core/rules/frontmatter-operations.md +64 -0
- package/packages/plugin-core/rules/git-strategy.md +237 -0
- package/packages/plugin-core/rules/golden-rules.md +181 -0
- package/packages/plugin-core/rules/naming-conventions.md +111 -0
- package/packages/plugin-core/rules/no-pr-workflow.md +183 -0
- package/packages/plugin-core/rules/performance-guidelines.md +403 -0
- package/packages/plugin-core/rules/pipeline-mandatory.md +109 -0
- package/packages/plugin-core/rules/security-checklist.md +318 -0
- package/packages/plugin-core/rules/standard-patterns.md +197 -0
- package/packages/plugin-core/rules/strip-frontmatter.md +85 -0
- package/packages/plugin-core/rules/tdd.enforcement.md +103 -0
- package/packages/plugin-core/rules/use-ast-grep.md +113 -0
- package/packages/plugin-core/scripts/lib/datetime-utils.sh +254 -0
- package/packages/plugin-core/scripts/lib/frontmatter-utils.sh +294 -0
- package/packages/plugin-core/scripts/lib/github-utils.sh +221 -0
- package/packages/plugin-core/scripts/lib/logging-utils.sh +199 -0
- package/packages/plugin-core/scripts/lib/validation-utils.sh +339 -0
- package/packages/plugin-core/scripts/mcp/add.sh +7 -0
- package/packages/plugin-core/scripts/mcp/disable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/enable.sh +12 -0
- package/packages/plugin-core/scripts/mcp/list.sh +7 -0
- package/packages/plugin-core/scripts/mcp/sync.sh +8 -0
- package/packages/plugin-data/README.md +315 -0
- package/packages/plugin-data/agents/airflow-orchestration-expert.md +158 -0
- package/packages/plugin-data/agents/kedro-pipeline-expert.md +304 -0
- package/packages/plugin-data/agents/langgraph-workflow-expert.md +530 -0
- package/packages/plugin-data/commands/airflow-dag-scaffold.md +413 -0
- package/packages/plugin-data/commands/kafka-pipeline-scaffold.md +503 -0
- package/packages/plugin-data/package.json +66 -0
- package/packages/plugin-data/plugin.json +294 -0
- package/packages/plugin-data/rules/data-quality-standards.md +373 -0
- package/packages/plugin-data/rules/etl-pipeline-standards.md +255 -0
- package/packages/plugin-data/scripts/examples/airflow-dag-example.py +245 -0
- package/packages/plugin-data/scripts/examples/dbt-transform-example.sql +238 -0
- package/packages/plugin-data/scripts/examples/kafka-streaming-example.py +257 -0
- package/packages/plugin-data/scripts/examples/pandas-etl-example.py +332 -0
- package/packages/plugin-databases/README.md +330 -0
- package/packages/plugin-databases/agents/README.md +50 -0
- package/packages/plugin-databases/agents/bigquery-expert.md +401 -0
- package/packages/plugin-databases/agents/cosmosdb-expert.md +375 -0
- package/packages/plugin-databases/agents/mongodb-expert.md +407 -0
- package/packages/plugin-databases/agents/postgresql-expert.md +329 -0
- package/packages/plugin-databases/agents/redis-expert.md +74 -0
- package/packages/plugin-databases/commands/db-optimize.md +612 -0
- package/packages/plugin-databases/package.json +60 -0
- package/packages/plugin-databases/plugin.json +237 -0
- package/packages/plugin-databases/rules/database-management-strategy.md +146 -0
- package/packages/plugin-databases/rules/database-pipeline.md +316 -0
- package/packages/plugin-databases/scripts/examples/bigquery-cost-analyze.sh +160 -0
- package/packages/plugin-databases/scripts/examples/cosmosdb-ru-optimize.sh +163 -0
- package/packages/plugin-databases/scripts/examples/mongodb-shard-check.sh +120 -0
- package/packages/plugin-databases/scripts/examples/postgres-index-analyze.sh +95 -0
- package/packages/plugin-databases/scripts/examples/redis-cache-stats.sh +121 -0
- package/packages/plugin-devops/README.md +367 -0
- package/packages/plugin-devops/agents/README.md +52 -0
- package/packages/plugin-devops/agents/azure-devops-specialist.md +308 -0
- package/packages/plugin-devops/agents/docker-containerization-expert.md +298 -0
- package/packages/plugin-devops/agents/github-operations-specialist.md +335 -0
- package/packages/plugin-devops/agents/mcp-context-manager.md +319 -0
- package/packages/plugin-devops/agents/observability-engineer.md +574 -0
- package/packages/plugin-devops/agents/ssh-operations-expert.md +1093 -0
- package/packages/plugin-devops/agents/traefik-proxy-expert.md +444 -0
- package/packages/plugin-devops/commands/ci-pipeline-create.md +581 -0
- package/packages/plugin-devops/commands/docker-optimize.md +493 -0
- package/packages/plugin-devops/commands/workflow-create.md +42 -0
- package/packages/plugin-devops/hooks/pre-docker-build.js +472 -0
- package/packages/plugin-devops/package.json +61 -0
- package/packages/plugin-devops/plugin.json +302 -0
- package/packages/plugin-devops/rules/ci-cd-kubernetes-strategy.md +25 -0
- package/packages/plugin-devops/rules/devops-troubleshooting-playbook.md +450 -0
- package/packages/plugin-devops/rules/docker-first-development.md +404 -0
- package/packages/plugin-devops/rules/github-operations.md +92 -0
- package/packages/plugin-devops/scripts/examples/docker-build-multistage.sh +43 -0
- package/packages/plugin-devops/scripts/examples/docker-compose-validate.sh +74 -0
- package/packages/plugin-devops/scripts/examples/github-workflow-validate.sh +48 -0
- package/packages/plugin-devops/scripts/examples/prometheus-health-check.sh +58 -0
- package/packages/plugin-devops/scripts/examples/ssh-key-setup.sh +74 -0
- package/packages/plugin-frameworks/README.md +309 -0
- package/packages/plugin-frameworks/agents/README.md +64 -0
- package/packages/plugin-frameworks/agents/e2e-test-engineer.md +579 -0
- package/packages/plugin-frameworks/agents/nats-messaging-expert.md +254 -0
- package/packages/plugin-frameworks/agents/react-frontend-engineer.md +393 -0
- package/packages/plugin-frameworks/agents/react-ui-expert.md +226 -0
- package/packages/plugin-frameworks/agents/tailwindcss-expert.md +1021 -0
- package/packages/plugin-frameworks/agents/ux-design-expert.md +244 -0
- package/packages/plugin-frameworks/commands/app-scaffold.md +50 -0
- package/packages/plugin-frameworks/commands/nextjs-optimize.md +692 -0
- package/packages/plugin-frameworks/commands/react-optimize.md +583 -0
- package/packages/plugin-frameworks/commands/tailwind-system.md +64 -0
- package/packages/plugin-frameworks/package.json +59 -0
- package/packages/plugin-frameworks/plugin.json +224 -0
- package/packages/plugin-frameworks/rules/performance-guidelines.md +403 -0
- package/packages/plugin-frameworks/rules/ui-development-standards.md +281 -0
- package/packages/plugin-frameworks/rules/ui-framework-rules.md +151 -0
- package/packages/plugin-frameworks/scripts/examples/react-component-perf.sh +34 -0
- package/packages/plugin-frameworks/scripts/examples/tailwind-optimize.sh +44 -0
- package/packages/plugin-frameworks/scripts/examples/vue-composition-check.sh +41 -0
- package/packages/plugin-languages/README.md +333 -0
- package/packages/plugin-languages/agents/README.md +50 -0
- package/packages/plugin-languages/agents/bash-scripting-expert.md +541 -0
- package/packages/plugin-languages/agents/javascript-frontend-engineer.md +197 -0
- package/packages/plugin-languages/agents/nodejs-backend-engineer.md +226 -0
- package/packages/plugin-languages/agents/python-backend-engineer.md +214 -0
- package/packages/plugin-languages/agents/python-backend-expert.md +289 -0
- package/packages/plugin-languages/commands/javascript-optimize.md +636 -0
- package/packages/plugin-languages/commands/nodejs-api-scaffold.md +341 -0
- package/packages/plugin-languages/commands/nodejs-optimize.md +689 -0
- package/packages/plugin-languages/commands/python-api-scaffold.md +261 -0
- package/packages/plugin-languages/commands/python-optimize.md +593 -0
- package/packages/plugin-languages/package.json +65 -0
- package/packages/plugin-languages/plugin.json +265 -0
- package/packages/plugin-languages/rules/code-quality-standards.md +496 -0
- package/packages/plugin-languages/rules/testing-standards.md +768 -0
- package/packages/plugin-languages/scripts/examples/bash-production-script.sh +520 -0
- package/packages/plugin-languages/scripts/examples/javascript-es6-patterns.js +291 -0
- package/packages/plugin-languages/scripts/examples/nodejs-async-iteration.js +360 -0
- package/packages/plugin-languages/scripts/examples/python-async-patterns.py +289 -0
- package/packages/plugin-languages/scripts/examples/typescript-patterns.ts +432 -0
- package/packages/plugin-ml/README.md +430 -0
- package/packages/plugin-ml/agents/automl-expert.md +326 -0
- package/packages/plugin-ml/agents/computer-vision-expert.md +550 -0
- package/packages/plugin-ml/agents/gradient-boosting-expert.md +455 -0
- package/packages/plugin-ml/agents/neural-network-architect.md +1228 -0
- package/packages/plugin-ml/agents/nlp-transformer-expert.md +584 -0
- package/packages/plugin-ml/agents/pytorch-expert.md +412 -0
- package/packages/plugin-ml/agents/reinforcement-learning-expert.md +2088 -0
- package/packages/plugin-ml/agents/scikit-learn-expert.md +228 -0
- package/packages/plugin-ml/agents/tensorflow-keras-expert.md +509 -0
- package/packages/plugin-ml/agents/time-series-expert.md +303 -0
- package/packages/plugin-ml/commands/ml-automl.md +572 -0
- package/packages/plugin-ml/commands/ml-train-optimize.md +657 -0
- package/packages/plugin-ml/package.json +52 -0
- package/packages/plugin-ml/plugin.json +338 -0
- package/packages/plugin-pm/README.md +368 -0
- package/packages/plugin-pm/claudeautopm-plugin-pm-2.0.0.tgz +0 -0
- package/packages/plugin-pm/commands/azure/COMMANDS.md +107 -0
- package/packages/plugin-pm/commands/azure/COMMAND_MAPPING.md +252 -0
- package/packages/plugin-pm/commands/azure/INTEGRATION_FIX.md +103 -0
- package/packages/plugin-pm/commands/azure/README.md +246 -0
- package/packages/plugin-pm/commands/azure/active-work.md +198 -0
- package/packages/plugin-pm/commands/azure/aliases.md +143 -0
- package/packages/plugin-pm/commands/azure/blocked-items.md +287 -0
- package/packages/plugin-pm/commands/azure/clean.md +93 -0
- package/packages/plugin-pm/commands/azure/docs-query.md +48 -0
- package/packages/plugin-pm/commands/azure/feature-decompose.md +380 -0
- package/packages/plugin-pm/commands/azure/feature-list.md +61 -0
- package/packages/plugin-pm/commands/azure/feature-new.md +115 -0
- package/packages/plugin-pm/commands/azure/feature-show.md +205 -0
- package/packages/plugin-pm/commands/azure/feature-start.md +130 -0
- package/packages/plugin-pm/commands/azure/fix-integration-example.md +93 -0
- package/packages/plugin-pm/commands/azure/help.md +150 -0
- package/packages/plugin-pm/commands/azure/import-us.md +269 -0
- package/packages/plugin-pm/commands/azure/init.md +211 -0
- package/packages/plugin-pm/commands/azure/next-task.md +262 -0
- package/packages/plugin-pm/commands/azure/search.md +160 -0
- package/packages/plugin-pm/commands/azure/sprint-status.md +235 -0
- package/packages/plugin-pm/commands/azure/standup.md +260 -0
- package/packages/plugin-pm/commands/azure/sync-all.md +99 -0
- package/packages/plugin-pm/commands/azure/task-analyze.md +186 -0
- package/packages/plugin-pm/commands/azure/task-close.md +329 -0
- package/packages/plugin-pm/commands/azure/task-edit.md +145 -0
- package/packages/plugin-pm/commands/azure/task-list.md +263 -0
- package/packages/plugin-pm/commands/azure/task-new.md +84 -0
- package/packages/plugin-pm/commands/azure/task-reopen.md +79 -0
- package/packages/plugin-pm/commands/azure/task-show.md +126 -0
- package/packages/plugin-pm/commands/azure/task-start.md +301 -0
- package/packages/plugin-pm/commands/azure/task-status.md +65 -0
- package/packages/plugin-pm/commands/azure/task-sync.md +67 -0
- package/packages/plugin-pm/commands/azure/us-edit.md +164 -0
- package/packages/plugin-pm/commands/azure/us-list.md +202 -0
- package/packages/plugin-pm/commands/azure/us-new.md +265 -0
- package/packages/plugin-pm/commands/azure/us-parse.md +253 -0
- package/packages/plugin-pm/commands/azure/us-show.md +188 -0
- package/packages/plugin-pm/commands/azure/us-status.md +320 -0
- package/packages/plugin-pm/commands/azure/validate.md +86 -0
- package/packages/plugin-pm/commands/azure/work-item-sync.md +47 -0
- package/packages/plugin-pm/commands/blocked.md +28 -0
- package/packages/plugin-pm/commands/clean.md +119 -0
- package/packages/plugin-pm/commands/context-create.md +136 -0
- package/packages/plugin-pm/commands/context-prime.md +170 -0
- package/packages/plugin-pm/commands/context-update.md +292 -0
- package/packages/plugin-pm/commands/context.md +28 -0
- package/packages/plugin-pm/commands/epic-close.md +86 -0
- package/packages/plugin-pm/commands/epic-decompose.md +370 -0
- package/packages/plugin-pm/commands/epic-edit.md +83 -0
- package/packages/plugin-pm/commands/epic-list.md +30 -0
- package/packages/plugin-pm/commands/epic-merge.md +222 -0
- package/packages/plugin-pm/commands/epic-oneshot.md +119 -0
- package/packages/plugin-pm/commands/epic-refresh.md +119 -0
- package/packages/plugin-pm/commands/epic-show.md +28 -0
- package/packages/plugin-pm/commands/epic-split.md +120 -0
- package/packages/plugin-pm/commands/epic-start.md +195 -0
- package/packages/plugin-pm/commands/epic-status.md +28 -0
- package/packages/plugin-pm/commands/epic-sync-modular.md +338 -0
- package/packages/plugin-pm/commands/epic-sync-original.md +473 -0
- package/packages/plugin-pm/commands/epic-sync.md +486 -0
- package/packages/plugin-pm/commands/github/workflow-create.md +42 -0
- package/packages/plugin-pm/commands/help.md +28 -0
- package/packages/plugin-pm/commands/import.md +115 -0
- package/packages/plugin-pm/commands/in-progress.md +28 -0
- package/packages/plugin-pm/commands/init.md +28 -0
- package/packages/plugin-pm/commands/issue-analyze.md +202 -0
- package/packages/plugin-pm/commands/issue-close.md +119 -0
- package/packages/plugin-pm/commands/issue-edit.md +93 -0
- package/packages/plugin-pm/commands/issue-reopen.md +87 -0
- package/packages/plugin-pm/commands/issue-show.md +41 -0
- package/packages/plugin-pm/commands/issue-start.md +234 -0
- package/packages/plugin-pm/commands/issue-status.md +95 -0
- package/packages/plugin-pm/commands/issue-sync.md +411 -0
- package/packages/plugin-pm/commands/next.md +28 -0
- package/packages/plugin-pm/commands/prd-edit.md +82 -0
- package/packages/plugin-pm/commands/prd-list.md +28 -0
- package/packages/plugin-pm/commands/prd-new.md +55 -0
- package/packages/plugin-pm/commands/prd-parse.md +42 -0
- package/packages/plugin-pm/commands/prd-status.md +28 -0
- package/packages/plugin-pm/commands/search.md +28 -0
- package/packages/plugin-pm/commands/standup.md +28 -0
- package/packages/plugin-pm/commands/status.md +28 -0
- package/packages/plugin-pm/commands/sync.md +99 -0
- package/packages/plugin-pm/commands/test-reference-update.md +151 -0
- package/packages/plugin-pm/commands/validate.md +28 -0
- package/packages/plugin-pm/commands/what-next.md +28 -0
- package/packages/plugin-pm/package.json +57 -0
- package/packages/plugin-pm/plugin.json +503 -0
- package/packages/plugin-pm/scripts/pm/analytics.js +425 -0
- package/packages/plugin-pm/scripts/pm/blocked.js +164 -0
- package/packages/plugin-pm/scripts/pm/blocked.sh +78 -0
- package/packages/plugin-pm/scripts/pm/clean.js +464 -0
- package/packages/plugin-pm/scripts/pm/context-create.js +216 -0
- package/packages/plugin-pm/scripts/pm/context-prime.js +335 -0
- package/packages/plugin-pm/scripts/pm/context-update.js +344 -0
- package/packages/plugin-pm/scripts/pm/context.js +338 -0
- package/packages/plugin-pm/scripts/pm/epic-close.js +347 -0
- package/packages/plugin-pm/scripts/pm/epic-edit.js +382 -0
- package/packages/plugin-pm/scripts/pm/epic-list.js +273 -0
- package/packages/plugin-pm/scripts/pm/epic-list.sh +109 -0
- package/packages/plugin-pm/scripts/pm/epic-show.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-show.sh +105 -0
- package/packages/plugin-pm/scripts/pm/epic-split.js +522 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.js +183 -0
- package/packages/plugin-pm/scripts/pm/epic-start/epic-start.sh +94 -0
- package/packages/plugin-pm/scripts/pm/epic-status.js +291 -0
- package/packages/plugin-pm/scripts/pm/epic-status.sh +104 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/README.md +208 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-epic-issue.sh +77 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/create-task-issues.sh +86 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-epic-file.sh +79 -0
- package/packages/plugin-pm/scripts/pm/epic-sync/update-references.sh +89 -0
- package/packages/plugin-pm/scripts/pm/epic-sync.sh +137 -0
- package/packages/plugin-pm/scripts/pm/help.js +92 -0
- package/packages/plugin-pm/scripts/pm/help.sh +90 -0
- package/packages/plugin-pm/scripts/pm/in-progress.js +178 -0
- package/packages/plugin-pm/scripts/pm/in-progress.sh +93 -0
- package/packages/plugin-pm/scripts/pm/init.js +321 -0
- package/packages/plugin-pm/scripts/pm/init.sh +178 -0
- package/packages/plugin-pm/scripts/pm/issue-close.js +232 -0
- package/packages/plugin-pm/scripts/pm/issue-edit.js +310 -0
- package/packages/plugin-pm/scripts/pm/issue-show.js +272 -0
- package/packages/plugin-pm/scripts/pm/issue-start.js +181 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/format-comment.sh +468 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/gather-updates.sh +460 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/post-comment.sh +330 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/preflight-validation.sh +348 -0
- package/packages/plugin-pm/scripts/pm/issue-sync/update-frontmatter.sh +387 -0
- package/packages/plugin-pm/scripts/pm/lib/README.md +85 -0
- package/packages/plugin-pm/scripts/pm/lib/epic-discovery.js +119 -0
- package/packages/plugin-pm/scripts/pm/lib/logger.js +78 -0
- package/packages/plugin-pm/scripts/pm/next.js +189 -0
- package/packages/plugin-pm/scripts/pm/next.sh +72 -0
- package/packages/plugin-pm/scripts/pm/optimize.js +407 -0
- package/packages/plugin-pm/scripts/pm/pr-create.js +337 -0
- package/packages/plugin-pm/scripts/pm/pr-list.js +257 -0
- package/packages/plugin-pm/scripts/pm/prd-list.js +242 -0
- package/packages/plugin-pm/scripts/pm/prd-list.sh +103 -0
- package/packages/plugin-pm/scripts/pm/prd-new.js +684 -0
- package/packages/plugin-pm/scripts/pm/prd-parse.js +547 -0
- package/packages/plugin-pm/scripts/pm/prd-status.js +152 -0
- package/packages/plugin-pm/scripts/pm/prd-status.sh +63 -0
- package/packages/plugin-pm/scripts/pm/release.js +460 -0
- package/packages/plugin-pm/scripts/pm/search.js +192 -0
- package/packages/plugin-pm/scripts/pm/search.sh +89 -0
- package/packages/plugin-pm/scripts/pm/standup.js +362 -0
- package/packages/plugin-pm/scripts/pm/standup.sh +95 -0
- package/packages/plugin-pm/scripts/pm/status.js +148 -0
- package/packages/plugin-pm/scripts/pm/status.sh +59 -0
- package/packages/plugin-pm/scripts/pm/sync-batch.js +337 -0
- package/packages/plugin-pm/scripts/pm/sync.js +343 -0
- package/packages/plugin-pm/scripts/pm/template-list.js +141 -0
- package/packages/plugin-pm/scripts/pm/template-new.js +366 -0
- package/packages/plugin-pm/scripts/pm/validate.js +274 -0
- package/packages/plugin-pm/scripts/pm/validate.sh +106 -0
- package/packages/plugin-pm/scripts/pm/what-next.js +660 -0
- package/packages/plugin-testing/README.md +401 -0
- package/packages/plugin-testing/agents/frontend-testing-engineer.md +768 -0
- package/packages/plugin-testing/commands/jest-optimize.md +800 -0
- package/packages/plugin-testing/commands/playwright-optimize.md +887 -0
- package/packages/plugin-testing/commands/test-coverage.md +512 -0
- package/packages/plugin-testing/commands/test-performance.md +1041 -0
- package/packages/plugin-testing/commands/test-setup.md +414 -0
- package/packages/plugin-testing/package.json +40 -0
- package/packages/plugin-testing/plugin.json +197 -0
- package/packages/plugin-testing/rules/test-coverage-requirements.md +581 -0
- package/packages/plugin-testing/rules/testing-standards.md +529 -0
- package/packages/plugin-testing/scripts/examples/react-testing-example.test.jsx +460 -0
- package/packages/plugin-testing/scripts/examples/vitest-config-example.js +352 -0
- package/packages/plugin-testing/scripts/examples/vue-testing-example.test.js +586 -0
|
@@ -0,0 +1,684 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* PRD New - Launch brainstorming for new product requirement
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Template-based creation (--template flag)
|
|
7
|
+
* - Interactive template selection
|
|
8
|
+
* - Traditional brainstorming mode (backwards compatible)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const readline = require('readline');
|
|
14
|
+
|
|
15
|
+
// Dynamically resolve template engine path
|
|
16
|
+
// This works both in installed projects and during testing
|
|
17
|
+
let TemplateEngine;
|
|
18
|
+
try {
|
|
19
|
+
// Try from project root (where lib/ is installed)
|
|
20
|
+
TemplateEngine = require(path.join(process.cwd(), 'lib', 'template-engine'));
|
|
21
|
+
} catch (err) {
|
|
22
|
+
try {
|
|
23
|
+
// Try relative path from .claude/scripts/pm/ (during development)
|
|
24
|
+
TemplateEngine = require(path.join(__dirname, '..', '..', '..', '..', 'lib', 'template-engine'));
|
|
25
|
+
} catch (err2) {
|
|
26
|
+
// Fallback: try from AutoPM global installation
|
|
27
|
+
try {
|
|
28
|
+
const { execSync } = require('child_process');
|
|
29
|
+
const os = require('os');
|
|
30
|
+
// Check if npm is available
|
|
31
|
+
let npmExists = false;
|
|
32
|
+
try {
|
|
33
|
+
if (os.platform() === 'win32') {
|
|
34
|
+
execSync('where npm', { stdio: 'ignore' });
|
|
35
|
+
} else {
|
|
36
|
+
execSync('which npm', { stdio: 'ignore' });
|
|
37
|
+
}
|
|
38
|
+
npmExists = true;
|
|
39
|
+
} catch (checkErr) {
|
|
40
|
+
npmExists = false;
|
|
41
|
+
}
|
|
42
|
+
if (!npmExists) {
|
|
43
|
+
throw new Error('npm is not installed or not found in PATH. Please install npm to use global template-engine.');
|
|
44
|
+
}
|
|
45
|
+
let npmRoot;
|
|
46
|
+
try {
|
|
47
|
+
npmRoot = execSync('npm root -g', { encoding: 'utf-8' }).trim();
|
|
48
|
+
} catch (npmErr) {
|
|
49
|
+
throw new Error('Failed to execute "npm root -g". Please check your npm installation.');
|
|
50
|
+
}
|
|
51
|
+
TemplateEngine = require(path.join(npmRoot, 'claude-autopm', 'lib', 'template-engine'));
|
|
52
|
+
} catch (err3) {
|
|
53
|
+
throw new Error('Cannot find template-engine module. Please ensure lib/ directory is installed. Details: ' + err3.message);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class PrdCreator {
|
|
59
|
+
constructor() {
|
|
60
|
+
this.prdsDir = path.join('.claude', 'prds');
|
|
61
|
+
this.templatesDir = path.join(__dirname, '..', '..', 'templates');
|
|
62
|
+
this.templateEngine = new TemplateEngine();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Create PRD from template
|
|
67
|
+
*/
|
|
68
|
+
async createPrdFromTemplate(prdName, templateName) {
|
|
69
|
+
console.log(`\nš Creating PRD from Template: ${templateName}`);
|
|
70
|
+
console.log(`${'ā'.repeat(50)}\n`);
|
|
71
|
+
|
|
72
|
+
// Ensure PRDs directory exists
|
|
73
|
+
if (!fs.existsSync(this.prdsDir)) {
|
|
74
|
+
fs.mkdirSync(this.prdsDir, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Check if PRD already exists
|
|
78
|
+
const prdFile = path.join(this.prdsDir, `${prdName}.md`);
|
|
79
|
+
if (fs.existsSync(prdFile)) {
|
|
80
|
+
console.error(`ā PRD already exists: ${prdName}`);
|
|
81
|
+
console.log(`š” Edit file: .claude/prds/${prdName}.md`);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Find template
|
|
86
|
+
const templatePath = this.templateEngine.findTemplate('prds', templateName);
|
|
87
|
+
if (!templatePath) {
|
|
88
|
+
console.error(`ā Template not found: ${templateName}`);
|
|
89
|
+
console.log(`š” List available templates: autopm template:list`);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Read template to find required variables
|
|
94
|
+
const templateContent = fs.readFileSync(templatePath, 'utf8');
|
|
95
|
+
const requiredVars = this.extractTemplateVariables(templateContent);
|
|
96
|
+
|
|
97
|
+
// Prompt for variables
|
|
98
|
+
const rl = readline.createInterface({
|
|
99
|
+
input: process.stdin,
|
|
100
|
+
output: process.stdout
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const prompt = (question) => new Promise((resolve) => {
|
|
104
|
+
rl.question(question, resolve);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
console.log(`š Template: ${templateName}`);
|
|
109
|
+
console.log(`Fill in the following details:\n`);
|
|
110
|
+
|
|
111
|
+
const variables = {
|
|
112
|
+
title: prdName.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' '),
|
|
113
|
+
type: 'prd'
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// Prompt for common variables
|
|
117
|
+
const title = await prompt(`Title [${variables.title}]: `);
|
|
118
|
+
if (title) variables.title = title;
|
|
119
|
+
|
|
120
|
+
const priority = await prompt('Priority (P0/P1/P2/P3) [P2]: ');
|
|
121
|
+
variables.priority = priority || 'P2';
|
|
122
|
+
|
|
123
|
+
const timeline = await prompt('Timeline [TBD]: ');
|
|
124
|
+
variables.timeline = timeline || 'TBD';
|
|
125
|
+
|
|
126
|
+
// Prompt for template-specific variables
|
|
127
|
+
const templateSpecific = this.getTemplateSpecificPrompts(templateName);
|
|
128
|
+
for (const varName of templateSpecific) {
|
|
129
|
+
if (!variables[varName]) {
|
|
130
|
+
const value = await prompt(`${varName.replace(/_/g, ' ')}: `);
|
|
131
|
+
variables[varName] = value || '';
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Render template
|
|
136
|
+
const rendered = this.templateEngine.renderFile(templatePath, variables);
|
|
137
|
+
|
|
138
|
+
// Write PRD file
|
|
139
|
+
fs.writeFileSync(prdFile, rendered);
|
|
140
|
+
|
|
141
|
+
console.log('\nā
PRD created successfully!');
|
|
142
|
+
console.log(`š File: ${prdFile}`);
|
|
143
|
+
|
|
144
|
+
// Show next steps
|
|
145
|
+
this.showNextSteps(prdName);
|
|
146
|
+
|
|
147
|
+
return true;
|
|
148
|
+
} finally {
|
|
149
|
+
rl.close();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Extract variables from template
|
|
155
|
+
*/
|
|
156
|
+
extractTemplateVariables(template) {
|
|
157
|
+
const varRegex = /\{\{(\w+)\}\}/g;
|
|
158
|
+
const vars = new Set();
|
|
159
|
+
let match;
|
|
160
|
+
|
|
161
|
+
while ((match = varRegex.exec(template)) !== null) {
|
|
162
|
+
vars.add(match[1]);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Remove auto-generated variables
|
|
166
|
+
vars.delete('id');
|
|
167
|
+
vars.delete('timestamp');
|
|
168
|
+
vars.delete('date');
|
|
169
|
+
vars.delete('author');
|
|
170
|
+
|
|
171
|
+
return Array.from(vars);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Get template-specific prompts
|
|
176
|
+
*/
|
|
177
|
+
getTemplateSpecificPrompts(templateName) {
|
|
178
|
+
const prompts = {
|
|
179
|
+
'api-feature': [
|
|
180
|
+
'api_purpose',
|
|
181
|
+
'problem',
|
|
182
|
+
'business_value',
|
|
183
|
+
'http_method',
|
|
184
|
+
'api_endpoint',
|
|
185
|
+
'auth_method',
|
|
186
|
+
'rate_limit',
|
|
187
|
+
'user_role',
|
|
188
|
+
'api_action',
|
|
189
|
+
'user_benefit'
|
|
190
|
+
],
|
|
191
|
+
'ui-feature': [
|
|
192
|
+
'component_type',
|
|
193
|
+
'feature_purpose',
|
|
194
|
+
'problem',
|
|
195
|
+
'user_need',
|
|
196
|
+
'user_goal',
|
|
197
|
+
'user_role',
|
|
198
|
+
'user_action',
|
|
199
|
+
'user_benefit'
|
|
200
|
+
],
|
|
201
|
+
'bug-fix': [
|
|
202
|
+
'bug_summary',
|
|
203
|
+
'severity',
|
|
204
|
+
'user_impact',
|
|
205
|
+
'step_1',
|
|
206
|
+
'step_2',
|
|
207
|
+
'step_3',
|
|
208
|
+
'expected_behavior',
|
|
209
|
+
'actual_behavior',
|
|
210
|
+
'root_cause',
|
|
211
|
+
'solution_approach'
|
|
212
|
+
],
|
|
213
|
+
'data-migration': [
|
|
214
|
+
'migration_purpose',
|
|
215
|
+
'current_state',
|
|
216
|
+
'desired_state',
|
|
217
|
+
'affected_tables',
|
|
218
|
+
'data_volume',
|
|
219
|
+
'migration_strategy'
|
|
220
|
+
],
|
|
221
|
+
'documentation': [
|
|
222
|
+
'doc_type',
|
|
223
|
+
'target_audience',
|
|
224
|
+
'documentation_scope',
|
|
225
|
+
'current_gaps'
|
|
226
|
+
]
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
return prompts[templateName] || [];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Show interactive template selection
|
|
234
|
+
*/
|
|
235
|
+
async selectTemplate() {
|
|
236
|
+
const templates = this.templateEngine.listTemplates('prds');
|
|
237
|
+
|
|
238
|
+
if (templates.length === 0) {
|
|
239
|
+
console.log('No templates available');
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
console.log('\nš Available Templates:');
|
|
244
|
+
|
|
245
|
+
const builtIn = templates.filter(t => !t.custom);
|
|
246
|
+
const custom = templates.filter(t => t.custom);
|
|
247
|
+
|
|
248
|
+
let index = 1;
|
|
249
|
+
const options = [];
|
|
250
|
+
|
|
251
|
+
builtIn.forEach(t => {
|
|
252
|
+
const description = this.getTemplateDescription(t.name);
|
|
253
|
+
console.log(`${index}. ${t.name.padEnd(20)} - ${description}`);
|
|
254
|
+
options.push(t.name);
|
|
255
|
+
index++;
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
if (custom.length > 0) {
|
|
259
|
+
console.log('\nCustom Templates:');
|
|
260
|
+
custom.forEach(t => {
|
|
261
|
+
console.log(`${index}. ${t.name.padEnd(20)} - [Custom]`);
|
|
262
|
+
options.push(t.name);
|
|
263
|
+
index++;
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
console.log(`${index}. none${' '.repeat(20)} - Create empty PRD\n`);
|
|
268
|
+
options.push('none');
|
|
269
|
+
|
|
270
|
+
const rl = readline.createInterface({
|
|
271
|
+
input: process.stdin,
|
|
272
|
+
output: process.stdout
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
const prompt = (question) => new Promise((resolve) => {
|
|
276
|
+
rl.question(question, resolve);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
try {
|
|
280
|
+
const selection = await prompt(`Select template (1-${options.length}): `);
|
|
281
|
+
const selectionNum = parseInt(selection, 10);
|
|
282
|
+
|
|
283
|
+
if (selectionNum < 1 || selectionNum > options.length) {
|
|
284
|
+
console.error('Invalid selection');
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return options[selectionNum - 1];
|
|
289
|
+
} finally {
|
|
290
|
+
rl.close();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Get template description
|
|
296
|
+
*/
|
|
297
|
+
getTemplateDescription(templateName) {
|
|
298
|
+
const descriptions = {
|
|
299
|
+
'api-feature': 'REST/GraphQL API development',
|
|
300
|
+
'ui-feature': 'Frontend component/page',
|
|
301
|
+
'bug-fix': 'Bug resolution workflow',
|
|
302
|
+
'data-migration': 'Database schema changes',
|
|
303
|
+
'documentation': 'Documentation updates'
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
return descriptions[templateName] || 'Template';
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async createPrd(prdName) {
|
|
310
|
+
console.log(`\nš Creating New PRD: ${prdName}`);
|
|
311
|
+
console.log(`${'ā'.repeat(50)}\n`);
|
|
312
|
+
|
|
313
|
+
// Ensure PRDs directory exists
|
|
314
|
+
if (!fs.existsSync(this.prdsDir)) {
|
|
315
|
+
fs.mkdirSync(this.prdsDir, { recursive: true });
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Check if PRD already exists
|
|
319
|
+
const prdFile = path.join(this.prdsDir, `${prdName}.md`);
|
|
320
|
+
if (fs.existsSync(prdFile)) {
|
|
321
|
+
console.error(`ā PRD already exists: ${prdName}`);
|
|
322
|
+
console.log(`š” Edit file: .claude/prds/${prdName}.md`);
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Create interface for brainstorming
|
|
327
|
+
const rl = readline.createInterface({
|
|
328
|
+
input: process.stdin,
|
|
329
|
+
output: process.stdout
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
const prompt = (question) => new Promise((resolve) => {
|
|
333
|
+
rl.question(question, resolve);
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
console.log('š§ Let\'s brainstorm your product requirement!\n');
|
|
338
|
+
|
|
339
|
+
// Gather information
|
|
340
|
+
const prdData = {};
|
|
341
|
+
|
|
342
|
+
// Product Vision
|
|
343
|
+
console.log('š Product Vision');
|
|
344
|
+
console.log('What problem are you trying to solve? What\'s the vision?');
|
|
345
|
+
prdData.vision = await prompt('Vision: ');
|
|
346
|
+
|
|
347
|
+
// Target Users
|
|
348
|
+
console.log('\nš„ Target Users');
|
|
349
|
+
console.log('Who will use this feature? What are their needs?');
|
|
350
|
+
prdData.users = await prompt('Target users: ');
|
|
351
|
+
|
|
352
|
+
// Key Features
|
|
353
|
+
console.log('\n⨠Key Features');
|
|
354
|
+
console.log('What are the main features? (enter one per line, empty line to finish)');
|
|
355
|
+
prdData.features = [];
|
|
356
|
+
let feature;
|
|
357
|
+
while ((feature = await prompt('Feature: ')) !== '') {
|
|
358
|
+
prdData.features.push(feature);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Success Metrics
|
|
362
|
+
console.log('\nš Success Metrics');
|
|
363
|
+
console.log('How will you measure success?');
|
|
364
|
+
prdData.metrics = await prompt('Success metrics: ');
|
|
365
|
+
|
|
366
|
+
// Technical Considerations
|
|
367
|
+
console.log('\nš§ Technical Considerations');
|
|
368
|
+
console.log('Any technical constraints or requirements?');
|
|
369
|
+
prdData.technical = await prompt('Technical notes: ');
|
|
370
|
+
|
|
371
|
+
// Priority
|
|
372
|
+
console.log('\nšÆ Priority');
|
|
373
|
+
console.log('What\'s the priority? (P0=Critical, P1=High, P2=Medium, P3=Low)');
|
|
374
|
+
prdData.priority = await prompt('Priority (P0/P1/P2/P3): ') || 'P2';
|
|
375
|
+
|
|
376
|
+
// Timeline
|
|
377
|
+
console.log('\nā° Timeline');
|
|
378
|
+
console.log('When should this be delivered?');
|
|
379
|
+
prdData.timeline = await prompt('Timeline: ');
|
|
380
|
+
|
|
381
|
+
// Generate PRD
|
|
382
|
+
const prdContent = this.generatePrdContent(prdName, prdData);
|
|
383
|
+
|
|
384
|
+
// Write PRD file
|
|
385
|
+
fs.writeFileSync(prdFile, prdContent);
|
|
386
|
+
|
|
387
|
+
console.log('\nā
PRD created successfully!');
|
|
388
|
+
console.log(`š File: ${prdFile}`);
|
|
389
|
+
|
|
390
|
+
// Show comprehensive next steps
|
|
391
|
+
this.showNextSteps(prdName);
|
|
392
|
+
|
|
393
|
+
} finally {
|
|
394
|
+
rl.close();
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return true;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
showNextSteps(prdName) {
|
|
401
|
+
console.log('\n' + 'ā'.repeat(60));
|
|
402
|
+
console.log('š What You Can Do Next:');
|
|
403
|
+
console.log('ā'.repeat(60) + '\n');
|
|
404
|
+
|
|
405
|
+
console.log('šÆ Option 1: Quick Start (Recommended for Simple Features)');
|
|
406
|
+
console.log(' One command to parse, decompose, and sync to GitHub:');
|
|
407
|
+
console.log(` /pm:epic-oneshot ${prdName}`);
|
|
408
|
+
console.log(' ⨠This creates epic + tasks + GitHub issues automatically\n');
|
|
409
|
+
|
|
410
|
+
console.log('š Option 2: Split into Multiple Epics (For Complex Features)');
|
|
411
|
+
console.log(' Break down large PRD into focused sub-epics:');
|
|
412
|
+
console.log(` /pm:prd-split ${prdName}`);
|
|
413
|
+
console.log(' Example: payment-system ā backend, frontend, security');
|
|
414
|
+
console.log(' š See README section "Splitting Large PRDs into Multiple Epics"\n');
|
|
415
|
+
|
|
416
|
+
console.log('š ļø Option 3: Step-by-Step Workflow (Full Control)');
|
|
417
|
+
console.log(' a) Convert PRD to epic:');
|
|
418
|
+
console.log(` /pm:prd-parse ${prdName}`);
|
|
419
|
+
console.log(' b) Break epic into tasks:');
|
|
420
|
+
console.log(` /pm:epic-decompose ${prdName}`);
|
|
421
|
+
console.log(' c) Push to GitHub/Azure:');
|
|
422
|
+
console.log(` /pm:epic-sync ${prdName}\n`);
|
|
423
|
+
|
|
424
|
+
console.log('š Option 4: Review & Edit First');
|
|
425
|
+
console.log(' Review and refine the PRD before processing:');
|
|
426
|
+
console.log(` nano .claude/prds/${prdName}.md`);
|
|
427
|
+
console.log(' Then use any option above\n');
|
|
428
|
+
|
|
429
|
+
console.log('š Option 5: Check Status');
|
|
430
|
+
console.log(' View PRD and track progress:');
|
|
431
|
+
console.log(` /pm:prd-status ${prdName}\n`);
|
|
432
|
+
|
|
433
|
+
console.log(`š” Don't know which to choose?`);
|
|
434
|
+
console.log(' ⢠Small feature (< 10 tasks)? ā Use Option 1 (/pm:epic-oneshot)');
|
|
435
|
+
console.log(' ⢠Large feature (15+ tasks)? ā Use Option 2 (/pm:prd-split)');
|
|
436
|
+
console.log(' ⢠Need full control? ā Use Option 3 (step-by-step)');
|
|
437
|
+
console.log('');
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
generatePrdContent(name, data) {
|
|
441
|
+
const timestamp = new Date().toISOString();
|
|
442
|
+
const author = process.env.USER || 'unknown';
|
|
443
|
+
|
|
444
|
+
return `# PRD: ${name}
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
status: draft
|
|
448
|
+
priority: ${data.priority}
|
|
449
|
+
created: ${timestamp}
|
|
450
|
+
author: ${author}
|
|
451
|
+
timeline: ${data.timeline || 'TBD'}
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Executive Summary
|
|
455
|
+
|
|
456
|
+
${data.vision || 'Product vision to be defined...'}
|
|
457
|
+
|
|
458
|
+
## Problem Statement
|
|
459
|
+
|
|
460
|
+
### Background
|
|
461
|
+
${data.vision ? `The need for this feature arises from: ${data.vision}` : 'Context and background to be added...'}
|
|
462
|
+
|
|
463
|
+
### Current State
|
|
464
|
+
- Current limitations and pain points
|
|
465
|
+
- Existing workarounds users employ
|
|
466
|
+
- Impact on user experience
|
|
467
|
+
|
|
468
|
+
### Desired State
|
|
469
|
+
- How the solution will address the problem
|
|
470
|
+
- Expected improvements and benefits
|
|
471
|
+
- Success criteria
|
|
472
|
+
|
|
473
|
+
## Target Users
|
|
474
|
+
|
|
475
|
+
${data.users || 'Target user segments to be defined...'}
|
|
476
|
+
|
|
477
|
+
### User Personas
|
|
478
|
+
- **Primary Users**: Core user segment
|
|
479
|
+
- **Secondary Users**: Additional beneficiaries
|
|
480
|
+
- **Stakeholders**: Indirect beneficiaries
|
|
481
|
+
|
|
482
|
+
### User Stories
|
|
483
|
+
${data.features.length > 0 ? data.features.map(f => `- As a user, I want to ${f}`).join('\n') : '- User stories to be defined...'}
|
|
484
|
+
|
|
485
|
+
## Key Features
|
|
486
|
+
|
|
487
|
+
### Must Have (P0)
|
|
488
|
+
${data.features.length > 0 ? data.features.slice(0, 3).map(f => `- [ ] ${f}`).join('\n') : '- [ ] Core feature 1\n- [ ] Core feature 2'}
|
|
489
|
+
|
|
490
|
+
### Should Have (P1)
|
|
491
|
+
${data.features.length > 3 ? data.features.slice(3, 6).map(f => `- [ ] ${f}`).join('\n') : '- [ ] Additional feature 1\n- [ ] Additional feature 2'}
|
|
492
|
+
|
|
493
|
+
### Nice to Have (P2)
|
|
494
|
+
${data.features.length > 6 ? data.features.slice(6).map(f => `- [ ] ${f}`).join('\n') : '- [ ] Enhancement 1\n- [ ] Enhancement 2'}
|
|
495
|
+
|
|
496
|
+
## Success Metrics
|
|
497
|
+
|
|
498
|
+
${data.metrics || 'Success metrics to be defined...'}
|
|
499
|
+
|
|
500
|
+
### Key Performance Indicators (KPIs)
|
|
501
|
+
- **Adoption Rate**: Target percentage of users adopting the feature
|
|
502
|
+
- **User Satisfaction**: Target NPS or satisfaction score
|
|
503
|
+
- **Performance**: Response time, throughput targets
|
|
504
|
+
- **Quality**: Bug rate, error rate targets
|
|
505
|
+
|
|
506
|
+
### Measurement Plan
|
|
507
|
+
- How metrics will be collected
|
|
508
|
+
- Reporting frequency
|
|
509
|
+
- Success thresholds
|
|
510
|
+
|
|
511
|
+
## Technical Requirements
|
|
512
|
+
|
|
513
|
+
${data.technical || 'Technical requirements to be specified...'}
|
|
514
|
+
|
|
515
|
+
### Architecture Considerations
|
|
516
|
+
- System components affected
|
|
517
|
+
- Integration points
|
|
518
|
+
- Data flow and storage
|
|
519
|
+
|
|
520
|
+
### Non-Functional Requirements
|
|
521
|
+
- **Performance**: Response time < 200ms
|
|
522
|
+
- **Scalability**: Support for X concurrent users
|
|
523
|
+
- **Security**: Authentication, authorization requirements
|
|
524
|
+
- **Reliability**: 99.9% uptime target
|
|
525
|
+
|
|
526
|
+
### Dependencies
|
|
527
|
+
- External services or APIs
|
|
528
|
+
- Internal systems or components
|
|
529
|
+
- Third-party libraries or tools
|
|
530
|
+
|
|
531
|
+
## Implementation Plan
|
|
532
|
+
|
|
533
|
+
### Phase 1: Foundation (Week 1-2)
|
|
534
|
+
- [ ] Technical design review
|
|
535
|
+
- [ ] Set up development environment
|
|
536
|
+
- [ ] Create initial architecture
|
|
537
|
+
|
|
538
|
+
### Phase 2: Core Features (Week 3-4)
|
|
539
|
+
- [ ] Implement must-have features
|
|
540
|
+
- [ ] Initial testing
|
|
541
|
+
- [ ] Code review
|
|
542
|
+
|
|
543
|
+
### Phase 3: Enhancement (Week 5-6)
|
|
544
|
+
- [ ] Implement should-have features
|
|
545
|
+
- [ ] Integration testing
|
|
546
|
+
- [ ] Performance optimization
|
|
547
|
+
|
|
548
|
+
### Phase 4: Release (Week 7-8)
|
|
549
|
+
- [ ] Final testing
|
|
550
|
+
- [ ] Documentation
|
|
551
|
+
- [ ] Deployment
|
|
552
|
+
|
|
553
|
+
## Risks and Mitigation
|
|
554
|
+
|
|
555
|
+
### Technical Risks
|
|
556
|
+
- **Risk 1**: Description and mitigation strategy
|
|
557
|
+
- **Risk 2**: Description and mitigation strategy
|
|
558
|
+
|
|
559
|
+
### Business Risks
|
|
560
|
+
- **Risk 1**: Impact and contingency plan
|
|
561
|
+
- **Risk 2**: Impact and contingency plan
|
|
562
|
+
|
|
563
|
+
## Open Questions
|
|
564
|
+
|
|
565
|
+
- [ ] Question 1 requiring clarification
|
|
566
|
+
- [ ] Question 2 needing stakeholder input
|
|
567
|
+
- [ ] Question 3 for technical investigation
|
|
568
|
+
|
|
569
|
+
## Appendix
|
|
570
|
+
|
|
571
|
+
### References
|
|
572
|
+
- Related documentation
|
|
573
|
+
- Previous PRDs
|
|
574
|
+
- Market research
|
|
575
|
+
|
|
576
|
+
### Glossary
|
|
577
|
+
- Term definitions
|
|
578
|
+
- Acronym explanations
|
|
579
|
+
|
|
580
|
+
### Changelog
|
|
581
|
+
- ${timestamp}: Initial PRD created by ${author}
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
*This PRD is a living document. Updates should be tracked in the changelog section.*
|
|
586
|
+
`;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
listExistingPrds() {
|
|
590
|
+
if (fs.existsSync(this.prdsDir)) {
|
|
591
|
+
const prds = fs.readdirSync(this.prdsDir)
|
|
592
|
+
.filter(f => f.endsWith('.md'))
|
|
593
|
+
.map(f => f.replace('.md', ''));
|
|
594
|
+
|
|
595
|
+
if (prds.length > 0) {
|
|
596
|
+
console.log('\nš Existing PRDs:');
|
|
597
|
+
prds.forEach(prd => {
|
|
598
|
+
const prdFile = path.join(this.prdsDir, `${prd}.md`);
|
|
599
|
+
const content = fs.readFileSync(prdFile, 'utf8');
|
|
600
|
+
const priorityMatch = content.match(/priority: (P\d)/);
|
|
601
|
+
const statusMatch = content.match(/status: (\w+)/);
|
|
602
|
+
|
|
603
|
+
const priority = priorityMatch ? priorityMatch[1] : 'P2';
|
|
604
|
+
const status = statusMatch ? statusMatch[1] : 'draft';
|
|
605
|
+
|
|
606
|
+
console.log(` ⢠${prd} [${priority}] (${status})`);
|
|
607
|
+
});
|
|
608
|
+
} else {
|
|
609
|
+
console.log(' No PRDs found');
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
async run(args) {
|
|
615
|
+
// Parse arguments
|
|
616
|
+
let prdName = null;
|
|
617
|
+
let templateName = null;
|
|
618
|
+
|
|
619
|
+
// Check for --template or -t flag
|
|
620
|
+
for (let i = 0; i < args.length; i++) {
|
|
621
|
+
if (args[i] === '--template' || args[i] === '-t') {
|
|
622
|
+
templateName = args[i + 1];
|
|
623
|
+
i++; // Skip next arg
|
|
624
|
+
} else if (!prdName) {
|
|
625
|
+
prdName = args[i];
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
if (!prdName) {
|
|
630
|
+
// Interactive mode
|
|
631
|
+
const rl = readline.createInterface({
|
|
632
|
+
input: process.stdin,
|
|
633
|
+
output: process.stdout
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
const prompt = (question) => new Promise((resolve) => {
|
|
637
|
+
rl.question(question, resolve);
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
console.log('\nš PRD Creation Wizard');
|
|
641
|
+
console.log(`${'ā'.repeat(50)}`);
|
|
642
|
+
|
|
643
|
+
this.listExistingPrds();
|
|
644
|
+
|
|
645
|
+
console.log('\n');
|
|
646
|
+
prdName = await prompt('Enter PRD name (use-kebab-case): ');
|
|
647
|
+
rl.close();
|
|
648
|
+
|
|
649
|
+
if (!prdName) {
|
|
650
|
+
console.error('ā Error: PRD name required');
|
|
651
|
+
process.exit(1);
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// Ask for template if not provided
|
|
655
|
+
if (!templateName) {
|
|
656
|
+
templateName = await this.selectTemplate();
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// Sanitize PRD name
|
|
661
|
+
prdName = prdName.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
662
|
+
|
|
663
|
+
// Create PRD from template or traditional mode
|
|
664
|
+
let success;
|
|
665
|
+
if (templateName && templateName !== 'none') {
|
|
666
|
+
success = await this.createPrdFromTemplate(prdName, templateName);
|
|
667
|
+
} else {
|
|
668
|
+
success = await this.createPrd(prdName);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
process.exit(success ? 0 : 1);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
// Main execution
|
|
676
|
+
if (require.main === module) {
|
|
677
|
+
const creator = new PrdCreator();
|
|
678
|
+
creator.run(process.argv.slice(2)).catch(error => {
|
|
679
|
+
console.error('ā Error:', error.message);
|
|
680
|
+
process.exit(1);
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
module.exports = PrdCreator;
|