aios-core 2.1.6 → 2.2.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/.aios-core/core/README.md +229 -229
- package/.aios-core/core/data/agent-config-requirements.yaml +368 -368
- package/.aios-core/core/data/aios-kb.md +923 -923
- package/.aios-core/core/data/workflow-patterns.yaml +267 -267
- package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -335
- package/.aios-core/core/docs/component-creation-guide.md +457 -457
- package/.aios-core/core/docs/session-update-pattern.md +307 -307
- package/.aios-core/core/docs/template-syntax.md +266 -266
- package/.aios-core/core/docs/troubleshooting-guide.md +624 -624
- package/.aios-core/core/elicitation/elicitation-engine.js +1 -1
- package/.aios-core/core/index.esm.js +42 -42
- package/.aios-core/core/index.js +1 -1
- package/.aios-core/core/migration/migration-config.yaml +83 -83
- package/.aios-core/core/migration/module-mapping.yaml +89 -89
- package/.aios-core/core/quality-gates/layer2-pr-automation.js +1 -1
- package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -86
- package/.aios-core/core/registry/README.md +179 -179
- package/.aios-core/core/utils/security-utils.js +1 -1
- package/.aios-core/core-config.yaml +391 -382
- package/.aios-core/data/agent-config-requirements.yaml +368 -368
- package/.aios-core/data/aios-kb.md +923 -923
- package/.aios-core/data/technical-preferences.md +3 -3
- package/.aios-core/data/workflow-patterns.yaml +267 -267
- package/.aios-core/development/README.md +142 -142
- package/.aios-core/development/agent-teams/team-all.yaml +15 -15
- package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -18
- package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -10
- package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -13
- package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -155
- package/.aios-core/development/agents/aios-master.md +339 -339
- package/.aios-core/development/agents/analyst.md +195 -195
- package/.aios-core/development/agents/architect.md +359 -359
- package/.aios-core/development/agents/data-engineer.md +468 -468
- package/.aios-core/development/agents/dev.md +390 -390
- package/.aios-core/development/agents/devops.md +398 -398
- package/.aios-core/development/agents/pm.md +198 -198
- package/.aios-core/development/agents/po.md +256 -256
- package/.aios-core/development/agents/qa.md +312 -312
- package/.aios-core/development/agents/sm.md +220 -220
- package/.aios-core/development/agents/ux-design-expert.md +451 -451
- package/.aios-core/development/scripts/greeting-config-cli.js +85 -85
- package/.aios-core/development/tasks/add-mcp.md +319 -319
- package/.aios-core/development/tasks/advanced-elicitation.md +318 -318
- package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +341 -341
- package/.aios-core/development/tasks/analyze-framework.md +696 -696
- package/.aios-core/development/tasks/analyze-performance.md +637 -637
- package/.aios-core/development/tasks/apply-qa-fixes.md +340 -340
- package/.aios-core/development/tasks/architect-analyze-impact.md +826 -826
- package/.aios-core/development/tasks/audit-codebase.md +429 -429
- package/.aios-core/development/tasks/audit-tailwind-config.md +270 -270
- package/.aios-core/development/tasks/audit-utilities.md +358 -358
- package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -286
- package/.aios-core/development/tasks/brownfield-create-epic.md +485 -485
- package/.aios-core/development/tasks/brownfield-create-story.md +356 -356
- package/.aios-core/development/tasks/build-component.md +478 -478
- package/.aios-core/development/tasks/calculate-roi.md +455 -455
- package/.aios-core/development/tasks/ci-cd-configuration.md +764 -764
- package/.aios-core/development/tasks/cleanup-utilities.md +670 -670
- package/.aios-core/development/tasks/collaborative-edit.md +1108 -1108
- package/.aios-core/development/tasks/compose-molecule.md +284 -284
- package/.aios-core/development/tasks/consolidate-patterns.md +414 -414
- package/.aios-core/development/tasks/correct-course.md +279 -279
- package/.aios-core/development/tasks/create-agent.md +321 -321
- package/.aios-core/development/tasks/create-brownfield-story.md +726 -726
- package/.aios-core/development/tasks/create-deep-research-prompt.md +498 -498
- package/.aios-core/development/tasks/create-doc.md +316 -316
- package/.aios-core/development/tasks/create-next-story.md +774 -774
- package/.aios-core/development/tasks/create-suite.md +283 -283
- package/.aios-core/development/tasks/create-task.md +371 -371
- package/.aios-core/development/tasks/create-workflow.md +370 -370
- package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -572
- package/.aios-core/development/tasks/db-apply-migration.md +381 -381
- package/.aios-core/development/tasks/db-bootstrap.md +642 -642
- package/.aios-core/development/tasks/db-domain-modeling.md +693 -693
- package/.aios-core/development/tasks/db-dry-run.md +293 -293
- package/.aios-core/development/tasks/db-env-check.md +260 -260
- package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -663
- package/.aios-core/development/tasks/db-explain.md +631 -631
- package/.aios-core/development/tasks/db-impersonate.md +495 -495
- package/.aios-core/development/tasks/db-load-csv.md +593 -593
- package/.aios-core/development/tasks/db-policy-apply.md +653 -653
- package/.aios-core/development/tasks/db-rls-audit.md +411 -411
- package/.aios-core/development/tasks/db-rollback.md +739 -739
- package/.aios-core/development/tasks/db-run-sql.md +613 -613
- package/.aios-core/development/tasks/db-schema-audit.md +1011 -1011
- package/.aios-core/development/tasks/db-seed.md +390 -390
- package/.aios-core/development/tasks/db-smoke-test.md +351 -351
- package/.aios-core/development/tasks/db-snapshot.md +569 -569
- package/.aios-core/development/tasks/db-supabase-setup.md +712 -712
- package/.aios-core/development/tasks/db-verify-order.md +515 -515
- package/.aios-core/development/tasks/deprecate-component.md +956 -956
- package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -318
- package/.aios-core/development/tasks/dev-backlog-debt.md +469 -469
- package/.aios-core/development/tasks/dev-develop-story.md +846 -846
- package/.aios-core/development/tasks/dev-improve-code-quality.md +872 -872
- package/.aios-core/development/tasks/dev-optimize-performance.md +1033 -1033
- package/.aios-core/development/tasks/dev-suggest-refactoring.md +870 -870
- package/.aios-core/development/tasks/dev-validate-next-story.md +348 -348
- package/.aios-core/development/tasks/document-project.md +552 -552
- package/.aios-core/development/tasks/environment-bootstrap.md +1311 -1311
- package/.aios-core/development/tasks/execute-checklist.md +301 -301
- package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -274
- package/.aios-core/development/tasks/extend-pattern.md +269 -269
- package/.aios-core/development/tasks/extract-tokens.md +467 -467
- package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -518
- package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +260 -260
- package/.aios-core/development/tasks/generate-documentation.md +284 -284
- package/.aios-core/development/tasks/generate-migration-strategy.md +522 -522
- package/.aios-core/development/tasks/generate-shock-report.md +501 -501
- package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -427
- package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -733
- package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -374
- package/.aios-core/development/tasks/github-devops-version-management.md +483 -483
- package/.aios-core/development/tasks/improve-self.md +822 -822
- package/.aios-core/development/tasks/index-docs.md +387 -387
- package/.aios-core/development/tasks/init-project-status.md +506 -506
- package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -314
- package/.aios-core/development/tasks/kb-mode-interaction.md +283 -283
- package/.aios-core/development/tasks/learn-patterns.md +900 -900
- package/.aios-core/development/tasks/mcp-workflow.md +437 -437
- package/.aios-core/development/tasks/modify-agent.md +381 -381
- package/.aios-core/development/tasks/modify-task.md +424 -424
- package/.aios-core/development/tasks/modify-workflow.md +465 -465
- package/.aios-core/development/tasks/po-backlog-add.md +370 -370
- package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -523
- package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -540
- package/.aios-core/development/tasks/po-pull-story.md +316 -316
- package/.aios-core/development/tasks/po-stories-index.md +351 -351
- package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -457
- package/.aios-core/development/tasks/po-sync-story.md +303 -303
- package/.aios-core/development/tasks/pr-automation.md +701 -701
- package/.aios-core/development/tasks/propose-modification.md +842 -842
- package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -425
- package/.aios-core/development/tasks/qa-gate.md +373 -373
- package/.aios-core/development/tasks/qa-generate-tests.md +1174 -1174
- package/.aios-core/development/tasks/qa-nfr-assess.md +557 -557
- package/.aios-core/development/tasks/qa-review-proposal.md +1157 -1157
- package/.aios-core/development/tasks/qa-review-story.md +682 -682
- package/.aios-core/development/tasks/qa-risk-profile.md +566 -566
- package/.aios-core/development/tasks/qa-run-tests.md +277 -277
- package/.aios-core/development/tasks/qa-test-design.md +387 -387
- package/.aios-core/development/tasks/qa-trace-requirements.md +476 -476
- package/.aios-core/development/tasks/release-management.md +723 -723
- package/.aios-core/development/tasks/security-audit.md +554 -554
- package/.aios-core/development/tasks/security-scan.md +790 -790
- package/.aios-core/development/tasks/setup-database.md +741 -741
- package/.aios-core/development/tasks/setup-design-system.md +462 -462
- package/.aios-core/development/tasks/setup-github.md +874 -874
- package/.aios-core/development/tasks/setup-llm-routing.md +1 -1
- package/.aios-core/development/tasks/setup-mcp-docker.md +584 -584
- package/.aios-core/development/tasks/setup-project-docs.md +1 -1
- package/.aios-core/development/tasks/shard-doc.md +537 -537
- package/.aios-core/development/tasks/sm-create-next-story.md +480 -480
- package/.aios-core/development/tasks/sync-documentation.md +864 -864
- package/.aios-core/development/tasks/tailwind-upgrade.md +294 -294
- package/.aios-core/development/tasks/test-as-user.md +621 -621
- package/.aios-core/development/tasks/test-validation-task.md +171 -171
- package/.aios-core/development/tasks/undo-last.md +346 -346
- package/.aios-core/development/tasks/update-manifest.md +409 -409
- package/.aios-core/development/tasks/ux-create-wireframe.md +617 -617
- package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -672
- package/.aios-core/development/tasks/ux-user-research.md +559 -559
- package/.aios-core/development/tasks/validate-next-story.md +422 -422
- package/.aios-core/development/workflows/README.md +83 -83
- package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -297
- package/.aios-core/development/workflows/brownfield-service.yaml +187 -187
- package/.aios-core/development/workflows/brownfield-ui.yaml +197 -197
- package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -333
- package/.aios-core/development/workflows/greenfield-service.yaml +206 -206
- package/.aios-core/development/workflows/greenfield-ui.yaml +235 -235
- package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -335
- package/.aios-core/docs/component-creation-guide.md +457 -457
- package/.aios-core/docs/session-update-pattern.md +307 -307
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -572
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -185
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -354
- package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -1963
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -821
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -1190
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -439
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -1339
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -5398
- package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -697
- package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -511
- package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -556
- package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -210
- package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -550
- package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -1414
- package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -523
- package/.aios-core/docs/template-syntax.md +266 -266
- package/.aios-core/docs/troubleshooting-guide.md +624 -624
- package/.aios-core/index.esm.js +15 -15
- package/.aios-core/index.js +1 -1
- package/.aios-core/infrastructure/README.md +126 -126
- package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -59
- package/.aios-core/infrastructure/scripts/approval-workflow.js +1 -1
- package/.aios-core/infrastructure/scripts/batch-creator.js +1 -1
- package/.aios-core/infrastructure/scripts/component-generator.js +3 -3
- package/.aios-core/infrastructure/scripts/component-metadata.js +1 -1
- package/.aios-core/infrastructure/scripts/component-search.js +1 -1
- package/.aios-core/infrastructure/scripts/coverage-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/dependency-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/framework-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/improvement-engine.js +1 -1
- package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +26 -13
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free-tracked.sh +108 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-proxy.sh +65 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-usage.sh +16 -0
- package/.aios-core/infrastructure/scripts/llm-routing/usage-tracker/index.js +549 -0
- package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +1 -1
- package/.aios-core/infrastructure/scripts/performance-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -134
- package/.aios-core/infrastructure/scripts/repository-detector.js +3 -3
- package/.aios-core/infrastructure/scripts/template-engine.js +1 -1
- package/.aios-core/infrastructure/scripts/template-validator.js +1 -1
- package/.aios-core/infrastructure/scripts/test-generator.js +1 -1
- package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1 -1
- package/.aios-core/infrastructure/scripts/transaction-manager.js +1 -1
- package/.aios-core/infrastructure/scripts/usage-analytics.js +1 -1
- package/.aios-core/infrastructure/scripts/visual-impact-generator.js +2 -2
- package/.aios-core/infrastructure/templates/github-workflows/README.md +109 -109
- package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -621
- package/.aios-core/infrastructure/tools/README.md +222 -222
- package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -200
- package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -260
- package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -224
- package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -261
- package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -127
- package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -103
- package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -534
- package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -78
- package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -180
- package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -103
- package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -930
- package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -551
- package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -808
- package/.aios-core/install-manifest.yaml +347 -347
- package/.aios-core/product/README.md +56 -56
- package/.aios-core/product/checklists/accessibility-wcag-checklist.md +80 -0
- package/.aios-core/product/checklists/architect-checklist.md +443 -443
- package/.aios-core/product/checklists/change-checklist.md +182 -182
- package/.aios-core/product/checklists/component-quality-checklist.md +74 -0
- package/.aios-core/product/checklists/database-design-checklist.md +119 -119
- package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -97
- package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -99
- package/.aios-core/product/checklists/migration-readiness-checklist.md +75 -0
- package/.aios-core/product/checklists/pattern-audit-checklist.md +88 -0
- package/.aios-core/product/checklists/pm-checklist.md +375 -375
- package/.aios-core/product/checklists/po-master-checklist.md +441 -441
- package/.aios-core/product/checklists/pre-push-checklist.md +108 -108
- package/.aios-core/product/checklists/release-checklist.md +122 -122
- package/.aios-core/product/checklists/story-dod-checklist.md +101 -101
- package/.aios-core/product/checklists/story-draft-checklist.md +215 -215
- package/.aios-core/product/data/atomic-design-principles.md +108 -0
- package/.aios-core/product/data/brainstorming-techniques.md +36 -36
- package/.aios-core/product/data/consolidation-algorithms.md +142 -0
- package/.aios-core/product/data/database-best-practices.md +182 -0
- package/.aios-core/product/data/design-token-best-practices.md +107 -0
- package/.aios-core/product/data/elicitation-methods.md +134 -134
- package/.aios-core/product/data/integration-patterns.md +207 -0
- package/.aios-core/product/data/migration-safety-guide.md +329 -0
- package/.aios-core/product/data/mode-selection-best-practices.md +471 -471
- package/.aios-core/product/data/postgres-tuning-guide.md +300 -0
- package/.aios-core/product/data/rls-security-patterns.md +333 -0
- package/.aios-core/product/data/roi-calculation-guide.md +142 -0
- package/.aios-core/product/data/supabase-patterns.md +330 -0
- package/.aios-core/product/data/test-levels-framework.md +148 -148
- package/.aios-core/product/data/test-priorities-matrix.md +174 -174
- package/.aios-core/product/data/wcag-compliance-guide.md +267 -0
- package/.aios-core/product/templates/1mcp-config.yaml +225 -225
- package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -63
- package/.aios-core/product/templates/activation-instructions-template.md +258 -258
- package/.aios-core/product/templates/agent-template.yaml +120 -120
- package/.aios-core/product/templates/architecture-tmpl.yaml +650 -650
- package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +155 -155
- package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +475 -475
- package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +279 -279
- package/.aios-core/product/templates/changelog-template.md +134 -134
- package/.aios-core/product/templates/command-rationalization-matrix.md +152 -152
- package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +292 -292
- package/.aios-core/product/templates/design-story-tmpl.yaml +587 -587
- package/.aios-core/product/templates/ds-artifact-analysis.md +70 -70
- package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +205 -205
- package/.aios-core/product/templates/front-end-spec-tmpl.yaml +348 -348
- package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +804 -804
- package/.aios-core/product/templates/github-pr-template.md +67 -67
- package/.aios-core/product/templates/gordon-mcp.yaml +140 -140
- package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -115
- package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -221
- package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -84
- package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -92
- package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -115
- package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -85
- package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -86
- package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -104
- package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -80
- package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -53
- package/.aios-core/product/templates/market-research-tmpl.yaml +251 -251
- package/.aios-core/product/templates/mcp-workflow.js +271 -271
- package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -1022
- package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -524
- package/.aios-core/product/templates/personalized-agent-template.md +258 -258
- package/.aios-core/product/templates/personalized-checklist-template.md +340 -340
- package/.aios-core/product/templates/personalized-task-template-v2.md +905 -905
- package/.aios-core/product/templates/personalized-task-template.md +344 -344
- package/.aios-core/product/templates/personalized-template-file.yaml +322 -322
- package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -460
- package/.aios-core/product/templates/prd-tmpl.yaml +201 -201
- package/.aios-core/product/templates/project-brief-tmpl.yaml +220 -220
- package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -240
- package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -1203
- package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -428
- package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -219
- package/.aios-core/product/templates/story-tmpl.yaml +331 -331
- package/.aios-core/product/templates/task-execution-report.md +495 -495
- package/.aios-core/product/templates/task-template.md +122 -122
- package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -395
- package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -305
- package/.aios-core/product/templates/workflow-template.yaml +133 -133
- package/.aios-core/scripts/README.md +354 -354
- package/.aios-core/scripts/aios-doc-template.md +325 -325
- package/.aios-core/scripts/elicitation-engine.js +1 -1
- package/.aios-core/scripts/test-template-system.js +1 -1
- package/.aios-core/scripts/workflow-management.md +69 -69
- package/.aios-core/user-guide.md +1413 -1413
- package/.aios-core/working-in-the-brownfield.md +361 -361
- package/LICENSE +1 -1
- package/README.md +702 -703
- package/bin/aios-init-old.js +3 -3
- package/bin/aios-init-v4.js +1 -1
- package/bin/aios-init.backup-v1.1.4.js +1 -1
- package/bin/aios-init.js +3 -3
- package/bin/aios.js +279 -279
- package/bin/utils/install-errors.js +339 -339
- package/bin/utils/install-transaction.js +445 -445
- package/index.d.ts +18 -18
- package/index.esm.js +20 -20
- package/index.js +6 -6
- package/package.json +8 -10
- package/packages/installer/src/config/templates/env-template.js +27 -4
- package/packages/installer/src/detection/detect-project-type.js +81 -81
- package/packages/installer/tests/integration/wizard-detection.test.js +8 -6
- package/packages/installer/tests/unit/env-template.test.js +8 -8
- package/src/config/ide-configs.js +1 -1
- package/src/wizard/feedback.js +2 -2
- package/src/wizard/index.js +1 -1
- package/src/wizard/validation/report-generator.js +1 -1
- package/src/wizard/validation/troubleshooting-system.js +13 -13
- package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +0 -122
- package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +0 -89
- package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +0 -780
- package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +0 -950
- package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +0 -425
- package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +0 -132
- package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +0 -381
- package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +0 -203
- package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +0 -24
- package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +0 -51
- package/.aios-core/tasks/find-component.md.legacy +0 -391
- package/.aios-core/tasks/generate-commit-message.md.legacy +0 -426
- package/.aios-core/tasks/generate-migration.md.legacy +0 -382
- package/.aios-core/tasks/rollback-modification.md.legacy +0 -307
- package/.aios-core/tasks/update-tests.md.legacy +0 -283
|
@@ -1,534 +1,534 @@
|
|
|
1
|
-
tool:
|
|
2
|
-
schema_version: 2.0
|
|
3
|
-
id: clickup
|
|
4
|
-
type: mcp
|
|
5
|
-
name: ClickUp
|
|
6
|
-
version: 1.0.0
|
|
7
|
-
description: ClickUp project management with pre-execution validation and API complexity handling
|
|
8
|
-
knowledge_strategy: executable
|
|
9
|
-
|
|
10
|
-
executable_knowledge:
|
|
11
|
-
validators:
|
|
12
|
-
# Combined validator for create_task (all checks in one function)
|
|
13
|
-
- id: validate-create-task
|
|
14
|
-
validates: create_task
|
|
15
|
-
language: javascript
|
|
16
|
-
checks:
|
|
17
|
-
- required_fields: [name, list_id]
|
|
18
|
-
function: |
|
|
19
|
-
(function() {
|
|
20
|
-
const errors = [];
|
|
21
|
-
|
|
22
|
-
// 1. Required fields
|
|
23
|
-
if (!args.args.name) {
|
|
24
|
-
errors.push("name is required");
|
|
25
|
-
}
|
|
26
|
-
if (!args.args.list_id && !args.args.listId) {
|
|
27
|
-
errors.push("list_id is required");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// 2. Assignee format (must be array for create)
|
|
31
|
-
if (args.args.assignees && typeof args.args.assignees === 'object' && !Array.isArray(args.args.assignees)) {
|
|
32
|
-
errors.push("assignees must be array for create_task, got object");
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// 3. Custom fields structure
|
|
36
|
-
const customFields = args.args.custom_fields;
|
|
37
|
-
if (customFields) {
|
|
38
|
-
if (!Array.isArray(customFields)) {
|
|
39
|
-
errors.push("custom_fields must be an array");
|
|
40
|
-
} else {
|
|
41
|
-
customFields.forEach((field, index) => {
|
|
42
|
-
if (!field.id) {
|
|
43
|
-
errors.push(`custom_fields[${index}] missing required 'id' field`);
|
|
44
|
-
}
|
|
45
|
-
if (!field.hasOwnProperty('value')) {
|
|
46
|
-
errors.push(`custom_fields[${index}] missing required 'value' field`);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// 4. List ID format (numeric string)
|
|
53
|
-
const listId = args.args.list_id || args.args.listId;
|
|
54
|
-
if (listId && !/^\d+$/.test(String(listId))) {
|
|
55
|
-
errors.push("list_id must be a numeric string");
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// 5. Priority range (1-4)
|
|
59
|
-
const priority = args.args.priority;
|
|
60
|
-
if (priority !== undefined && priority !== null) {
|
|
61
|
-
const p = Number(priority);
|
|
62
|
-
if (isNaN(p) || p < 1 || p > 4) {
|
|
63
|
-
errors.push("priority must be between 1 (urgent) and 4 (low)");
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// 6. Time estimate (positive number)
|
|
68
|
-
const timeEstimate = args.args.time_estimate;
|
|
69
|
-
if (timeEstimate !== undefined) {
|
|
70
|
-
const estimate = Number(timeEstimate);
|
|
71
|
-
if (isNaN(estimate) || estimate < 0) {
|
|
72
|
-
errors.push("time_estimate must be a positive number (milliseconds)");
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
valid: errors.length === 0,
|
|
78
|
-
errors: errors
|
|
79
|
-
};
|
|
80
|
-
})();
|
|
81
|
-
|
|
82
|
-
# Combined validator for update_task
|
|
83
|
-
- id: validate-update-task
|
|
84
|
-
validates: update_task
|
|
85
|
-
language: javascript
|
|
86
|
-
function: |
|
|
87
|
-
(function() {
|
|
88
|
-
const errors = [];
|
|
89
|
-
const assignees = args.args.assignees;
|
|
90
|
-
|
|
91
|
-
// Assignees format (must be object with add/rem for update)
|
|
92
|
-
if (assignees) {
|
|
93
|
-
if (Array.isArray(assignees)) {
|
|
94
|
-
errors.push("assignees must be object {add: [], rem: []} for update_task, got array");
|
|
95
|
-
} else if (typeof assignees === 'object') {
|
|
96
|
-
if (assignees.add && !Array.isArray(assignees.add)) {
|
|
97
|
-
errors.push("assignees.add must be an array");
|
|
98
|
-
}
|
|
99
|
-
if (assignees.rem && !Array.isArray(assignees.rem)) {
|
|
100
|
-
errors.push("assignees.rem must be an array");
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return {
|
|
106
|
-
valid: errors.length === 0,
|
|
107
|
-
errors: errors
|
|
108
|
-
};
|
|
109
|
-
})();
|
|
110
|
-
|
|
111
|
-
# Validator for parse_webhook
|
|
112
|
-
- id: validate-webhook-payload
|
|
113
|
-
validates: parse_webhook
|
|
114
|
-
language: javascript
|
|
115
|
-
function: |
|
|
116
|
-
(function() {
|
|
117
|
-
const errors = [];
|
|
118
|
-
const payload = args.args;
|
|
119
|
-
|
|
120
|
-
if (!payload) {
|
|
121
|
-
errors.push("payload is required");
|
|
122
|
-
} else {
|
|
123
|
-
// Check for required webhook identification fields
|
|
124
|
-
if (!payload.event && !payload.webhook_id && !payload.history_items) {
|
|
125
|
-
errors.push("Invalid webhook payload: missing event, webhook_id, or history_items");
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
valid: errors.length === 0,
|
|
131
|
-
errors: errors
|
|
132
|
-
};
|
|
133
|
-
})();
|
|
134
|
-
|
|
135
|
-
helpers:
|
|
136
|
-
- id: extract-custom-field
|
|
137
|
-
language: javascript
|
|
138
|
-
runtime: isolated_vm
|
|
139
|
-
description: "Extract specific custom field value from task response"
|
|
140
|
-
function: |
|
|
141
|
-
(function() {
|
|
142
|
-
const { response, fieldName } = args;
|
|
143
|
-
if (!response || !response.custom_fields) {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
const field = response.custom_fields.find(f => f.name === fieldName);
|
|
147
|
-
return field || null;
|
|
148
|
-
})();
|
|
149
|
-
|
|
150
|
-
- id: format-assignee-for-create
|
|
151
|
-
language: javascript
|
|
152
|
-
runtime: isolated_vm
|
|
153
|
-
description: "Convert assignee IDs to create_task format (array)"
|
|
154
|
-
function: |
|
|
155
|
-
(function() {
|
|
156
|
-
const { assignees } = args;
|
|
157
|
-
if (!assignees) return [];
|
|
158
|
-
if (Array.isArray(assignees)) return assignees;
|
|
159
|
-
if (typeof assignees === 'number') return [assignees];
|
|
160
|
-
return [];
|
|
161
|
-
})();
|
|
162
|
-
|
|
163
|
-
- id: format-assignee-for-update
|
|
164
|
-
language: javascript
|
|
165
|
-
runtime: isolated_vm
|
|
166
|
-
description: "Convert assignee IDs to update_task format (object)"
|
|
167
|
-
function: |
|
|
168
|
-
(function() {
|
|
169
|
-
const { add, remove } = args;
|
|
170
|
-
const result = {};
|
|
171
|
-
if (add) result.add = Array.isArray(add) ? add : [add];
|
|
172
|
-
if (remove) result.rem = Array.isArray(remove) ? remove : [remove];
|
|
173
|
-
return result;
|
|
174
|
-
})();
|
|
175
|
-
|
|
176
|
-
- id: parse-webhook-type
|
|
177
|
-
language: javascript
|
|
178
|
-
runtime: isolated_vm
|
|
179
|
-
description: "Detect webhook payload type from structure"
|
|
180
|
-
function: |
|
|
181
|
-
(function() {
|
|
182
|
-
const { payload } = args;
|
|
183
|
-
if (!payload) return 'unknown';
|
|
184
|
-
|
|
185
|
-
if (payload.event) return 'standard';
|
|
186
|
-
if (payload.webhook_id) return 'webhook_variant';
|
|
187
|
-
if (payload.history_items) return 'history_items';
|
|
188
|
-
|
|
189
|
-
return 'unknown';
|
|
190
|
-
})();
|
|
191
|
-
|
|
192
|
-
- id: extract-webhook-payload
|
|
193
|
-
language: javascript
|
|
194
|
-
runtime: isolated_vm
|
|
195
|
-
description: "Extract actual payload based on webhook type"
|
|
196
|
-
function: |
|
|
197
|
-
(function() {
|
|
198
|
-
const { webhook } = args;
|
|
199
|
-
if (!webhook) return null;
|
|
200
|
-
|
|
201
|
-
// Standard format
|
|
202
|
-
if (webhook.event && webhook.payload) {
|
|
203
|
-
return webhook.payload;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Webhook variant format
|
|
207
|
-
if (webhook.webhook_id && webhook.data && webhook.data.webhook) {
|
|
208
|
-
return webhook.data.webhook.payload;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// History items format
|
|
212
|
-
if (webhook.history_items) {
|
|
213
|
-
return webhook;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return null;
|
|
217
|
-
})();
|
|
218
|
-
|
|
219
|
-
- id: calculate-time-tracking-total
|
|
220
|
-
language: javascript
|
|
221
|
-
runtime: isolated_vm
|
|
222
|
-
description: "Sum time tracking entries for a task"
|
|
223
|
-
function: |
|
|
224
|
-
(function() {
|
|
225
|
-
const { timeEntries } = args;
|
|
226
|
-
if (!Array.isArray(timeEntries)) return 0;
|
|
227
|
-
|
|
228
|
-
return timeEntries.reduce((total, entry) => {
|
|
229
|
-
return total + (entry.duration || 0);
|
|
230
|
-
}, 0);
|
|
231
|
-
})();
|
|
232
|
-
|
|
233
|
-
- id: format-custom-field-update
|
|
234
|
-
language: javascript
|
|
235
|
-
runtime: isolated_vm
|
|
236
|
-
description: "Format custom field for API update"
|
|
237
|
-
function: |
|
|
238
|
-
(function() {
|
|
239
|
-
const { fieldId, value } = args;
|
|
240
|
-
return {
|
|
241
|
-
id: fieldId,
|
|
242
|
-
value: value
|
|
243
|
-
};
|
|
244
|
-
})();
|
|
245
|
-
|
|
246
|
-
api_complexity:
|
|
247
|
-
payload_schemas:
|
|
248
|
-
- type: standard
|
|
249
|
-
detection: "event field exists in root"
|
|
250
|
-
payload_path: "payload"
|
|
251
|
-
example: |
|
|
252
|
-
{
|
|
253
|
-
"event": "taskCreated",
|
|
254
|
-
"payload": { "task": {...} }
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
- type: webhook_variant
|
|
258
|
-
detection: "webhook_id field exists"
|
|
259
|
-
payload_path: "data.webhook.payload"
|
|
260
|
-
example: |
|
|
261
|
-
{
|
|
262
|
-
"webhook_id": "abc123",
|
|
263
|
-
"data": {
|
|
264
|
-
"webhook": {
|
|
265
|
-
"payload": { "task": {...} }
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
- type: history_items
|
|
271
|
-
detection: "history_items array exists"
|
|
272
|
-
payload_path: "history_items"
|
|
273
|
-
example: |
|
|
274
|
-
{
|
|
275
|
-
"history_items": [
|
|
276
|
-
{ "field": "status", "before": "todo", "after": "in progress" }
|
|
277
|
-
]
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
field_mappings:
|
|
281
|
-
assignees:
|
|
282
|
-
create_format:
|
|
283
|
-
structure: "[user_id1, user_id2]"
|
|
284
|
-
type: "array of integers"
|
|
285
|
-
example: "[123, 456]"
|
|
286
|
-
update_format:
|
|
287
|
-
structure: "{add: [user_id], rem: [user_id]}"
|
|
288
|
-
type: "object with add/rem arrays"
|
|
289
|
-
example: "{add: [789], rem: [456]}"
|
|
290
|
-
note: "Different formats for create vs update - common error source"
|
|
291
|
-
|
|
292
|
-
custom_fields:
|
|
293
|
-
structure: "[{id: field_id, value: field_value}]"
|
|
294
|
-
type: "array of objects"
|
|
295
|
-
validation: "Each object must have 'id' and 'value' keys"
|
|
296
|
-
example: "[{id: 'field-uuid', value: 'text value'}]"
|
|
297
|
-
|
|
298
|
-
list_id:
|
|
299
|
-
format: "numeric string"
|
|
300
|
-
validation: "Must match /^\\d+$/"
|
|
301
|
-
note: "Often called 'listId' in some API responses but 'list_id' in requests"
|
|
302
|
-
|
|
303
|
-
api_quirks:
|
|
304
|
-
- quirk: assignee_format_mismatch
|
|
305
|
-
description: "Create API expects [123], Update expects {add: [123], rem: []}"
|
|
306
|
-
impact: "Runtime errors if wrong format used"
|
|
307
|
-
mitigation: "Use command-specific validators (validate-assignee-format, validate-task-update-assignees)"
|
|
308
|
-
|
|
309
|
-
- quirk: rate_limit_headers_missing
|
|
310
|
-
description: "Rate limit info only in X-RateLimit-* headers, not in error response body"
|
|
311
|
-
impact: "Difficult to implement retry logic without header access"
|
|
312
|
-
mitigation: "Always capture response headers for rate limit tracking"
|
|
313
|
-
|
|
314
|
-
- quirk: custom_field_id_instability
|
|
315
|
-
description: "Custom field IDs can change when field is renamed or recreated"
|
|
316
|
-
impact: "Stored field IDs may become invalid"
|
|
317
|
-
mitigation: "Use field names to lookup IDs via get_workspace_hierarchy before updates"
|
|
318
|
-
|
|
319
|
-
- quirk: inconsistent_list_id_naming
|
|
320
|
-
description: "API uses 'list_id' in requests but 'listId' in responses"
|
|
321
|
-
impact: "Field mapping confusion in response processing"
|
|
322
|
-
mitigation: "Normalize to 'list_id' in all internal processing"
|
|
323
|
-
|
|
324
|
-
anti_patterns:
|
|
325
|
-
- pattern: wrong_assignee_format
|
|
326
|
-
description: "Using update format in create API"
|
|
327
|
-
category: api_usage
|
|
328
|
-
severity: high
|
|
329
|
-
wrong: |
|
|
330
|
-
create_task({
|
|
331
|
-
name: "Task",
|
|
332
|
-
list_id: "123",
|
|
333
|
-
assignees: {add: [456]} // ❌ Wrong - object format
|
|
334
|
-
})
|
|
335
|
-
correct: |
|
|
336
|
-
create_task({
|
|
337
|
-
name: "Task",
|
|
338
|
-
list_id: "123",
|
|
339
|
-
assignees: [456] // ✅ Correct - array format
|
|
340
|
-
})
|
|
341
|
-
rationale: "Create API expects array, not object. Use format-assignee-for-create helper."
|
|
342
|
-
|
|
343
|
-
- pattern: missing_custom_field_validation
|
|
344
|
-
description: "Setting custom fields without validating structure"
|
|
345
|
-
category: data_validation
|
|
346
|
-
severity: medium
|
|
347
|
-
wrong: |
|
|
348
|
-
create_task({
|
|
349
|
-
name: "Task",
|
|
350
|
-
list_id: "123",
|
|
351
|
-
custom_fields: "field-value" // ❌ Wrong - string instead of array
|
|
352
|
-
})
|
|
353
|
-
correct: |
|
|
354
|
-
create_task({
|
|
355
|
-
name: "Task",
|
|
356
|
-
list_id: "123",
|
|
357
|
-
custom_fields: [ // ✅ Correct - array of objects
|
|
358
|
-
{id: "field-uuid", value: "field-value"}
|
|
359
|
-
]
|
|
360
|
-
})
|
|
361
|
-
rationale: "Custom fields must be array of {id, value} objects. Use validate-custom-field-structure."
|
|
362
|
-
|
|
363
|
-
- pattern: undocumented_rate_limit_handling
|
|
364
|
-
description: "Not checking rate limit headers before subsequent requests"
|
|
365
|
-
category: api_reliability
|
|
366
|
-
severity: medium
|
|
367
|
-
wrong: |
|
|
368
|
-
// Make 100 requests in rapid succession
|
|
369
|
-
for (let i = 0; i < 100; i++) {
|
|
370
|
-
await create_task({...}); // ❌ No rate limit checking
|
|
371
|
-
}
|
|
372
|
-
correct: |
|
|
373
|
-
for (let i = 0; i < 100; i++) {
|
|
374
|
-
const response = await create_task({...});
|
|
375
|
-
const remaining = response.headers['X-RateLimit-Remaining'];
|
|
376
|
-
|
|
377
|
-
if (remaining < 10) {
|
|
378
|
-
// Wait for reset
|
|
379
|
-
await sleep(60000); // ✅ Proper rate limit handling
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
rationale: "ClickUp API has strict rate limits. Always monitor X-RateLimit-* headers."
|
|
383
|
-
|
|
384
|
-
examples:
|
|
385
|
-
# WORKFLOW EXAMPLE: Complete Story Creation Flow
|
|
386
|
-
story_creation_workflow:
|
|
387
|
-
- step: 1
|
|
388
|
-
action: get_workspace_hierarchy
|
|
389
|
-
description: "First, get workspace structure to find list IDs"
|
|
390
|
-
command: get_workspace_hierarchy
|
|
391
|
-
input: {}
|
|
392
|
-
output_extract: |
|
|
393
|
-
// From the response, find the Backlog list:
|
|
394
|
-
{
|
|
395
|
-
"spaces": [{
|
|
396
|
-
"name": "AIOS Project",
|
|
397
|
-
"lists": [
|
|
398
|
-
{
|
|
399
|
-
"name": "Backlog",
|
|
400
|
-
"id": "901317181013" // ← This is the list_id you need
|
|
401
|
-
}
|
|
402
|
-
]
|
|
403
|
-
}]
|
|
404
|
-
}
|
|
405
|
-
notes: "CRITICAL: You must use the numeric list_id from this response in create_task"
|
|
406
|
-
|
|
407
|
-
- step: 2
|
|
408
|
-
action: create_task
|
|
409
|
-
description: "Create story task with discovered list_id"
|
|
410
|
-
command: create_task
|
|
411
|
-
input:
|
|
412
|
-
list_id: "901317181013" # ← From step 1 (numeric string)
|
|
413
|
-
name: "Story 5.2: Implement Feature X"
|
|
414
|
-
markdown_description: "Complete story content here..."
|
|
415
|
-
parent: "86acfeqeq" # Epic task ID (if creating as subtask)
|
|
416
|
-
tags: ["story", "epic-5", "story-5.2"]
|
|
417
|
-
custom_fields:
|
|
418
|
-
- id: "epic_number"
|
|
419
|
-
value: 5
|
|
420
|
-
- id: "story_number"
|
|
421
|
-
value: "5.2"
|
|
422
|
-
output:
|
|
423
|
-
id: "86acfetr9"
|
|
424
|
-
name: "Story 5.2: Implement Feature X"
|
|
425
|
-
url: "https://app.clickup.com/t/86acfetr9"
|
|
426
|
-
notes: "list_id MUST be numeric string from get_workspace_hierarchy. Using 'listName' or non-numeric values will fail validation."
|
|
427
|
-
|
|
428
|
-
create_task:
|
|
429
|
-
- scenario: success
|
|
430
|
-
description: "Standard task creation with assignees"
|
|
431
|
-
input:
|
|
432
|
-
name: "Implement user authentication"
|
|
433
|
-
list_id: "123456789"
|
|
434
|
-
assignees: [456, 789]
|
|
435
|
-
priority: 2
|
|
436
|
-
output:
|
|
437
|
-
id: "task_abc123"
|
|
438
|
-
status: "created"
|
|
439
|
-
name: "Implement user authentication"
|
|
440
|
-
|
|
441
|
-
- scenario: failure_invalid_param
|
|
442
|
-
description: "Wrong assignee format (object instead of array)"
|
|
443
|
-
input:
|
|
444
|
-
name: "Fix login bug"
|
|
445
|
-
list_id: "123456789"
|
|
446
|
-
assignees: {add: [456]}
|
|
447
|
-
error:
|
|
448
|
-
code: VALIDATION_ERROR
|
|
449
|
-
message: "assignees must be array for create_task, got object"
|
|
450
|
-
validator: validate-assignee-format
|
|
451
|
-
|
|
452
|
-
- scenario: failure_api_error
|
|
453
|
-
description: "Invalid list_id"
|
|
454
|
-
input:
|
|
455
|
-
name: "Task"
|
|
456
|
-
list_id: "invalid"
|
|
457
|
-
error:
|
|
458
|
-
code: API_ERROR
|
|
459
|
-
message: "List not found"
|
|
460
|
-
http_status: 404
|
|
461
|
-
|
|
462
|
-
- scenario: edge_case
|
|
463
|
-
description: "Task with custom fields"
|
|
464
|
-
input:
|
|
465
|
-
name: "Research task"
|
|
466
|
-
list_id: "123456789"
|
|
467
|
-
custom_fields:
|
|
468
|
-
- id: "field-uuid-1"
|
|
469
|
-
value: "High"
|
|
470
|
-
- id: "field-uuid-2"
|
|
471
|
-
value: 1000
|
|
472
|
-
output:
|
|
473
|
-
id: "task_xyz789"
|
|
474
|
-
status: "created"
|
|
475
|
-
custom_fields:
|
|
476
|
-
- name: "Complexity"
|
|
477
|
-
value: "High"
|
|
478
|
-
- name: "Estimate"
|
|
479
|
-
value: 1000
|
|
480
|
-
|
|
481
|
-
update_task:
|
|
482
|
-
- scenario: success
|
|
483
|
-
description: "Update task assignees"
|
|
484
|
-
input:
|
|
485
|
-
task_id: "task_abc123"
|
|
486
|
-
assignees:
|
|
487
|
-
add: [999]
|
|
488
|
-
rem: [456]
|
|
489
|
-
output:
|
|
490
|
-
id: "task_abc123"
|
|
491
|
-
status: "updated"
|
|
492
|
-
|
|
493
|
-
- scenario: failure_invalid_param
|
|
494
|
-
description: "Wrong assignee format (array instead of object)"
|
|
495
|
-
input:
|
|
496
|
-
task_id: "task_abc123"
|
|
497
|
-
assignees: [999]
|
|
498
|
-
error:
|
|
499
|
-
code: VALIDATION_ERROR
|
|
500
|
-
message: "assignees must be object {add: [], rem: []} for update_task, got array"
|
|
501
|
-
validator: validate-task-update-assignees
|
|
502
|
-
|
|
503
|
-
- scenario: failure_api_error
|
|
504
|
-
description: "Task not found"
|
|
505
|
-
input:
|
|
506
|
-
task_id: "nonexistent"
|
|
507
|
-
name: "Updated name"
|
|
508
|
-
error:
|
|
509
|
-
code: API_ERROR
|
|
510
|
-
message: "Task not found"
|
|
511
|
-
http_status: 404
|
|
512
|
-
|
|
513
|
-
- scenario: edge_case
|
|
514
|
-
description: "Update with partial assignee change"
|
|
515
|
-
input:
|
|
516
|
-
task_id: "task_abc123"
|
|
517
|
-
assignees:
|
|
518
|
-
add: [111, 222]
|
|
519
|
-
output:
|
|
520
|
-
id: "task_abc123"
|
|
521
|
-
assignees: [456, 789, 111, 222]
|
|
522
|
-
|
|
523
|
-
mcp_specific:
|
|
524
|
-
server_command: "npx -y @modelcontextprotocol/server-clickup"
|
|
525
|
-
transport: stdio
|
|
526
|
-
environment_variables:
|
|
527
|
-
- name: CLICKUP_API_KEY
|
|
528
|
-
required: true
|
|
529
|
-
description: "ClickUp API key for authentication"
|
|
530
|
-
health_check:
|
|
531
|
-
method: tool_call
|
|
532
|
-
command: get_workspace_hierarchy
|
|
533
|
-
expected_response: "Object with 'spaces' array"
|
|
534
|
-
timeout_ms: 5000
|
|
1
|
+
tool:
|
|
2
|
+
schema_version: 2.0
|
|
3
|
+
id: clickup
|
|
4
|
+
type: mcp
|
|
5
|
+
name: ClickUp
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
description: ClickUp project management with pre-execution validation and API complexity handling
|
|
8
|
+
knowledge_strategy: executable
|
|
9
|
+
|
|
10
|
+
executable_knowledge:
|
|
11
|
+
validators:
|
|
12
|
+
# Combined validator for create_task (all checks in one function)
|
|
13
|
+
- id: validate-create-task
|
|
14
|
+
validates: create_task
|
|
15
|
+
language: javascript
|
|
16
|
+
checks:
|
|
17
|
+
- required_fields: [name, list_id]
|
|
18
|
+
function: |
|
|
19
|
+
(function() {
|
|
20
|
+
const errors = [];
|
|
21
|
+
|
|
22
|
+
// 1. Required fields
|
|
23
|
+
if (!args.args.name) {
|
|
24
|
+
errors.push("name is required");
|
|
25
|
+
}
|
|
26
|
+
if (!args.args.list_id && !args.args.listId) {
|
|
27
|
+
errors.push("list_id is required");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 2. Assignee format (must be array for create)
|
|
31
|
+
if (args.args.assignees && typeof args.args.assignees === 'object' && !Array.isArray(args.args.assignees)) {
|
|
32
|
+
errors.push("assignees must be array for create_task, got object");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 3. Custom fields structure
|
|
36
|
+
const customFields = args.args.custom_fields;
|
|
37
|
+
if (customFields) {
|
|
38
|
+
if (!Array.isArray(customFields)) {
|
|
39
|
+
errors.push("custom_fields must be an array");
|
|
40
|
+
} else {
|
|
41
|
+
customFields.forEach((field, index) => {
|
|
42
|
+
if (!field.id) {
|
|
43
|
+
errors.push(`custom_fields[${index}] missing required 'id' field`);
|
|
44
|
+
}
|
|
45
|
+
if (!field.hasOwnProperty('value')) {
|
|
46
|
+
errors.push(`custom_fields[${index}] missing required 'value' field`);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 4. List ID format (numeric string)
|
|
53
|
+
const listId = args.args.list_id || args.args.listId;
|
|
54
|
+
if (listId && !/^\d+$/.test(String(listId))) {
|
|
55
|
+
errors.push("list_id must be a numeric string");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 5. Priority range (1-4)
|
|
59
|
+
const priority = args.args.priority;
|
|
60
|
+
if (priority !== undefined && priority !== null) {
|
|
61
|
+
const p = Number(priority);
|
|
62
|
+
if (isNaN(p) || p < 1 || p > 4) {
|
|
63
|
+
errors.push("priority must be between 1 (urgent) and 4 (low)");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 6. Time estimate (positive number)
|
|
68
|
+
const timeEstimate = args.args.time_estimate;
|
|
69
|
+
if (timeEstimate !== undefined) {
|
|
70
|
+
const estimate = Number(timeEstimate);
|
|
71
|
+
if (isNaN(estimate) || estimate < 0) {
|
|
72
|
+
errors.push("time_estimate must be a positive number (milliseconds)");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
valid: errors.length === 0,
|
|
78
|
+
errors: errors
|
|
79
|
+
};
|
|
80
|
+
})();
|
|
81
|
+
|
|
82
|
+
# Combined validator for update_task
|
|
83
|
+
- id: validate-update-task
|
|
84
|
+
validates: update_task
|
|
85
|
+
language: javascript
|
|
86
|
+
function: |
|
|
87
|
+
(function() {
|
|
88
|
+
const errors = [];
|
|
89
|
+
const assignees = args.args.assignees;
|
|
90
|
+
|
|
91
|
+
// Assignees format (must be object with add/rem for update)
|
|
92
|
+
if (assignees) {
|
|
93
|
+
if (Array.isArray(assignees)) {
|
|
94
|
+
errors.push("assignees must be object {add: [], rem: []} for update_task, got array");
|
|
95
|
+
} else if (typeof assignees === 'object') {
|
|
96
|
+
if (assignees.add && !Array.isArray(assignees.add)) {
|
|
97
|
+
errors.push("assignees.add must be an array");
|
|
98
|
+
}
|
|
99
|
+
if (assignees.rem && !Array.isArray(assignees.rem)) {
|
|
100
|
+
errors.push("assignees.rem must be an array");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
valid: errors.length === 0,
|
|
107
|
+
errors: errors
|
|
108
|
+
};
|
|
109
|
+
})();
|
|
110
|
+
|
|
111
|
+
# Validator for parse_webhook
|
|
112
|
+
- id: validate-webhook-payload
|
|
113
|
+
validates: parse_webhook
|
|
114
|
+
language: javascript
|
|
115
|
+
function: |
|
|
116
|
+
(function() {
|
|
117
|
+
const errors = [];
|
|
118
|
+
const payload = args.args;
|
|
119
|
+
|
|
120
|
+
if (!payload) {
|
|
121
|
+
errors.push("payload is required");
|
|
122
|
+
} else {
|
|
123
|
+
// Check for required webhook identification fields
|
|
124
|
+
if (!payload.event && !payload.webhook_id && !payload.history_items) {
|
|
125
|
+
errors.push("Invalid webhook payload: missing event, webhook_id, or history_items");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
valid: errors.length === 0,
|
|
131
|
+
errors: errors
|
|
132
|
+
};
|
|
133
|
+
})();
|
|
134
|
+
|
|
135
|
+
helpers:
|
|
136
|
+
- id: extract-custom-field
|
|
137
|
+
language: javascript
|
|
138
|
+
runtime: isolated_vm
|
|
139
|
+
description: "Extract specific custom field value from task response"
|
|
140
|
+
function: |
|
|
141
|
+
(function() {
|
|
142
|
+
const { response, fieldName } = args;
|
|
143
|
+
if (!response || !response.custom_fields) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
const field = response.custom_fields.find(f => f.name === fieldName);
|
|
147
|
+
return field || null;
|
|
148
|
+
})();
|
|
149
|
+
|
|
150
|
+
- id: format-assignee-for-create
|
|
151
|
+
language: javascript
|
|
152
|
+
runtime: isolated_vm
|
|
153
|
+
description: "Convert assignee IDs to create_task format (array)"
|
|
154
|
+
function: |
|
|
155
|
+
(function() {
|
|
156
|
+
const { assignees } = args;
|
|
157
|
+
if (!assignees) return [];
|
|
158
|
+
if (Array.isArray(assignees)) return assignees;
|
|
159
|
+
if (typeof assignees === 'number') return [assignees];
|
|
160
|
+
return [];
|
|
161
|
+
})();
|
|
162
|
+
|
|
163
|
+
- id: format-assignee-for-update
|
|
164
|
+
language: javascript
|
|
165
|
+
runtime: isolated_vm
|
|
166
|
+
description: "Convert assignee IDs to update_task format (object)"
|
|
167
|
+
function: |
|
|
168
|
+
(function() {
|
|
169
|
+
const { add, remove } = args;
|
|
170
|
+
const result = {};
|
|
171
|
+
if (add) result.add = Array.isArray(add) ? add : [add];
|
|
172
|
+
if (remove) result.rem = Array.isArray(remove) ? remove : [remove];
|
|
173
|
+
return result;
|
|
174
|
+
})();
|
|
175
|
+
|
|
176
|
+
- id: parse-webhook-type
|
|
177
|
+
language: javascript
|
|
178
|
+
runtime: isolated_vm
|
|
179
|
+
description: "Detect webhook payload type from structure"
|
|
180
|
+
function: |
|
|
181
|
+
(function() {
|
|
182
|
+
const { payload } = args;
|
|
183
|
+
if (!payload) return 'unknown';
|
|
184
|
+
|
|
185
|
+
if (payload.event) return 'standard';
|
|
186
|
+
if (payload.webhook_id) return 'webhook_variant';
|
|
187
|
+
if (payload.history_items) return 'history_items';
|
|
188
|
+
|
|
189
|
+
return 'unknown';
|
|
190
|
+
})();
|
|
191
|
+
|
|
192
|
+
- id: extract-webhook-payload
|
|
193
|
+
language: javascript
|
|
194
|
+
runtime: isolated_vm
|
|
195
|
+
description: "Extract actual payload based on webhook type"
|
|
196
|
+
function: |
|
|
197
|
+
(function() {
|
|
198
|
+
const { webhook } = args;
|
|
199
|
+
if (!webhook) return null;
|
|
200
|
+
|
|
201
|
+
// Standard format
|
|
202
|
+
if (webhook.event && webhook.payload) {
|
|
203
|
+
return webhook.payload;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Webhook variant format
|
|
207
|
+
if (webhook.webhook_id && webhook.data && webhook.data.webhook) {
|
|
208
|
+
return webhook.data.webhook.payload;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// History items format
|
|
212
|
+
if (webhook.history_items) {
|
|
213
|
+
return webhook;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return null;
|
|
217
|
+
})();
|
|
218
|
+
|
|
219
|
+
- id: calculate-time-tracking-total
|
|
220
|
+
language: javascript
|
|
221
|
+
runtime: isolated_vm
|
|
222
|
+
description: "Sum time tracking entries for a task"
|
|
223
|
+
function: |
|
|
224
|
+
(function() {
|
|
225
|
+
const { timeEntries } = args;
|
|
226
|
+
if (!Array.isArray(timeEntries)) return 0;
|
|
227
|
+
|
|
228
|
+
return timeEntries.reduce((total, entry) => {
|
|
229
|
+
return total + (entry.duration || 0);
|
|
230
|
+
}, 0);
|
|
231
|
+
})();
|
|
232
|
+
|
|
233
|
+
- id: format-custom-field-update
|
|
234
|
+
language: javascript
|
|
235
|
+
runtime: isolated_vm
|
|
236
|
+
description: "Format custom field for API update"
|
|
237
|
+
function: |
|
|
238
|
+
(function() {
|
|
239
|
+
const { fieldId, value } = args;
|
|
240
|
+
return {
|
|
241
|
+
id: fieldId,
|
|
242
|
+
value: value
|
|
243
|
+
};
|
|
244
|
+
})();
|
|
245
|
+
|
|
246
|
+
api_complexity:
|
|
247
|
+
payload_schemas:
|
|
248
|
+
- type: standard
|
|
249
|
+
detection: "event field exists in root"
|
|
250
|
+
payload_path: "payload"
|
|
251
|
+
example: |
|
|
252
|
+
{
|
|
253
|
+
"event": "taskCreated",
|
|
254
|
+
"payload": { "task": {...} }
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
- type: webhook_variant
|
|
258
|
+
detection: "webhook_id field exists"
|
|
259
|
+
payload_path: "data.webhook.payload"
|
|
260
|
+
example: |
|
|
261
|
+
{
|
|
262
|
+
"webhook_id": "abc123",
|
|
263
|
+
"data": {
|
|
264
|
+
"webhook": {
|
|
265
|
+
"payload": { "task": {...} }
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
- type: history_items
|
|
271
|
+
detection: "history_items array exists"
|
|
272
|
+
payload_path: "history_items"
|
|
273
|
+
example: |
|
|
274
|
+
{
|
|
275
|
+
"history_items": [
|
|
276
|
+
{ "field": "status", "before": "todo", "after": "in progress" }
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
field_mappings:
|
|
281
|
+
assignees:
|
|
282
|
+
create_format:
|
|
283
|
+
structure: "[user_id1, user_id2]"
|
|
284
|
+
type: "array of integers"
|
|
285
|
+
example: "[123, 456]"
|
|
286
|
+
update_format:
|
|
287
|
+
structure: "{add: [user_id], rem: [user_id]}"
|
|
288
|
+
type: "object with add/rem arrays"
|
|
289
|
+
example: "{add: [789], rem: [456]}"
|
|
290
|
+
note: "Different formats for create vs update - common error source"
|
|
291
|
+
|
|
292
|
+
custom_fields:
|
|
293
|
+
structure: "[{id: field_id, value: field_value}]"
|
|
294
|
+
type: "array of objects"
|
|
295
|
+
validation: "Each object must have 'id' and 'value' keys"
|
|
296
|
+
example: "[{id: 'field-uuid', value: 'text value'}]"
|
|
297
|
+
|
|
298
|
+
list_id:
|
|
299
|
+
format: "numeric string"
|
|
300
|
+
validation: "Must match /^\\d+$/"
|
|
301
|
+
note: "Often called 'listId' in some API responses but 'list_id' in requests"
|
|
302
|
+
|
|
303
|
+
api_quirks:
|
|
304
|
+
- quirk: assignee_format_mismatch
|
|
305
|
+
description: "Create API expects [123], Update expects {add: [123], rem: []}"
|
|
306
|
+
impact: "Runtime errors if wrong format used"
|
|
307
|
+
mitigation: "Use command-specific validators (validate-assignee-format, validate-task-update-assignees)"
|
|
308
|
+
|
|
309
|
+
- quirk: rate_limit_headers_missing
|
|
310
|
+
description: "Rate limit info only in X-RateLimit-* headers, not in error response body"
|
|
311
|
+
impact: "Difficult to implement retry logic without header access"
|
|
312
|
+
mitigation: "Always capture response headers for rate limit tracking"
|
|
313
|
+
|
|
314
|
+
- quirk: custom_field_id_instability
|
|
315
|
+
description: "Custom field IDs can change when field is renamed or recreated"
|
|
316
|
+
impact: "Stored field IDs may become invalid"
|
|
317
|
+
mitigation: "Use field names to lookup IDs via get_workspace_hierarchy before updates"
|
|
318
|
+
|
|
319
|
+
- quirk: inconsistent_list_id_naming
|
|
320
|
+
description: "API uses 'list_id' in requests but 'listId' in responses"
|
|
321
|
+
impact: "Field mapping confusion in response processing"
|
|
322
|
+
mitigation: "Normalize to 'list_id' in all internal processing"
|
|
323
|
+
|
|
324
|
+
anti_patterns:
|
|
325
|
+
- pattern: wrong_assignee_format
|
|
326
|
+
description: "Using update format in create API"
|
|
327
|
+
category: api_usage
|
|
328
|
+
severity: high
|
|
329
|
+
wrong: |
|
|
330
|
+
create_task({
|
|
331
|
+
name: "Task",
|
|
332
|
+
list_id: "123",
|
|
333
|
+
assignees: {add: [456]} // ❌ Wrong - object format
|
|
334
|
+
})
|
|
335
|
+
correct: |
|
|
336
|
+
create_task({
|
|
337
|
+
name: "Task",
|
|
338
|
+
list_id: "123",
|
|
339
|
+
assignees: [456] // ✅ Correct - array format
|
|
340
|
+
})
|
|
341
|
+
rationale: "Create API expects array, not object. Use format-assignee-for-create helper."
|
|
342
|
+
|
|
343
|
+
- pattern: missing_custom_field_validation
|
|
344
|
+
description: "Setting custom fields without validating structure"
|
|
345
|
+
category: data_validation
|
|
346
|
+
severity: medium
|
|
347
|
+
wrong: |
|
|
348
|
+
create_task({
|
|
349
|
+
name: "Task",
|
|
350
|
+
list_id: "123",
|
|
351
|
+
custom_fields: "field-value" // ❌ Wrong - string instead of array
|
|
352
|
+
})
|
|
353
|
+
correct: |
|
|
354
|
+
create_task({
|
|
355
|
+
name: "Task",
|
|
356
|
+
list_id: "123",
|
|
357
|
+
custom_fields: [ // ✅ Correct - array of objects
|
|
358
|
+
{id: "field-uuid", value: "field-value"}
|
|
359
|
+
]
|
|
360
|
+
})
|
|
361
|
+
rationale: "Custom fields must be array of {id, value} objects. Use validate-custom-field-structure."
|
|
362
|
+
|
|
363
|
+
- pattern: undocumented_rate_limit_handling
|
|
364
|
+
description: "Not checking rate limit headers before subsequent requests"
|
|
365
|
+
category: api_reliability
|
|
366
|
+
severity: medium
|
|
367
|
+
wrong: |
|
|
368
|
+
// Make 100 requests in rapid succession
|
|
369
|
+
for (let i = 0; i < 100; i++) {
|
|
370
|
+
await create_task({...}); // ❌ No rate limit checking
|
|
371
|
+
}
|
|
372
|
+
correct: |
|
|
373
|
+
for (let i = 0; i < 100; i++) {
|
|
374
|
+
const response = await create_task({...});
|
|
375
|
+
const remaining = response.headers['X-RateLimit-Remaining'];
|
|
376
|
+
|
|
377
|
+
if (remaining < 10) {
|
|
378
|
+
// Wait for reset
|
|
379
|
+
await sleep(60000); // ✅ Proper rate limit handling
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
rationale: "ClickUp API has strict rate limits. Always monitor X-RateLimit-* headers."
|
|
383
|
+
|
|
384
|
+
examples:
|
|
385
|
+
# WORKFLOW EXAMPLE: Complete Story Creation Flow
|
|
386
|
+
story_creation_workflow:
|
|
387
|
+
- step: 1
|
|
388
|
+
action: get_workspace_hierarchy
|
|
389
|
+
description: "First, get workspace structure to find list IDs"
|
|
390
|
+
command: get_workspace_hierarchy
|
|
391
|
+
input: {}
|
|
392
|
+
output_extract: |
|
|
393
|
+
// From the response, find the Backlog list:
|
|
394
|
+
{
|
|
395
|
+
"spaces": [{
|
|
396
|
+
"name": "AIOS Project",
|
|
397
|
+
"lists": [
|
|
398
|
+
{
|
|
399
|
+
"name": "Backlog",
|
|
400
|
+
"id": "901317181013" // ← This is the list_id you need
|
|
401
|
+
}
|
|
402
|
+
]
|
|
403
|
+
}]
|
|
404
|
+
}
|
|
405
|
+
notes: "CRITICAL: You must use the numeric list_id from this response in create_task"
|
|
406
|
+
|
|
407
|
+
- step: 2
|
|
408
|
+
action: create_task
|
|
409
|
+
description: "Create story task with discovered list_id"
|
|
410
|
+
command: create_task
|
|
411
|
+
input:
|
|
412
|
+
list_id: "901317181013" # ← From step 1 (numeric string)
|
|
413
|
+
name: "Story 5.2: Implement Feature X"
|
|
414
|
+
markdown_description: "Complete story content here..."
|
|
415
|
+
parent: "86acfeqeq" # Epic task ID (if creating as subtask)
|
|
416
|
+
tags: ["story", "epic-5", "story-5.2"]
|
|
417
|
+
custom_fields:
|
|
418
|
+
- id: "epic_number"
|
|
419
|
+
value: 5
|
|
420
|
+
- id: "story_number"
|
|
421
|
+
value: "5.2"
|
|
422
|
+
output:
|
|
423
|
+
id: "86acfetr9"
|
|
424
|
+
name: "Story 5.2: Implement Feature X"
|
|
425
|
+
url: "https://app.clickup.com/t/86acfetr9"
|
|
426
|
+
notes: "list_id MUST be numeric string from get_workspace_hierarchy. Using 'listName' or non-numeric values will fail validation."
|
|
427
|
+
|
|
428
|
+
create_task:
|
|
429
|
+
- scenario: success
|
|
430
|
+
description: "Standard task creation with assignees"
|
|
431
|
+
input:
|
|
432
|
+
name: "Implement user authentication"
|
|
433
|
+
list_id: "123456789"
|
|
434
|
+
assignees: [456, 789]
|
|
435
|
+
priority: 2
|
|
436
|
+
output:
|
|
437
|
+
id: "task_abc123"
|
|
438
|
+
status: "created"
|
|
439
|
+
name: "Implement user authentication"
|
|
440
|
+
|
|
441
|
+
- scenario: failure_invalid_param
|
|
442
|
+
description: "Wrong assignee format (object instead of array)"
|
|
443
|
+
input:
|
|
444
|
+
name: "Fix login bug"
|
|
445
|
+
list_id: "123456789"
|
|
446
|
+
assignees: {add: [456]}
|
|
447
|
+
error:
|
|
448
|
+
code: VALIDATION_ERROR
|
|
449
|
+
message: "assignees must be array for create_task, got object"
|
|
450
|
+
validator: validate-assignee-format
|
|
451
|
+
|
|
452
|
+
- scenario: failure_api_error
|
|
453
|
+
description: "Invalid list_id"
|
|
454
|
+
input:
|
|
455
|
+
name: "Task"
|
|
456
|
+
list_id: "invalid"
|
|
457
|
+
error:
|
|
458
|
+
code: API_ERROR
|
|
459
|
+
message: "List not found"
|
|
460
|
+
http_status: 404
|
|
461
|
+
|
|
462
|
+
- scenario: edge_case
|
|
463
|
+
description: "Task with custom fields"
|
|
464
|
+
input:
|
|
465
|
+
name: "Research task"
|
|
466
|
+
list_id: "123456789"
|
|
467
|
+
custom_fields:
|
|
468
|
+
- id: "field-uuid-1"
|
|
469
|
+
value: "High"
|
|
470
|
+
- id: "field-uuid-2"
|
|
471
|
+
value: 1000
|
|
472
|
+
output:
|
|
473
|
+
id: "task_xyz789"
|
|
474
|
+
status: "created"
|
|
475
|
+
custom_fields:
|
|
476
|
+
- name: "Complexity"
|
|
477
|
+
value: "High"
|
|
478
|
+
- name: "Estimate"
|
|
479
|
+
value: 1000
|
|
480
|
+
|
|
481
|
+
update_task:
|
|
482
|
+
- scenario: success
|
|
483
|
+
description: "Update task assignees"
|
|
484
|
+
input:
|
|
485
|
+
task_id: "task_abc123"
|
|
486
|
+
assignees:
|
|
487
|
+
add: [999]
|
|
488
|
+
rem: [456]
|
|
489
|
+
output:
|
|
490
|
+
id: "task_abc123"
|
|
491
|
+
status: "updated"
|
|
492
|
+
|
|
493
|
+
- scenario: failure_invalid_param
|
|
494
|
+
description: "Wrong assignee format (array instead of object)"
|
|
495
|
+
input:
|
|
496
|
+
task_id: "task_abc123"
|
|
497
|
+
assignees: [999]
|
|
498
|
+
error:
|
|
499
|
+
code: VALIDATION_ERROR
|
|
500
|
+
message: "assignees must be object {add: [], rem: []} for update_task, got array"
|
|
501
|
+
validator: validate-task-update-assignees
|
|
502
|
+
|
|
503
|
+
- scenario: failure_api_error
|
|
504
|
+
description: "Task not found"
|
|
505
|
+
input:
|
|
506
|
+
task_id: "nonexistent"
|
|
507
|
+
name: "Updated name"
|
|
508
|
+
error:
|
|
509
|
+
code: API_ERROR
|
|
510
|
+
message: "Task not found"
|
|
511
|
+
http_status: 404
|
|
512
|
+
|
|
513
|
+
- scenario: edge_case
|
|
514
|
+
description: "Update with partial assignee change"
|
|
515
|
+
input:
|
|
516
|
+
task_id: "task_abc123"
|
|
517
|
+
assignees:
|
|
518
|
+
add: [111, 222]
|
|
519
|
+
output:
|
|
520
|
+
id: "task_abc123"
|
|
521
|
+
assignees: [456, 789, 111, 222]
|
|
522
|
+
|
|
523
|
+
mcp_specific:
|
|
524
|
+
server_command: "npx -y @modelcontextprotocol/server-clickup"
|
|
525
|
+
transport: stdio
|
|
526
|
+
environment_variables:
|
|
527
|
+
- name: CLICKUP_API_KEY
|
|
528
|
+
required: true
|
|
529
|
+
description: "ClickUp API key for authentication"
|
|
530
|
+
health_check:
|
|
531
|
+
method: tool_call
|
|
532
|
+
command: get_workspace_hierarchy
|
|
533
|
+
expected_response: "Object with 'spaces' array"
|
|
534
|
+
timeout_ms: 5000
|