prjct-cli 1.22.0 → 1.23.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/CHANGELOG.md +147 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct.mjs +917 -35845
- package/dist/bin/prjct.mjs.map +7 -0
- package/dist/cli/linear.mjs +16 -0
- package/dist/cli/linear.mjs.map +7 -0
- package/dist/templates.json +1 -0
- package/package.json +4 -5
- package/bin/prjct.ts +0 -342
- package/core/__tests__/agentic/analysis-injection.test.ts +0 -377
- package/core/__tests__/agentic/cache-eviction.test.ts +0 -294
- package/core/__tests__/agentic/command-context.test.ts +0 -281
- package/core/__tests__/agentic/command-executor.test.ts +0 -659
- package/core/__tests__/agentic/domain-classifier.test.ts +0 -330
- package/core/__tests__/agentic/injection-validator.test.ts +0 -255
- package/core/__tests__/agentic/memory-system.test.ts +0 -281
- package/core/__tests__/agentic/plan-mode.test.ts +0 -386
- package/core/__tests__/agentic/prompt-assembly.test.ts +0 -298
- package/core/__tests__/agentic/prompt-builder.test.ts +0 -243
- package/core/__tests__/agentic/response-validator.test.ts +0 -263
- package/core/__tests__/agentic/semantic-matching.test.ts +0 -131
- package/core/__tests__/agentic/smart-context.test.ts +0 -372
- package/core/__tests__/agentic/tech-normalizer.test.ts +0 -136
- package/core/__tests__/agentic/token-budget.test.ts +0 -294
- package/core/__tests__/ai-tools/formatters.test.ts +0 -476
- package/core/__tests__/domain/bm25.test.ts +0 -225
- package/core/__tests__/domain/change-propagator.test.ts +0 -100
- package/core/__tests__/domain/fibonacci.test.ts +0 -113
- package/core/__tests__/domain/file-hasher.test.ts +0 -146
- package/core/__tests__/domain/file-ranker.test.ts +0 -169
- package/core/__tests__/domain/git-cochange.test.ts +0 -121
- package/core/__tests__/domain/import-graph.test.ts +0 -156
- package/core/__tests__/domain/velocity.test.ts +0 -623
- package/core/__tests__/infrastructure/performance-tracker.test.ts +0 -328
- package/core/__tests__/schemas/model.test.ts +0 -272
- package/core/__tests__/services/dependency-validator.test.ts +0 -175
- package/core/__tests__/services/hierarchical-agent-resolver.test.ts +0 -359
- package/core/__tests__/services/nested-context-resolver.test.ts +0 -443
- package/core/__tests__/services/project-index.test.ts +0 -355
- package/core/__tests__/services/staleness-checker.test.ts +0 -204
- package/core/__tests__/storage/analysis-storage.test.ts +0 -641
- package/core/__tests__/storage/archive-storage.test.ts +0 -455
- package/core/__tests__/storage/safe-reader.test.ts +0 -262
- package/core/__tests__/storage/sqlite-migration.test.ts +0 -1016
- package/core/__tests__/storage/state-storage-feedback.test.ts +0 -463
- package/core/__tests__/storage/state-storage-history.test.ts +0 -469
- package/core/__tests__/storage/storage-manager.test.ts +0 -383
- package/core/__tests__/storage/subtask-handoff.test.ts +0 -237
- package/core/__tests__/types/fs.test.ts +0 -125
- package/core/__tests__/utils/date-helper.test.ts +0 -449
- package/core/__tests__/utils/output.test.ts +0 -278
- package/core/__tests__/utils/preserve-sections.test.ts +0 -216
- package/core/__tests__/utils/project-commands.test.ts +0 -71
- package/core/__tests__/utils/retry.test.ts +0 -381
- package/core/__tests__/workflow/state-machine.test.ts +0 -216
- package/core/agentic/agent-router.ts +0 -150
- package/core/agentic/anti-hallucination.ts +0 -141
- package/core/agentic/chain-of-thought.ts +0 -234
- package/core/agentic/command-classifier.ts +0 -141
- package/core/agentic/command-context.ts +0 -168
- package/core/agentic/command-executor.ts +0 -471
- package/core/agentic/context-builder.ts +0 -285
- package/core/agentic/domain-classifier.ts +0 -525
- package/core/agentic/environment-block.ts +0 -102
- package/core/agentic/ground-truth.ts +0 -706
- package/core/agentic/index.ts +0 -193
- package/core/agentic/injection-validator.ts +0 -208
- package/core/agentic/loop-detector.ts +0 -451
- package/core/agentic/memory-system.ts +0 -1547
- package/core/agentic/orchestrator-executor.ts +0 -579
- package/core/agentic/plan-mode.ts +0 -525
- package/core/agentic/prompt-builder.ts +0 -1069
- package/core/agentic/response-validator.ts +0 -98
- package/core/agentic/services.ts +0 -167
- package/core/agentic/skill-loader.ts +0 -106
- package/core/agentic/smart-context.ts +0 -393
- package/core/agentic/tech-normalizer.ts +0 -167
- package/core/agentic/template-executor.ts +0 -272
- package/core/agentic/template-loader.ts +0 -109
- package/core/agentic/token-budget.ts +0 -226
- package/core/agentic/tool-registry.ts +0 -146
- package/core/agents/index.ts +0 -28
- package/core/agents/performance.ts +0 -429
- package/core/ai-tools/formatters.ts +0 -341
- package/core/ai-tools/generator.ts +0 -144
- package/core/ai-tools/index.ts +0 -15
- package/core/ai-tools/registry.ts +0 -201
- package/core/bus/bus.ts +0 -314
- package/core/bus/index.ts +0 -8
- package/core/cli/linear.ts +0 -500
- package/core/cli/lint-meta-commentary.ts +0 -177
- package/core/cli/start.ts +0 -386
- package/core/commands/analysis.ts +0 -1274
- package/core/commands/analytics.ts +0 -342
- package/core/commands/base.ts +0 -118
- package/core/commands/cleanup.ts +0 -157
- package/core/commands/command-data.ts +0 -463
- package/core/commands/commands.ts +0 -306
- package/core/commands/context.ts +0 -238
- package/core/commands/design.ts +0 -77
- package/core/commands/index.ts +0 -19
- package/core/commands/maintenance.ts +0 -77
- package/core/commands/performance.ts +0 -114
- package/core/commands/planning.ts +0 -662
- package/core/commands/register.ts +0 -127
- package/core/commands/registry.ts +0 -444
- package/core/commands/setup.ts +0 -280
- package/core/commands/shipping.ts +0 -267
- package/core/commands/snapshots.ts +0 -297
- package/core/commands/uninstall.ts +0 -542
- package/core/commands/velocity.ts +0 -149
- package/core/commands/workflow.ts +0 -505
- package/core/config/command-context.config.json +0 -66
- package/core/constants/index.ts +0 -379
- package/core/context/generator.ts +0 -368
- package/core/context-tools/files-tool.ts +0 -577
- package/core/context-tools/imports-tool.ts +0 -400
- package/core/context-tools/index.ts +0 -434
- package/core/context-tools/recent-tool.ts +0 -301
- package/core/context-tools/signatures-tool.ts +0 -495
- package/core/context-tools/summary-tool.ts +0 -301
- package/core/context-tools/token-counter.ts +0 -273
- package/core/context-tools/types.ts +0 -253
- package/core/domain/agent-generator.ts +0 -186
- package/core/domain/agent-loader.ts +0 -419
- package/core/domain/analyzer.ts +0 -387
- package/core/domain/architecture-generator.ts +0 -108
- package/core/domain/bm25.ts +0 -525
- package/core/domain/change-propagator.ts +0 -162
- package/core/domain/context-estimator.ts +0 -175
- package/core/domain/fibonacci.ts +0 -128
- package/core/domain/file-hasher.ts +0 -296
- package/core/domain/file-ranker.ts +0 -151
- package/core/domain/git-cochange.ts +0 -250
- package/core/domain/import-graph.ts +0 -315
- package/core/domain/snapshot-manager.ts +0 -415
- package/core/domain/task-stack.ts +0 -578
- package/core/domain/velocity.ts +0 -470
- package/core/errors.ts +0 -335
- package/core/events/events.ts +0 -85
- package/core/events/index.ts +0 -8
- package/core/index.ts +0 -481
- package/core/infrastructure/agent-detector.ts +0 -135
- package/core/infrastructure/ai-provider.ts +0 -578
- package/core/infrastructure/author-detector.ts +0 -133
- package/core/infrastructure/capability-installer.ts +0 -76
- package/core/infrastructure/claude-agent.ts +0 -297
- package/core/infrastructure/command-installer.ts +0 -752
- package/core/infrastructure/config-manager.ts +0 -364
- package/core/infrastructure/editors-config.ts +0 -172
- package/core/infrastructure/path-manager.ts +0 -571
- package/core/infrastructure/performance-tracker.ts +0 -326
- package/core/infrastructure/permission-manager.ts +0 -289
- package/core/infrastructure/setup.ts +0 -1061
- package/core/infrastructure/update-checker.ts +0 -246
- package/core/integrations/issue-tracker/enricher.ts +0 -271
- package/core/integrations/issue-tracker/index.ts +0 -8
- package/core/integrations/issue-tracker/manager.ts +0 -286
- package/core/integrations/issue-tracker/types.ts +0 -310
- package/core/integrations/jira/cache.ts +0 -57
- package/core/integrations/jira/client.ts +0 -688
- package/core/integrations/jira/index.ts +0 -23
- package/core/integrations/jira/service.ts +0 -244
- package/core/integrations/linear/cache.ts +0 -68
- package/core/integrations/linear/client.ts +0 -436
- package/core/integrations/linear/index.ts +0 -20
- package/core/integrations/linear/service.ts +0 -260
- package/core/integrations/linear/sync.ts +0 -314
- package/core/outcomes/analyzer.ts +0 -286
- package/core/outcomes/index.ts +0 -34
- package/core/outcomes/recorder.ts +0 -195
- package/core/plugin/builtin/webhook.ts +0 -148
- package/core/plugin/hooks.ts +0 -315
- package/core/plugin/index.ts +0 -50
- package/core/plugin/loader.ts +0 -354
- package/core/plugin/registry.ts +0 -326
- package/core/schemas/agents.ts +0 -27
- package/core/schemas/analysis.ts +0 -530
- package/core/schemas/classification.ts +0 -91
- package/core/schemas/command-context.ts +0 -29
- package/core/schemas/enriched-task.ts +0 -291
- package/core/schemas/ideas.ts +0 -114
- package/core/schemas/index.ts +0 -53
- package/core/schemas/issues.ts +0 -159
- package/core/schemas/llm-output.ts +0 -170
- package/core/schemas/metrics.ts +0 -143
- package/core/schemas/model.ts +0 -153
- package/core/schemas/outcomes.ts +0 -487
- package/core/schemas/performance.ts +0 -128
- package/core/schemas/permissions.ts +0 -180
- package/core/schemas/prd.ts +0 -450
- package/core/schemas/project.ts +0 -57
- package/core/schemas/roadmap.ts +0 -322
- package/core/schemas/schemas.ts +0 -38
- package/core/schemas/shipped.ts +0 -109
- package/core/schemas/state.ts +0 -284
- package/core/schemas/velocity.ts +0 -103
- package/core/server/index.ts +0 -21
- package/core/server/routes-extended.ts +0 -566
- package/core/server/routes.ts +0 -176
- package/core/server/server.ts +0 -149
- package/core/server/sse.ts +0 -192
- package/core/services/agent-generator.ts +0 -385
- package/core/services/agent-service.ts +0 -168
- package/core/services/breakdown-service.ts +0 -124
- package/core/services/context-generator.ts +0 -445
- package/core/services/context-selector.ts +0 -429
- package/core/services/dependency-validator.ts +0 -318
- package/core/services/diff-generator.ts +0 -313
- package/core/services/doctor-service.ts +0 -423
- package/core/services/file-categorizer.ts +0 -448
- package/core/services/file-scorer.ts +0 -270
- package/core/services/git-analyzer.ts +0 -293
- package/core/services/hierarchical-agent-resolver.ts +0 -236
- package/core/services/hooks-service.ts +0 -685
- package/core/services/index.ts +0 -46
- package/core/services/local-state-generator.ts +0 -158
- package/core/services/memory-service.ts +0 -181
- package/core/services/nested-context-resolver.ts +0 -842
- package/core/services/project-index.ts +0 -911
- package/core/services/project-service.ts +0 -155
- package/core/services/session-tracker.ts +0 -287
- package/core/services/skill-installer.ts +0 -447
- package/core/services/skill-lock.ts +0 -132
- package/core/services/skill-service.ts +0 -306
- package/core/services/stack-detector.ts +0 -229
- package/core/services/staleness-checker.ts +0 -327
- package/core/services/sync-service.ts +0 -1515
- package/core/services/sync-verifier.ts +0 -253
- package/core/services/watch-service.ts +0 -312
- package/core/session/compaction.ts +0 -248
- package/core/session/index.ts +0 -35
- package/core/session/log-migration.ts +0 -88
- package/core/session/metrics.ts +0 -323
- package/core/session/session-log-manager.ts +0 -307
- package/core/session/task-session-manager.ts +0 -404
- package/core/session/utils.ts +0 -51
- package/core/storage/analysis-storage.ts +0 -373
- package/core/storage/archive-storage.ts +0 -205
- package/core/storage/database.ts +0 -575
- package/core/storage/ideas-storage.ts +0 -298
- package/core/storage/index-storage.ts +0 -523
- package/core/storage/index.ts +0 -79
- package/core/storage/metrics-storage.ts +0 -321
- package/core/storage/migrate-json.ts +0 -720
- package/core/storage/queue-storage.ts +0 -336
- package/core/storage/safe-reader.ts +0 -105
- package/core/storage/shipped-storage.ts +0 -253
- package/core/storage/state-storage.ts +0 -1035
- package/core/storage/storage-manager.ts +0 -205
- package/core/storage/storage.ts +0 -177
- package/core/storage/velocity-storage.ts +0 -149
- package/core/sync/auth-config.ts +0 -138
- package/core/sync/index.ts +0 -31
- package/core/sync/oauth-handler.ts +0 -143
- package/core/sync/sync-client.ts +0 -251
- package/core/sync/sync-manager.ts +0 -327
- package/core/tsconfig.json +0 -22
- package/core/types/agentic.ts +0 -760
- package/core/types/agents.ts +0 -150
- package/core/types/bus.ts +0 -193
- package/core/types/citations.ts +0 -22
- package/core/types/commands.ts +0 -399
- package/core/types/config.ts +0 -92
- package/core/types/core.ts +0 -96
- package/core/types/diff.ts +0 -41
- package/core/types/domain.ts +0 -71
- package/core/types/errors.ts +0 -111
- package/core/types/events.ts +0 -42
- package/core/types/fs.ts +0 -72
- package/core/types/index.ts +0 -510
- package/core/types/infrastructure.ts +0 -210
- package/core/types/integrations.ts +0 -31
- package/core/types/jira.ts +0 -51
- package/core/types/logger.ts +0 -17
- package/core/types/memory.ts +0 -313
- package/core/types/outcomes.ts +0 -190
- package/core/types/output.ts +0 -47
- package/core/types/plugin.ts +0 -25
- package/core/types/project-sync.ts +0 -129
- package/core/types/provider.ts +0 -163
- package/core/types/server.ts +0 -71
- package/core/types/services.ts +0 -84
- package/core/types/session.ts +0 -135
- package/core/types/stack.ts +0 -19
- package/core/types/storage.ts +0 -318
- package/core/types/sync-verifier.ts +0 -33
- package/core/types/sync.ts +0 -121
- package/core/types/task.ts +0 -72
- package/core/types/template.ts +0 -24
- package/core/types/utils.ts +0 -92
- package/core/types/workflow.ts +0 -23
- package/core/utils/agent-stream.ts +0 -140
- package/core/utils/animations.ts +0 -251
- package/core/utils/branding.ts +0 -88
- package/core/utils/cache.ts +0 -187
- package/core/utils/citations.ts +0 -39
- package/core/utils/collection-filters.ts +0 -209
- package/core/utils/date-helper.ts +0 -176
- package/core/utils/error-messages.ts +0 -38
- package/core/utils/file-helper.ts +0 -277
- package/core/utils/fs-helpers.ts +0 -14
- package/core/utils/help.ts +0 -314
- package/core/utils/jsonl-helper.ts +0 -290
- package/core/utils/keychain.ts +0 -127
- package/core/utils/logger.ts +0 -77
- package/core/utils/markdown-builder.ts +0 -280
- package/core/utils/next-steps.ts +0 -95
- package/core/utils/output.ts +0 -403
- package/core/utils/preserve-sections.ts +0 -218
- package/core/utils/project-commands.ts +0 -126
- package/core/utils/project-credentials.ts +0 -143
- package/core/utils/provider-cache.ts +0 -49
- package/core/utils/retry.ts +0 -318
- package/core/utils/runtime.ts +0 -108
- package/core/utils/session-helper.ts +0 -278
- package/core/utils/subtask-table.ts +0 -227
- package/core/utils/version.ts +0 -128
- package/core/wizard/index.ts +0 -13
- package/core/wizard/onboarding.ts +0 -633
- package/core/workflow/index.ts +0 -7
- package/core/workflow/state-machine.ts +0 -198
- package/core/workflow/workflow-preferences.ts +0 -294
- package/dist/core/infrastructure/command-installer.js +0 -1141
- package/dist/core/infrastructure/editors-config.js +0 -177
- package/dist/core/infrastructure/setup.js +0 -2244
- package/dist/core/utils/version.js +0 -141
- package/templates/agentic/agent-routing.md +0 -45
- package/templates/agentic/agents/uxui.md +0 -63
- package/templates/agentic/checklist-routing.md +0 -98
- package/templates/agentic/orchestrator.md +0 -68
- package/templates/agentic/task-fragmentation.md +0 -89
- package/templates/agents/AGENTS.md +0 -68
- package/templates/analysis/analyze.md +0 -84
- package/templates/analysis/patterns.md +0 -60
- package/templates/antigravity/SKILL.md +0 -39
- package/templates/architect/discovery.md +0 -67
- package/templates/architect/phases.md +0 -59
- package/templates/checklists/architecture.md +0 -28
- package/templates/checklists/code-quality.md +0 -28
- package/templates/checklists/data.md +0 -33
- package/templates/checklists/documentation.md +0 -33
- package/templates/checklists/infrastructure.md +0 -33
- package/templates/checklists/performance.md +0 -33
- package/templates/checklists/security.md +0 -33
- package/templates/checklists/testing.md +0 -33
- package/templates/checklists/ux-ui.md +0 -37
- package/templates/commands/analyze.md +0 -56
- package/templates/commands/auth.md +0 -234
- package/templates/commands/bug.md +0 -163
- package/templates/commands/cleanup.md +0 -19
- package/templates/commands/dash.md +0 -99
- package/templates/commands/design.md +0 -15
- package/templates/commands/done.md +0 -291
- package/templates/commands/enrich.md +0 -174
- package/templates/commands/git.md +0 -295
- package/templates/commands/history.md +0 -389
- package/templates/commands/idea.md +0 -88
- package/templates/commands/impact.md +0 -864
- package/templates/commands/init.md +0 -54
- package/templates/commands/jira.md +0 -278
- package/templates/commands/linear.md +0 -288
- package/templates/commands/merge.md +0 -206
- package/templates/commands/next.md +0 -80
- package/templates/commands/p.md +0 -67
- package/templates/commands/p.toml +0 -37
- package/templates/commands/pause.md +0 -136
- package/templates/commands/plan.md +0 -696
- package/templates/commands/prd.md +0 -356
- package/templates/commands/resume.md +0 -171
- package/templates/commands/review.md +0 -276
- package/templates/commands/serve.md +0 -118
- package/templates/commands/setup.md +0 -91
- package/templates/commands/ship.md +0 -475
- package/templates/commands/skill.md +0 -259
- package/templates/commands/spec.md +0 -218
- package/templates/commands/status.md +0 -207
- package/templates/commands/sync.md +0 -104
- package/templates/commands/task.md +0 -312
- package/templates/commands/test.md +0 -93
- package/templates/commands/update.md +0 -63
- package/templates/commands/verify.md +0 -204
- package/templates/commands/workflow.md +0 -150
- package/templates/config/skill-mappings.json +0 -82
- package/templates/context/dashboard.md +0 -256
- package/templates/context/roadmap.md +0 -221
- package/templates/cursor/commands/bug.md +0 -8
- package/templates/cursor/commands/done.md +0 -4
- package/templates/cursor/commands/pause.md +0 -6
- package/templates/cursor/commands/resume.md +0 -4
- package/templates/cursor/commands/ship.md +0 -8
- package/templates/cursor/commands/sync.md +0 -4
- package/templates/cursor/commands/task.md +0 -8
- package/templates/cursor/p.md +0 -29
- package/templates/cursor/router.mdc +0 -28
- package/templates/design/api.md +0 -95
- package/templates/design/architecture.md +0 -77
- package/templates/design/component.md +0 -89
- package/templates/design/database.md +0 -78
- package/templates/design/flow.md +0 -94
- package/templates/global/ANTIGRAVITY.md +0 -254
- package/templates/global/CLAUDE.md +0 -497
- package/templates/global/CURSOR.mdc +0 -266
- package/templates/global/GEMINI.md +0 -293
- package/templates/global/STORAGE-SPEC.md +0 -391
- package/templates/global/WINDSURF.md +0 -266
- package/templates/global/modules/CLAUDE-commands.md +0 -70
- package/templates/global/modules/CLAUDE-core.md +0 -105
- package/templates/global/modules/CLAUDE-git.md +0 -50
- package/templates/global/modules/CLAUDE-intelligence.md +0 -92
- package/templates/global/modules/CLAUDE-storage.md +0 -50
- package/templates/global/modules/module-config.json +0 -36
- package/templates/mcp-config.json +0 -19
- package/templates/permissions/default.jsonc +0 -60
- package/templates/permissions/permissive.jsonc +0 -49
- package/templates/permissions/strict.jsonc +0 -58
- package/templates/planning-methodology.md +0 -195
- package/templates/skills/code-review.md +0 -47
- package/templates/skills/debug.md +0 -61
- package/templates/skills/refactor.md +0 -47
- package/templates/subagents/agent-base.md +0 -20
- package/templates/subagents/domain/backend.md +0 -109
- package/templates/subagents/domain/database.md +0 -121
- package/templates/subagents/domain/devops.md +0 -152
- package/templates/subagents/domain/frontend.md +0 -103
- package/templates/subagents/domain/testing.md +0 -169
- package/templates/subagents/pm-expert.md +0 -366
- package/templates/subagents/workflow/chief-architect.md +0 -657
- package/templates/subagents/workflow/prjct-planner.md +0 -159
- package/templates/subagents/workflow/prjct-shipper.md +0 -188
- package/templates/subagents/workflow/prjct-workflow.md +0 -98
- package/templates/tools/bash.txt +0 -22
- package/templates/tools/edit.txt +0 -18
- package/templates/tools/glob.txt +0 -19
- package/templates/tools/grep.txt +0 -21
- package/templates/tools/read.txt +0 -14
- package/templates/tools/task.txt +0 -20
- package/templates/tools/webfetch.txt +0 -16
- package/templates/tools/websearch.txt +0 -18
- package/templates/tools/write.txt +0 -17
- package/templates/windsurf/router.md +0 -28
- package/templates/windsurf/workflows/bug.md +0 -8
- package/templates/windsurf/workflows/done.md +0 -4
- package/templates/windsurf/workflows/pause.md +0 -4
- package/templates/windsurf/workflows/resume.md +0 -4
- package/templates/windsurf/workflows/ship.md +0 -8
- package/templates/windsurf/workflows/sync.md +0 -4
- package/templates/windsurf/workflows/task.md +0 -8
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command Registration - Bridges existing command groups to the registry
|
|
3
|
-
*
|
|
4
|
-
* This module registers all commands from the existing command groups
|
|
5
|
-
* into the central CommandRegistry. This enables:
|
|
6
|
-
* - Uniform command execution via registry.execute()
|
|
7
|
-
* - Command introspection and metadata
|
|
8
|
-
* - Future migration to pure handler pattern
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { AnalysisCommands } from './analysis'
|
|
12
|
-
import { AnalyticsCommands } from './analytics'
|
|
13
|
-
import { CATEGORIES, COMMANDS } from './command-data'
|
|
14
|
-
import { ContextCommands } from './context'
|
|
15
|
-
import { MaintenanceCommands } from './maintenance'
|
|
16
|
-
import { PerformanceCommands } from './performance'
|
|
17
|
-
import { PlanningCommands } from './planning'
|
|
18
|
-
import { commandRegistry } from './registry'
|
|
19
|
-
import { SetupCommands } from './setup'
|
|
20
|
-
import { ShippingCommands } from './shipping'
|
|
21
|
-
import { UninstallCommands } from './uninstall'
|
|
22
|
-
import { VelocityCommands } from './velocity'
|
|
23
|
-
import { WorkflowCommands } from './workflow'
|
|
24
|
-
|
|
25
|
-
// Singleton instances of command groups
|
|
26
|
-
const workflow = new WorkflowCommands()
|
|
27
|
-
const planning = new PlanningCommands()
|
|
28
|
-
const shipping = new ShippingCommands()
|
|
29
|
-
const analytics = new AnalyticsCommands()
|
|
30
|
-
const performance = new PerformanceCommands()
|
|
31
|
-
const maintenance = new MaintenanceCommands()
|
|
32
|
-
const analysis = new AnalysisCommands()
|
|
33
|
-
const setup = new SetupCommands()
|
|
34
|
-
const context = new ContextCommands()
|
|
35
|
-
const velocityCmd = new VelocityCommands()
|
|
36
|
-
const uninstallCmd = new UninstallCommands()
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Register categories
|
|
40
|
-
*/
|
|
41
|
-
function registerCategories(): void {
|
|
42
|
-
for (const [name, info] of Object.entries(CATEGORIES)) {
|
|
43
|
-
commandRegistry.registerCategory(name, info)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Register all commands from existing command groups
|
|
49
|
-
*/
|
|
50
|
-
export function registerAllCommands(): void {
|
|
51
|
-
// Skip if already registered
|
|
52
|
-
if (commandRegistry.has('work')) return
|
|
53
|
-
|
|
54
|
-
// Register categories first
|
|
55
|
-
registerCategories()
|
|
56
|
-
|
|
57
|
-
// Helper to get metadata from COMMANDS
|
|
58
|
-
const getMeta = (name: string) => COMMANDS.find((c) => c.name === name)
|
|
59
|
-
|
|
60
|
-
// Workflow commands
|
|
61
|
-
commandRegistry.registerMethod('done', workflow, 'done', getMeta('done'))
|
|
62
|
-
commandRegistry.registerMethod('next', workflow, 'next', getMeta('next'))
|
|
63
|
-
commandRegistry.registerMethod('pause', workflow, 'pause', getMeta('pause'))
|
|
64
|
-
commandRegistry.registerMethod('resume', workflow, 'resume', getMeta('resume'))
|
|
65
|
-
commandRegistry.registerMethod('workflow', workflow, 'workflow', getMeta('workflow'))
|
|
66
|
-
|
|
67
|
-
// Planning commands
|
|
68
|
-
commandRegistry.registerMethod('init', planning, 'init', getMeta('init'))
|
|
69
|
-
commandRegistry.registerMethod('bug', planning, 'bug', getMeta('bug'))
|
|
70
|
-
commandRegistry.registerMethod('idea', planning, 'idea', getMeta('idea'))
|
|
71
|
-
commandRegistry.registerMethod('spec', planning, 'spec', getMeta('spec'))
|
|
72
|
-
|
|
73
|
-
// Shipping commands
|
|
74
|
-
commandRegistry.registerMethod('ship', shipping, 'ship', getMeta('ship'))
|
|
75
|
-
|
|
76
|
-
// Analytics commands
|
|
77
|
-
commandRegistry.registerMethod('dash', analytics, 'dash', getMeta('dash'))
|
|
78
|
-
commandRegistry.registerMethod('help', analytics, 'help', getMeta('help'))
|
|
79
|
-
|
|
80
|
-
// Performance commands
|
|
81
|
-
commandRegistry.registerMethod('perf', performance, 'perf', getMeta('perf'))
|
|
82
|
-
|
|
83
|
-
// Velocity commands
|
|
84
|
-
commandRegistry.registerMethod('velocity', velocityCmd, 'velocity', getMeta('velocity'))
|
|
85
|
-
|
|
86
|
-
// Maintenance commands
|
|
87
|
-
commandRegistry.registerMethod('cleanup', maintenance, 'cleanup', getMeta('cleanup'))
|
|
88
|
-
commandRegistry.registerMethod('design', maintenance, 'design', getMeta('design'))
|
|
89
|
-
commandRegistry.registerMethod('recover', maintenance, 'recover', getMeta('recover'))
|
|
90
|
-
commandRegistry.registerMethod('undo', maintenance, 'undo', getMeta('undo'))
|
|
91
|
-
commandRegistry.registerMethod('redo', maintenance, 'redo', getMeta('redo'))
|
|
92
|
-
commandRegistry.registerMethod('history', maintenance, 'history', getMeta('history'))
|
|
93
|
-
|
|
94
|
-
// Analysis commands
|
|
95
|
-
commandRegistry.registerMethod('analyze', analysis, 'analyze', getMeta('analyze'))
|
|
96
|
-
commandRegistry.registerMethod('sync', analysis, 'sync', getMeta('sync'))
|
|
97
|
-
commandRegistry.registerMethod('stats', analysis, 'stats', getMeta('stats'))
|
|
98
|
-
commandRegistry.registerMethod('status', analysis, 'status', getMeta('status'))
|
|
99
|
-
commandRegistry.registerMethod('seal', analysis, 'seal', getMeta('seal'))
|
|
100
|
-
commandRegistry.registerMethod('verify', analysis, 'verify', getMeta('verify'))
|
|
101
|
-
|
|
102
|
-
// Setup commands
|
|
103
|
-
commandRegistry.registerMethod('start', setup, 'start', getMeta('start'))
|
|
104
|
-
commandRegistry.registerMethod('setup', setup, 'setup', getMeta('setup'))
|
|
105
|
-
commandRegistry.registerMethod('uninstall', uninstallCmd, 'uninstall', getMeta('uninstall'))
|
|
106
|
-
|
|
107
|
-
// Context command (for Claude templates)
|
|
108
|
-
commandRegistry.registerMethod('context', context, 'context', getMeta('context'))
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Auto-register on import
|
|
112
|
-
registerAllCommands()
|
|
113
|
-
|
|
114
|
-
// Export command group instances for direct access (legacy support)
|
|
115
|
-
export {
|
|
116
|
-
workflow,
|
|
117
|
-
planning,
|
|
118
|
-
shipping,
|
|
119
|
-
analytics,
|
|
120
|
-
performance,
|
|
121
|
-
maintenance,
|
|
122
|
-
analysis,
|
|
123
|
-
setup,
|
|
124
|
-
context,
|
|
125
|
-
velocityCmd,
|
|
126
|
-
uninstallCmd,
|
|
127
|
-
}
|
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command Registry - Central command routing and execution
|
|
3
|
-
*
|
|
4
|
-
* Replaces the aggregator anti-pattern in commands.ts with a proper registry.
|
|
5
|
-
* Each command is registered as a handler that receives context and returns a result.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import configManager from '../infrastructure/config-manager'
|
|
9
|
-
import pathManager from '../infrastructure/path-manager'
|
|
10
|
-
import type { CommandResult } from '../types'
|
|
11
|
-
import { getErrorMessage } from '../types/fs'
|
|
12
|
-
import { getTimestamp } from '../utils/date-helper'
|
|
13
|
-
|
|
14
|
-
// Re-export types for convenience
|
|
15
|
-
export type {
|
|
16
|
-
BlockingRules,
|
|
17
|
-
CategoryInfo,
|
|
18
|
-
CommandHandler,
|
|
19
|
-
CommandMeta,
|
|
20
|
-
CommandValidationResult as ValidationResult,
|
|
21
|
-
ExecutionContext,
|
|
22
|
-
HandlerFn,
|
|
23
|
-
RegistryCommandUsage as CommandUsage,
|
|
24
|
-
RegistryStats,
|
|
25
|
-
} from '../types'
|
|
26
|
-
|
|
27
|
-
import type {
|
|
28
|
-
CategoryInfo,
|
|
29
|
-
CommandHandler,
|
|
30
|
-
CommandMeta,
|
|
31
|
-
ExecutionContext,
|
|
32
|
-
HandlerFn,
|
|
33
|
-
RegistryStats,
|
|
34
|
-
} from '../types'
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Command Registry - Routes commands to handlers
|
|
38
|
-
*
|
|
39
|
-
* Single source of truth for command metadata and execution.
|
|
40
|
-
* Supports:
|
|
41
|
-
* - Class-based handlers (CommandHandler interface)
|
|
42
|
-
* - Function-based handlers (HandlerFn type)
|
|
43
|
-
* - Bound method registration from existing classes
|
|
44
|
-
* - Full metadata registration from static definitions
|
|
45
|
-
*/
|
|
46
|
-
export class CommandRegistry {
|
|
47
|
-
private handlers: Map<string, CommandHandler<unknown>> = new Map()
|
|
48
|
-
private handlerFns: Map<string, HandlerFn<unknown>> = new Map()
|
|
49
|
-
private metadata: Map<string, CommandMeta> = new Map()
|
|
50
|
-
private categories: Map<string, CategoryInfo> = new Map()
|
|
51
|
-
private noProjectCommands: Set<string> = new Set(['init', 'setup', 'start', 'migrateAll'])
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Register a command handler (class-based)
|
|
55
|
-
*/
|
|
56
|
-
register<TParams>(handler: CommandHandler<TParams>, meta?: Partial<CommandMeta>): void {
|
|
57
|
-
this.handlers.set(handler.name, handler as CommandHandler<unknown>)
|
|
58
|
-
this.setMeta(handler.name, meta)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Register a command handler function (function-based)
|
|
63
|
-
*/
|
|
64
|
-
registerFn<TParams>(
|
|
65
|
-
name: string,
|
|
66
|
-
handler: HandlerFn<TParams>,
|
|
67
|
-
meta?: Partial<CommandMeta>
|
|
68
|
-
): void {
|
|
69
|
-
this.handlerFns.set(name, handler as HandlerFn<unknown>)
|
|
70
|
-
this.setMeta(name, meta)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Set command metadata with defaults
|
|
75
|
-
*/
|
|
76
|
-
private setMeta(name: string, meta?: Partial<CommandMeta>): void {
|
|
77
|
-
const requiresProject = meta?.requiresProject ?? !this.noProjectCommands.has(name)
|
|
78
|
-
this.metadata.set(name, {
|
|
79
|
-
name,
|
|
80
|
-
group: meta?.group ?? 'unknown',
|
|
81
|
-
description: meta?.description ?? '',
|
|
82
|
-
requiresProject,
|
|
83
|
-
usage: meta?.usage ?? { claude: null, terminal: null },
|
|
84
|
-
implemented: meta?.implemented ?? true,
|
|
85
|
-
hasTemplate: meta?.hasTemplate ?? false,
|
|
86
|
-
params: meta?.params,
|
|
87
|
-
blockingRules: meta?.blockingRules,
|
|
88
|
-
features: meta?.features,
|
|
89
|
-
isOptional: meta?.isOptional,
|
|
90
|
-
deprecated: meta?.deprecated,
|
|
91
|
-
replacedBy: meta?.replacedBy,
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Register a category
|
|
97
|
-
*/
|
|
98
|
-
registerCategory(name: string, info: CategoryInfo): void {
|
|
99
|
-
this.categories.set(name, info)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Register a bound method from an existing command group
|
|
104
|
-
* Bridges legacy command classes to the registry pattern
|
|
105
|
-
*/
|
|
106
|
-
registerMethod<T extends object>(
|
|
107
|
-
name: string,
|
|
108
|
-
instance: T,
|
|
109
|
-
methodName: keyof T,
|
|
110
|
-
meta?: Partial<CommandMeta>
|
|
111
|
-
): void {
|
|
112
|
-
const method = instance[methodName]
|
|
113
|
-
if (typeof method !== 'function') {
|
|
114
|
-
throw new Error(`${String(methodName)} is not a function`)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Create a wrapper that adapts legacy method signature to HandlerFn
|
|
118
|
-
const wrapper: HandlerFn<unknown> = async (params, context) => {
|
|
119
|
-
// Legacy commands expect (param?, projectPath) signature
|
|
120
|
-
// Most commands use first param + projectPath
|
|
121
|
-
type LegacyMethod = (...args: unknown[]) => Promise<CommandResult>
|
|
122
|
-
if (params !== undefined && params !== null) {
|
|
123
|
-
return (method as LegacyMethod).call(instance, params, context.projectPath)
|
|
124
|
-
}
|
|
125
|
-
return (method as LegacyMethod).call(instance, context.projectPath)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
this.handlerFns.set(name, wrapper)
|
|
129
|
-
this.setMeta(name, meta)
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Check if a command is registered
|
|
134
|
-
*/
|
|
135
|
-
has(name: string): boolean {
|
|
136
|
-
return this.handlers.has(name) || this.handlerFns.has(name)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Get list of registered commands
|
|
141
|
-
*/
|
|
142
|
-
list(): string[] {
|
|
143
|
-
return [...this.handlers.keys(), ...this.handlerFns.keys()]
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Get commands by group
|
|
148
|
-
*/
|
|
149
|
-
listByGroup(group: string): string[] {
|
|
150
|
-
return Array.from(this.metadata.entries())
|
|
151
|
-
.filter(([, meta]) => meta.group === group)
|
|
152
|
-
.map(([name]) => name)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Get all groups
|
|
157
|
-
*/
|
|
158
|
-
getGroups(): string[] {
|
|
159
|
-
const groups = new Set<string>()
|
|
160
|
-
for (const meta of this.metadata.values()) {
|
|
161
|
-
groups.add(meta.group)
|
|
162
|
-
}
|
|
163
|
-
return Array.from(groups)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Get command metadata
|
|
168
|
-
*/
|
|
169
|
-
getMeta(name: string): CommandMeta | undefined {
|
|
170
|
-
return this.metadata.get(name)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// ===== Query Methods (from static registry) =====
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Get all commands
|
|
177
|
-
*/
|
|
178
|
-
getAll(): CommandMeta[] {
|
|
179
|
-
return Array.from(this.metadata.values())
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Get command by name
|
|
184
|
-
*/
|
|
185
|
-
getByName(name: string): CommandMeta | undefined {
|
|
186
|
-
return this.metadata.get(name)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Get commands by category/group
|
|
191
|
-
*/
|
|
192
|
-
getByCategory(category: string): CommandMeta[] {
|
|
193
|
-
return this.getAll().filter((c) => c.group === category)
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Get all implemented commands
|
|
198
|
-
*/
|
|
199
|
-
getAllImplemented(): CommandMeta[] {
|
|
200
|
-
return this.getAll().filter((c) => c.implemented)
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Get all commands with templates
|
|
205
|
-
*/
|
|
206
|
-
getAllWithTemplates(): CommandMeta[] {
|
|
207
|
-
return this.getAll().filter((c) => c.hasTemplate)
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Get commands available in Claude Code
|
|
212
|
-
*/
|
|
213
|
-
getClaudeCommands(): CommandMeta[] {
|
|
214
|
-
return this.getAll().filter((c) => c.usage.claude !== null)
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Get commands available in terminal
|
|
219
|
-
*/
|
|
220
|
-
getTerminalCommands(): CommandMeta[] {
|
|
221
|
-
return this.getAll().filter((c) => c.usage.terminal !== null)
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Get all categories
|
|
226
|
-
*/
|
|
227
|
-
getAllCategories(): Map<string, CategoryInfo> {
|
|
228
|
-
return new Map(this.categories)
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Get category metadata
|
|
233
|
-
*/
|
|
234
|
-
getCategory(category: string): CategoryInfo | undefined {
|
|
235
|
-
return this.categories.get(category)
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Get commands that require initialization
|
|
240
|
-
*/
|
|
241
|
-
getRequiresInit(): CommandMeta[] {
|
|
242
|
-
return this.getAll().filter((c) => c.requiresProject)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Get commands with blocking rules
|
|
247
|
-
*/
|
|
248
|
-
getWithBlockingRules(): CommandMeta[] {
|
|
249
|
-
return this.getAll().filter((c) => c.blockingRules !== undefined)
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Get optional commands
|
|
254
|
-
*/
|
|
255
|
-
getOptionalCommands(): CommandMeta[] {
|
|
256
|
-
return this.getAll().filter((c) => c.isOptional)
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Get deprecated commands
|
|
261
|
-
*/
|
|
262
|
-
getDeprecatedCommands(): CommandMeta[] {
|
|
263
|
-
return this.getAll().filter((c) => c.deprecated)
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Get statistics
|
|
268
|
-
*/
|
|
269
|
-
getStats(): RegistryStats {
|
|
270
|
-
const all = this.getAll()
|
|
271
|
-
const byCategory: Record<string, number> = {}
|
|
272
|
-
|
|
273
|
-
for (const category of this.categories.keys()) {
|
|
274
|
-
byCategory[category] = all.filter((c) => c.group === category).length
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return {
|
|
278
|
-
total: all.length,
|
|
279
|
-
implemented: all.filter((c) => c.implemented).length,
|
|
280
|
-
withTemplates: all.filter((c) => c.hasTemplate).length,
|
|
281
|
-
claudeOnly: all.filter((c) => c.usage.claude && !c.usage.terminal).length,
|
|
282
|
-
terminalOnly: all.filter((c) => !c.usage.claude && c.usage.terminal).length,
|
|
283
|
-
both: all.filter((c) => c.usage.claude && c.usage.terminal).length,
|
|
284
|
-
requiresInit: all.filter((c) => c.requiresProject).length,
|
|
285
|
-
byCategory,
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* Validate registry
|
|
291
|
-
*/
|
|
292
|
-
validate(): { valid: boolean; issues: string[] } {
|
|
293
|
-
const issues: string[] = []
|
|
294
|
-
const all = this.getAll()
|
|
295
|
-
|
|
296
|
-
// Check for duplicate names
|
|
297
|
-
const names = all.map((c) => c.name)
|
|
298
|
-
const duplicates = names.filter((name, index) => names.indexOf(name) !== index)
|
|
299
|
-
if (duplicates.length > 0) {
|
|
300
|
-
issues.push(`Duplicate command names: ${duplicates.join(', ')}`)
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Check for commands with templates but not implemented
|
|
304
|
-
const notImplemented = all.filter((c) => c.hasTemplate && !c.implemented)
|
|
305
|
-
if (notImplemented.length > 0) {
|
|
306
|
-
issues.push(
|
|
307
|
-
`Commands with templates but not implemented: ${notImplemented.map((c) => c.name).join(', ')}`
|
|
308
|
-
)
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Check for invalid categories
|
|
312
|
-
const validCategories = Array.from(this.categories.keys())
|
|
313
|
-
if (validCategories.length > 0) {
|
|
314
|
-
const invalidCategories = all.filter((c) => !validCategories.includes(c.group))
|
|
315
|
-
if (invalidCategories.length > 0) {
|
|
316
|
-
issues.push(
|
|
317
|
-
`Invalid categories: ${invalidCategories.map((c) => `${c.name}:${c.group}`).join(', ')}`
|
|
318
|
-
)
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return {
|
|
323
|
-
valid: issues.length === 0,
|
|
324
|
-
issues,
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Build execution context for a project
|
|
330
|
-
*/
|
|
331
|
-
async buildContext(projectPath: string): Promise<ExecutionContext> {
|
|
332
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
333
|
-
|
|
334
|
-
if (!projectId) {
|
|
335
|
-
throw new Error('No prjct project found. Run /p:init first.')
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
return {
|
|
339
|
-
projectId,
|
|
340
|
-
projectPath,
|
|
341
|
-
globalPath: pathManager.getGlobalProjectPath(projectId),
|
|
342
|
-
timestamp: getTimestamp(),
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Execute a command by name
|
|
348
|
-
*/
|
|
349
|
-
async execute<TParams = void>(
|
|
350
|
-
name: string,
|
|
351
|
-
params: TParams,
|
|
352
|
-
projectPath: string = process.cwd()
|
|
353
|
-
): Promise<CommandResult> {
|
|
354
|
-
const meta = this.metadata.get(name)
|
|
355
|
-
|
|
356
|
-
// Build context (may throw if project not initialized)
|
|
357
|
-
let context: ExecutionContext
|
|
358
|
-
if (meta?.requiresProject === false) {
|
|
359
|
-
context = {
|
|
360
|
-
projectId: '',
|
|
361
|
-
projectPath,
|
|
362
|
-
globalPath: '',
|
|
363
|
-
timestamp: getTimestamp(),
|
|
364
|
-
}
|
|
365
|
-
} else {
|
|
366
|
-
try {
|
|
367
|
-
context = await this.buildContext(projectPath)
|
|
368
|
-
} catch (error) {
|
|
369
|
-
return {
|
|
370
|
-
success: false,
|
|
371
|
-
error: getErrorMessage(error),
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
// Check class-based handlers first
|
|
377
|
-
const handler = this.handlers.get(name)
|
|
378
|
-
if (handler) {
|
|
379
|
-
return handler.execute(params, context)
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
// Check function-based handlers
|
|
383
|
-
const handlerFn = this.handlerFns.get(name)
|
|
384
|
-
if (handlerFn) {
|
|
385
|
-
return handlerFn(params, context)
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
return {
|
|
389
|
-
success: false,
|
|
390
|
-
error: `Command not found: ${name}`,
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/**
|
|
395
|
-
* Execute without requiring project (for init, setup commands)
|
|
396
|
-
* @deprecated Use execute() - it auto-detects based on command metadata
|
|
397
|
-
*/
|
|
398
|
-
async executeWithoutProject<TParams = void>(
|
|
399
|
-
name: string,
|
|
400
|
-
params: TParams,
|
|
401
|
-
projectPath: string = process.cwd()
|
|
402
|
-
): Promise<CommandResult> {
|
|
403
|
-
const handler = this.handlers.get(name)
|
|
404
|
-
if (handler) {
|
|
405
|
-
const context: ExecutionContext = {
|
|
406
|
-
projectId: '',
|
|
407
|
-
projectPath,
|
|
408
|
-
globalPath: '',
|
|
409
|
-
timestamp: getTimestamp(),
|
|
410
|
-
}
|
|
411
|
-
return handler.execute(params, context)
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
const handlerFn = this.handlerFns.get(name)
|
|
415
|
-
if (handlerFn) {
|
|
416
|
-
const context: ExecutionContext = {
|
|
417
|
-
projectId: '',
|
|
418
|
-
projectPath,
|
|
419
|
-
globalPath: '',
|
|
420
|
-
timestamp: getTimestamp(),
|
|
421
|
-
}
|
|
422
|
-
return handlerFn(params, context)
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
return {
|
|
426
|
-
success: false,
|
|
427
|
-
error: `Command not found: ${name}`,
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* Clear all registrations (useful for testing)
|
|
433
|
-
*/
|
|
434
|
-
clear(): void {
|
|
435
|
-
this.handlers.clear()
|
|
436
|
-
this.handlerFns.clear()
|
|
437
|
-
this.metadata.clear()
|
|
438
|
-
this.categories.clear()
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// Singleton instance
|
|
443
|
-
export const commandRegistry = new CommandRegistry()
|
|
444
|
-
export default commandRegistry
|