prjct-cli 1.22.0 → 1.24.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 +230 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct-core.mjs +1748 -0
- package/dist/bin/prjct.mjs +17 -36672
- package/dist/cli/linear.mjs +14 -0
- package/dist/daemon/entry.mjs +1429 -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,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Router
|
|
3
|
-
* Orchestrates agent loading and context building for Claude delegation.
|
|
4
|
-
*
|
|
5
|
-
* Loads agents from global storage:
|
|
6
|
-
* ~/.prjct-cli/projects/{id}/agents/
|
|
7
|
-
*
|
|
8
|
-
* Agents are dynamically generated by /p:sync based on project tech stack.
|
|
9
|
-
*
|
|
10
|
-
* @module agentic/agent-router
|
|
11
|
-
* @version 4.0.0
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import fs from 'node:fs/promises'
|
|
15
|
-
import path from 'node:path'
|
|
16
|
-
import configManager from '../infrastructure/config-manager'
|
|
17
|
-
import pathManager from '../infrastructure/path-manager'
|
|
18
|
-
import type { Agent, AssignmentContext } from '../types'
|
|
19
|
-
import { getErrorMessage, isNotFoundError } from '../types/fs'
|
|
20
|
-
|
|
21
|
-
// Re-export types for convenience
|
|
22
|
-
export type { Agent, AssignmentContext } from '../types'
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Routes tasks to specialized agents based on Claude's decisions.
|
|
26
|
-
* Handles agent loading, context building, and usage logging.
|
|
27
|
-
*/
|
|
28
|
-
class AgentRouter {
|
|
29
|
-
projectId: string | null = null
|
|
30
|
-
projectPath: string | null = null
|
|
31
|
-
agentsPath: string | null = null
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Initialize router with project context
|
|
35
|
-
*/
|
|
36
|
-
async initialize(projectPath: string): Promise<void> {
|
|
37
|
-
this.projectId = await configManager.getProjectId(projectPath)
|
|
38
|
-
this.projectPath = projectPath
|
|
39
|
-
this.agentsPath = pathManager.getFilePath(this.projectId!, 'agents', '')
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Load all available agents from global storage
|
|
44
|
-
*/
|
|
45
|
-
async loadAvailableAgents(): Promise<Agent[]> {
|
|
46
|
-
if (!this.agentsPath) return []
|
|
47
|
-
|
|
48
|
-
try {
|
|
49
|
-
const files = await fs.readdir(this.agentsPath)
|
|
50
|
-
const agents: Agent[] = []
|
|
51
|
-
|
|
52
|
-
for (const file of files) {
|
|
53
|
-
if (file.endsWith('.md')) {
|
|
54
|
-
const name = file.replace('.md', '')
|
|
55
|
-
const content = await fs.readFile(path.join(this.agentsPath, file), 'utf-8')
|
|
56
|
-
agents.push({ name, content })
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return agents
|
|
61
|
-
} catch (error) {
|
|
62
|
-
// Agents directory doesn't exist yet - expected for new projects
|
|
63
|
-
if (!isNotFoundError(error)) {
|
|
64
|
-
console.error(`Agent loading error: ${getErrorMessage(error)}`)
|
|
65
|
-
}
|
|
66
|
-
return []
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Get list of available agent names
|
|
72
|
-
*/
|
|
73
|
-
async getAgentNames(): Promise<string[]> {
|
|
74
|
-
const agents = await this.loadAvailableAgents()
|
|
75
|
-
return agents.map((a) => a.name)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Load a specific agent by name from global storage
|
|
80
|
-
*/
|
|
81
|
-
async loadAgent(name: string): Promise<Agent | null> {
|
|
82
|
-
if (!this.agentsPath) return null
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
const filePath = path.join(this.agentsPath, `${name}.md`)
|
|
86
|
-
const content = await fs.readFile(filePath, 'utf-8')
|
|
87
|
-
return { name, content }
|
|
88
|
-
} catch (error) {
|
|
89
|
-
// Agent file doesn't exist - expected
|
|
90
|
-
if (!isNotFoundError(error)) {
|
|
91
|
-
console.error(`Agent load error: ${getErrorMessage(error)}`)
|
|
92
|
-
}
|
|
93
|
-
return null
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Build context for Claude to decide agent assignment
|
|
99
|
-
*/
|
|
100
|
-
async buildAssignmentContext(
|
|
101
|
-
task: string | { description?: string },
|
|
102
|
-
projectPath: string
|
|
103
|
-
): Promise<AssignmentContext> {
|
|
104
|
-
const agents = await this.getAgentNames()
|
|
105
|
-
|
|
106
|
-
return {
|
|
107
|
-
task: typeof task === 'string' ? task : task.description || '',
|
|
108
|
-
availableAgents: agents,
|
|
109
|
-
projectPath,
|
|
110
|
-
projectId: this.projectId,
|
|
111
|
-
// Claude reads this and decides via template
|
|
112
|
-
_template: 'templates/agent-assignment.md',
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Log agent usage to JSONL file
|
|
118
|
-
*/
|
|
119
|
-
async logUsage(
|
|
120
|
-
task: string | { description?: string },
|
|
121
|
-
agent: string | { name?: string },
|
|
122
|
-
_projectPath: string
|
|
123
|
-
): Promise<void> {
|
|
124
|
-
try {
|
|
125
|
-
const logPath = path.join(
|
|
126
|
-
process.env.HOME || '',
|
|
127
|
-
'.prjct-cli',
|
|
128
|
-
'projects',
|
|
129
|
-
this.projectId || '',
|
|
130
|
-
'agent-usage.jsonl'
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
const entry = `${JSON.stringify({
|
|
134
|
-
timestamp: new Date().toISOString(),
|
|
135
|
-
task: typeof task === 'string' ? task : task.description,
|
|
136
|
-
agent: typeof agent === 'string' ? agent : agent.name,
|
|
137
|
-
projectId: this.projectId,
|
|
138
|
-
})}\n`
|
|
139
|
-
|
|
140
|
-
await fs.appendFile(logPath, entry)
|
|
141
|
-
} catch (error) {
|
|
142
|
-
// Non-critical - log unexpected errors but don't fail
|
|
143
|
-
if (!isNotFoundError(error)) {
|
|
144
|
-
console.error(`Agent usage log error: ${getErrorMessage(error)}`)
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export default AgentRouter
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Anti-Hallucination Block Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates constraint blocks that ground the LLM in project reality.
|
|
5
|
-
* Based on research of 25+ system prompts (Claude Code, Gemini, ChatGPT),
|
|
6
|
-
* the following techniques reduce hallucinations 25-40%:
|
|
7
|
-
*
|
|
8
|
-
* 1. Explicit availability — what IS in the project
|
|
9
|
-
* 2. Explicit unavailability — what is NOT in the project
|
|
10
|
-
* 3. Visibility grounding — only use paths shown in context
|
|
11
|
-
* 4. Library verification — check package.json before assuming
|
|
12
|
-
* 5. Scope clarification — limit to project directory
|
|
13
|
-
*
|
|
14
|
-
* This block should be injected BEFORE task context (position 5 in prompt order)
|
|
15
|
-
* so the LLM has constraints loaded before reading code.
|
|
16
|
-
*
|
|
17
|
-
* @module agentic/anti-hallucination
|
|
18
|
-
* @see PRJ-301
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import { z } from 'zod'
|
|
22
|
-
import { deduplicateTechStack } from './tech-normalizer'
|
|
23
|
-
|
|
24
|
-
// =============================================================================
|
|
25
|
-
// Schema
|
|
26
|
-
// =============================================================================
|
|
27
|
-
|
|
28
|
-
export const ProjectGroundTruthSchema = z.object({
|
|
29
|
-
/** Project root path */
|
|
30
|
-
projectPath: z.string(),
|
|
31
|
-
/** Programming language (e.g., 'TypeScript', 'JavaScript', 'Python') */
|
|
32
|
-
language: z.string().optional(),
|
|
33
|
-
/** Primary framework (e.g., 'Hono', 'Next.js', 'Express') */
|
|
34
|
-
framework: z.string().optional(),
|
|
35
|
-
/** Technology stack items (e.g., ['Hono', 'Zod', 'Vitest']) */
|
|
36
|
-
techStack: z.array(z.string()).default([]),
|
|
37
|
-
/** Domain flags from sealed analysis */
|
|
38
|
-
domains: z
|
|
39
|
-
.object({
|
|
40
|
-
hasFrontend: z.boolean().default(false),
|
|
41
|
-
hasBackend: z.boolean().default(false),
|
|
42
|
-
hasDatabase: z.boolean().default(false),
|
|
43
|
-
hasTesting: z.boolean().default(false),
|
|
44
|
-
hasDocker: z.boolean().default(false),
|
|
45
|
-
})
|
|
46
|
-
.optional(),
|
|
47
|
-
/** Total files in project */
|
|
48
|
-
fileCount: z.number().optional(),
|
|
49
|
-
/** Available agent names (e.g., ['backend', 'testing']) */
|
|
50
|
-
availableAgents: z.array(z.string()).default([]),
|
|
51
|
-
/** Sealed analysis languages — used to ground available tech (PRJ-260) */
|
|
52
|
-
analysisLanguages: z.array(z.string()).default([]),
|
|
53
|
-
/** Sealed analysis frameworks — used to ground available tech (PRJ-260) */
|
|
54
|
-
analysisFrameworks: z.array(z.string()).default([]),
|
|
55
|
-
/** Package manager from sealed analysis (PRJ-260) */
|
|
56
|
-
analysisPackageManager: z.string().optional(),
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
export type ProjectGroundTruth = z.input<typeof ProjectGroundTruthSchema>
|
|
60
|
-
|
|
61
|
-
// =============================================================================
|
|
62
|
-
// Domain Mapping
|
|
63
|
-
// =============================================================================
|
|
64
|
-
|
|
65
|
-
/** Map domain flags to human-readable technology categories */
|
|
66
|
-
const DOMAIN_LABELS: Record<string, string> = {
|
|
67
|
-
hasFrontend: 'Frontend (UI/components)',
|
|
68
|
-
hasBackend: 'Backend (APIs/servers)',
|
|
69
|
-
hasDatabase: 'Database (SQL/ORM)',
|
|
70
|
-
hasTesting: 'Testing (unit/integration)',
|
|
71
|
-
hasDocker: 'Docker/containers',
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// =============================================================================
|
|
75
|
-
// Generator
|
|
76
|
-
// =============================================================================
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Build the anti-hallucination constraints block.
|
|
80
|
-
*
|
|
81
|
-
* Returns a markdown section with explicit availability statements,
|
|
82
|
-
* visibility grounding rules, and library verification directives.
|
|
83
|
-
*/
|
|
84
|
-
export function buildAntiHallucinationBlock(truth: ProjectGroundTruth): string {
|
|
85
|
-
const parts: string[] = []
|
|
86
|
-
|
|
87
|
-
parts.push('## CONSTRAINTS (Read Before Acting)\n')
|
|
88
|
-
|
|
89
|
-
// 1. Explicit availability (enriched by sealed analysis — PRJ-260, PRJ-300)
|
|
90
|
-
// Use normalized deduplication to prevent "React" and "react" appearing twice,
|
|
91
|
-
// and to handle aliases like "Next.js" vs "nextjs".
|
|
92
|
-
const rawAvailable: string[] = []
|
|
93
|
-
if (truth.language) rawAvailable.push(truth.language)
|
|
94
|
-
if (truth.framework) rawAvailable.push(truth.framework)
|
|
95
|
-
const techStack = truth.techStack ?? []
|
|
96
|
-
rawAvailable.push(...techStack)
|
|
97
|
-
// Merge languages/frameworks from sealed analysis
|
|
98
|
-
const analysisLangs = truth.analysisLanguages ?? []
|
|
99
|
-
const analysisFrameworks = truth.analysisFrameworks ?? []
|
|
100
|
-
rawAvailable.push(...analysisLangs, ...analysisFrameworks)
|
|
101
|
-
const available = deduplicateTechStack(rawAvailable)
|
|
102
|
-
|
|
103
|
-
if (available.length > 0) {
|
|
104
|
-
parts.push(`AVAILABLE in this project: ${available.join(', ')}`)
|
|
105
|
-
}
|
|
106
|
-
if (truth.analysisPackageManager) {
|
|
107
|
-
parts.push(`PACKAGE MANAGER: ${truth.analysisPackageManager}`)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// 2. Explicit unavailability from domain flags
|
|
111
|
-
if (truth.domains) {
|
|
112
|
-
const absent = Object.entries(truth.domains)
|
|
113
|
-
.filter(([, hasIt]) => !hasIt)
|
|
114
|
-
.map(([key]) => DOMAIN_LABELS[key])
|
|
115
|
-
.filter(Boolean)
|
|
116
|
-
|
|
117
|
-
if (absent.length > 0) {
|
|
118
|
-
parts.push(`NOT PRESENT: ${absent.join(', ')}`)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// 3. Available agents
|
|
123
|
-
const availableAgents = truth.availableAgents ?? []
|
|
124
|
-
if (availableAgents.length > 0) {
|
|
125
|
-
parts.push(`AGENTS: ${availableAgents.join(', ')}`)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// 4. Scope and grounding rules
|
|
129
|
-
parts.push('')
|
|
130
|
-
parts.push(`SCOPE: Only files in \`${truth.projectPath}\` are accessible.`)
|
|
131
|
-
parts.push('RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths.')
|
|
132
|
-
parts.push('RULE: NEVER assume a library is available. Check package.json/imports first.')
|
|
133
|
-
parts.push('RULE: If previous context contradicts this section, trust this section.')
|
|
134
|
-
parts.push('RULE: Read files BEFORE modifying. Never assume code structure.')
|
|
135
|
-
|
|
136
|
-
if (truth.fileCount) {
|
|
137
|
-
parts.push(`\nContext: ${truth.fileCount} files in project.`)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return parts.join('\n')
|
|
141
|
-
}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chain of Thought Reasoning
|
|
3
|
-
* Implements step-by-step reasoning for complex commands
|
|
4
|
-
*
|
|
5
|
-
* @module agentic/chain-of-thought
|
|
6
|
-
* @version 1.0.0
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { ContextState, ProjectContext } from '../types'
|
|
10
|
-
|
|
11
|
-
// Type aliases for compatibility with ProjectContext from contextBuilder.build()
|
|
12
|
-
type Context = Pick<ProjectContext, 'projectId' | 'projectPath' | 'params'>
|
|
13
|
-
type State = ContextState
|
|
14
|
-
|
|
15
|
-
interface ReasoningStep {
|
|
16
|
-
step: string
|
|
17
|
-
passed: boolean
|
|
18
|
-
details?: string
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface ReasoningResult {
|
|
22
|
-
commandName: string
|
|
23
|
-
reasoning: {
|
|
24
|
-
steps: ReasoningStep[]
|
|
25
|
-
allPassed: boolean
|
|
26
|
-
criticalIssues: string[]
|
|
27
|
-
} | null
|
|
28
|
-
plan: string[]
|
|
29
|
-
confidence: number
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Commands that require chain of thought reasoning
|
|
34
|
-
*/
|
|
35
|
-
const REASONING_REQUIRED_COMMANDS = ['ship', 'feature', 'spec', 'cleanup', 'migrate']
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Check if command requires reasoning
|
|
39
|
-
*/
|
|
40
|
-
function requiresReasoning(commandName: string): boolean {
|
|
41
|
-
return REASONING_REQUIRED_COMMANDS.includes(commandName)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Reason through a command before execution
|
|
46
|
-
*/
|
|
47
|
-
async function reason(
|
|
48
|
-
commandName: string,
|
|
49
|
-
context: Context,
|
|
50
|
-
state: State
|
|
51
|
-
): Promise<ReasoningResult> {
|
|
52
|
-
const steps: ReasoningStep[] = []
|
|
53
|
-
const plan: string[] = []
|
|
54
|
-
const criticalIssues: string[] = []
|
|
55
|
-
|
|
56
|
-
switch (commandName) {
|
|
57
|
-
case 'ship':
|
|
58
|
-
// Check prerequisites
|
|
59
|
-
if (state.now && !state.now.includes('No current task')) {
|
|
60
|
-
steps.push({ step: 'Has active task', passed: true })
|
|
61
|
-
} else {
|
|
62
|
-
steps.push({ step: 'Has active task', passed: false, details: 'No active task to ship' })
|
|
63
|
-
criticalIssues.push('No active task')
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Check if there's content to ship
|
|
67
|
-
if (state.shipped) {
|
|
68
|
-
steps.push({ step: 'Shipped log accessible', passed: true })
|
|
69
|
-
} else {
|
|
70
|
-
steps.push({
|
|
71
|
-
step: 'Shipped log accessible',
|
|
72
|
-
passed: false,
|
|
73
|
-
details: 'shipped.md not found',
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Plan
|
|
78
|
-
plan.push('Read current task from now.md')
|
|
79
|
-
plan.push('Calculate duration')
|
|
80
|
-
plan.push('Append to shipped.md')
|
|
81
|
-
plan.push('Clear now.md')
|
|
82
|
-
plan.push('Update metrics')
|
|
83
|
-
break
|
|
84
|
-
|
|
85
|
-
case 'feature':
|
|
86
|
-
// Check if description provided
|
|
87
|
-
if (context.params.description || context.params.feature) {
|
|
88
|
-
steps.push({ step: 'Has feature description', passed: true })
|
|
89
|
-
} else {
|
|
90
|
-
steps.push({
|
|
91
|
-
step: 'Has feature description',
|
|
92
|
-
passed: false,
|
|
93
|
-
details: 'No description provided',
|
|
94
|
-
})
|
|
95
|
-
criticalIssues.push('Missing feature description')
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Check roadmap accessibility
|
|
99
|
-
if (state.analysis) {
|
|
100
|
-
steps.push({ step: 'Project analyzed', passed: true })
|
|
101
|
-
} else {
|
|
102
|
-
steps.push({ step: 'Project analyzed', passed: false, details: 'Run /p:sync first' })
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Plan
|
|
106
|
-
plan.push('Parse feature description')
|
|
107
|
-
plan.push('Generate tasks breakdown')
|
|
108
|
-
plan.push('Add to roadmap.md')
|
|
109
|
-
plan.push('Add tasks to next.md')
|
|
110
|
-
plan.push('Suggest starting first task')
|
|
111
|
-
break
|
|
112
|
-
|
|
113
|
-
case 'spec':
|
|
114
|
-
// Check if feature name provided
|
|
115
|
-
if (context.params.feature || context.params.name) {
|
|
116
|
-
steps.push({ step: 'Has spec name', passed: true })
|
|
117
|
-
} else {
|
|
118
|
-
steps.push({ step: 'Has spec name', passed: false, details: 'No spec name provided' })
|
|
119
|
-
criticalIssues.push('Missing spec name')
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Plan
|
|
123
|
-
plan.push('Generate spec template')
|
|
124
|
-
plan.push('Analyze requirements')
|
|
125
|
-
plan.push('Create spec file')
|
|
126
|
-
plan.push('Link to roadmap')
|
|
127
|
-
break
|
|
128
|
-
|
|
129
|
-
case 'cleanup':
|
|
130
|
-
// Check for analysis
|
|
131
|
-
if (state.analysis) {
|
|
132
|
-
steps.push({ step: 'Has code analysis', passed: true })
|
|
133
|
-
} else {
|
|
134
|
-
steps.push({ step: 'Has code analysis', passed: false, details: 'Run /p:analyze first' })
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Plan
|
|
138
|
-
plan.push('Scan for unused code')
|
|
139
|
-
plan.push('Identify dead imports')
|
|
140
|
-
plan.push('List files to clean')
|
|
141
|
-
plan.push('Show preview')
|
|
142
|
-
plan.push('Wait for approval')
|
|
143
|
-
plan.push('Execute cleanup')
|
|
144
|
-
break
|
|
145
|
-
|
|
146
|
-
case 'migrate':
|
|
147
|
-
// Always warn for migrate
|
|
148
|
-
steps.push({
|
|
149
|
-
step: 'Migration safety check',
|
|
150
|
-
passed: true,
|
|
151
|
-
details: 'Will require manual approval',
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
// Plan
|
|
155
|
-
plan.push('Analyze current state')
|
|
156
|
-
plan.push('Generate migration plan')
|
|
157
|
-
plan.push('Show affected files')
|
|
158
|
-
plan.push('Request approval')
|
|
159
|
-
plan.push('Execute migration')
|
|
160
|
-
plan.push('Verify results')
|
|
161
|
-
break
|
|
162
|
-
|
|
163
|
-
default:
|
|
164
|
-
// Generic plan
|
|
165
|
-
plan.push('Execute command')
|
|
166
|
-
break
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Calculate confidence
|
|
170
|
-
const passedSteps = steps.filter((s) => s.passed).length
|
|
171
|
-
const totalSteps = steps.length
|
|
172
|
-
const confidence = totalSteps > 0 ? passedSteps / totalSteps : 1
|
|
173
|
-
|
|
174
|
-
return {
|
|
175
|
-
commandName,
|
|
176
|
-
reasoning:
|
|
177
|
-
steps.length > 0
|
|
178
|
-
? {
|
|
179
|
-
steps,
|
|
180
|
-
allPassed: criticalIssues.length === 0,
|
|
181
|
-
criticalIssues,
|
|
182
|
-
}
|
|
183
|
-
: null,
|
|
184
|
-
plan,
|
|
185
|
-
confidence,
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Format reasoning plan for display
|
|
191
|
-
*/
|
|
192
|
-
function formatPlan(result: ReasoningResult): string {
|
|
193
|
-
const lines: string[] = []
|
|
194
|
-
|
|
195
|
-
lines.push(`📋 Chain of Thought: ${result.commandName}`)
|
|
196
|
-
lines.push('')
|
|
197
|
-
|
|
198
|
-
if (result.reasoning) {
|
|
199
|
-
lines.push('Steps:')
|
|
200
|
-
result.reasoning.steps.forEach((step) => {
|
|
201
|
-
const icon = step.passed ? '✅' : '❌'
|
|
202
|
-
lines.push(` ${icon} ${step.step}`)
|
|
203
|
-
if (step.details) {
|
|
204
|
-
lines.push(` ${step.details}`)
|
|
205
|
-
}
|
|
206
|
-
})
|
|
207
|
-
lines.push('')
|
|
208
|
-
|
|
209
|
-
if (result.reasoning.criticalIssues.length > 0) {
|
|
210
|
-
lines.push('Critical Issues:')
|
|
211
|
-
result.reasoning.criticalIssues.forEach((issue) => {
|
|
212
|
-
lines.push(` ⚠️ ${issue}`)
|
|
213
|
-
})
|
|
214
|
-
lines.push('')
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (result.plan.length > 0) {
|
|
219
|
-
lines.push('Plan:')
|
|
220
|
-
result.plan.forEach((step, i) => {
|
|
221
|
-
lines.push(` ${i + 1}. ${step}`)
|
|
222
|
-
})
|
|
223
|
-
lines.push('')
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
lines.push(`Confidence: ${Math.round(result.confidence * 100)}%`)
|
|
227
|
-
|
|
228
|
-
return lines.join('\n')
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
export { requiresReasoning, reason, formatPlan, REASONING_REQUIRED_COMMANDS }
|
|
232
|
-
|
|
233
|
-
const chainOfThought = { requiresReasoning, reason, formatPlan, REASONING_REQUIRED_COMMANDS }
|
|
234
|
-
export default chainOfThought
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command Classifier
|
|
3
|
-
*
|
|
4
|
-
* Classifies unknown commands by analyzing template metadata.
|
|
5
|
-
* When a command isn't in command-context.config.json, this module
|
|
6
|
-
* determines what context sections it needs based on template content.
|
|
7
|
-
*
|
|
8
|
-
* Classification chain:
|
|
9
|
-
* 1. Config lookup (instant) — handled by command-context.ts
|
|
10
|
-
* 2. Template heuristic (instant) — this module
|
|
11
|
-
* 3. Wildcard fallback — handled by command-context.ts
|
|
12
|
-
*
|
|
13
|
-
* @see PRJ-298
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import type { CommandContextEntry } from '../schemas/command-context'
|
|
17
|
-
import type { Template } from '../types'
|
|
18
|
-
|
|
19
|
-
// Keywords that indicate code-modifying commands
|
|
20
|
-
const CODE_KEYWORDS = [
|
|
21
|
-
'build',
|
|
22
|
-
'create',
|
|
23
|
-
'add',
|
|
24
|
-
'implement',
|
|
25
|
-
'fix',
|
|
26
|
-
'refactor',
|
|
27
|
-
'update',
|
|
28
|
-
'modify',
|
|
29
|
-
'change',
|
|
30
|
-
'write',
|
|
31
|
-
'generate',
|
|
32
|
-
'scaffold',
|
|
33
|
-
'migrate',
|
|
34
|
-
'optimize',
|
|
35
|
-
'improve',
|
|
36
|
-
'enhance',
|
|
37
|
-
'redesign',
|
|
38
|
-
'rewrite',
|
|
39
|
-
]
|
|
40
|
-
|
|
41
|
-
// Keywords that indicate read-only / info commands
|
|
42
|
-
const INFO_KEYWORDS = [
|
|
43
|
-
'list',
|
|
44
|
-
'show',
|
|
45
|
-
'get',
|
|
46
|
-
'status',
|
|
47
|
-
'info',
|
|
48
|
-
'check',
|
|
49
|
-
'view',
|
|
50
|
-
'display',
|
|
51
|
-
'describe',
|
|
52
|
-
'explain',
|
|
53
|
-
'analyze',
|
|
54
|
-
'report',
|
|
55
|
-
'dashboard',
|
|
56
|
-
]
|
|
57
|
-
|
|
58
|
-
// Keywords that indicate quality/verification commands
|
|
59
|
-
const QUALITY_KEYWORDS = [
|
|
60
|
-
'test',
|
|
61
|
-
'verify',
|
|
62
|
-
'validate',
|
|
63
|
-
'review',
|
|
64
|
-
'audit',
|
|
65
|
-
'check',
|
|
66
|
-
'lint',
|
|
67
|
-
'ship',
|
|
68
|
-
'deploy',
|
|
69
|
-
'release',
|
|
70
|
-
'complete',
|
|
71
|
-
'done',
|
|
72
|
-
'finish',
|
|
73
|
-
]
|
|
74
|
-
|
|
75
|
-
// Tools that indicate code modification
|
|
76
|
-
const CODE_TOOLS = ['Write', 'Edit', 'Bash']
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Count keyword matches using word boundaries to avoid substring false positives.
|
|
80
|
-
*/
|
|
81
|
-
function countMatches(text: string, keywords: string[]): number {
|
|
82
|
-
return keywords.filter((k) => new RegExp(`\\b${k}\\b`).test(text)).length
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Classify a command based on its template metadata.
|
|
87
|
-
* Analyzes the command name, description, allowed tools, and content
|
|
88
|
-
* to determine what context sections are relevant.
|
|
89
|
-
*
|
|
90
|
-
* Priority: code-modifying > quality/verification > info/read-only > default
|
|
91
|
-
*/
|
|
92
|
-
export function classifyCommand(commandName: string, template: Template): CommandContextEntry {
|
|
93
|
-
const description = (template.frontmatter?.description || '').toLowerCase()
|
|
94
|
-
const content = template.content.toLowerCase()
|
|
95
|
-
const allowedTools = template.frontmatter?.['allowed-tools'] || []
|
|
96
|
-
const combined = `${commandName} ${description} ${content}`
|
|
97
|
-
|
|
98
|
-
const codeScore = countMatches(combined, CODE_KEYWORDS)
|
|
99
|
-
const infoScore = countMatches(combined, INFO_KEYWORDS)
|
|
100
|
-
const qualityScore = countMatches(combined, QUALITY_KEYWORDS)
|
|
101
|
-
const hasCodeTools = allowedTools.some((t: string) => CODE_TOOLS.includes(t))
|
|
102
|
-
|
|
103
|
-
// Code-modifying command: needs agents + patterns + checklists
|
|
104
|
-
if (hasCodeTools && codeScore > 0) {
|
|
105
|
-
return {
|
|
106
|
-
agents: true,
|
|
107
|
-
patterns: true,
|
|
108
|
-
checklist: qualityScore > 0,
|
|
109
|
-
modules: [],
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Quality/verification command: needs patterns + checklists
|
|
114
|
-
// Quality takes priority over info when quality score is higher
|
|
115
|
-
if (qualityScore > 0 && qualityScore >= infoScore) {
|
|
116
|
-
return {
|
|
117
|
-
agents: false,
|
|
118
|
-
patterns: true,
|
|
119
|
-
checklist: true,
|
|
120
|
-
modules: [],
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Info/read-only command: needs nothing
|
|
125
|
-
if (infoScore > 0 && codeScore === 0) {
|
|
126
|
-
return {
|
|
127
|
-
agents: false,
|
|
128
|
-
patterns: false,
|
|
129
|
-
checklist: false,
|
|
130
|
-
modules: [],
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Default for unknown: agents + patterns (sensible default)
|
|
135
|
-
return {
|
|
136
|
-
agents: true,
|
|
137
|
-
patterns: true,
|
|
138
|
-
checklist: false,
|
|
139
|
-
modules: [],
|
|
140
|
-
}
|
|
141
|
-
}
|