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,341 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI Tool Formatters
|
|
3
|
-
*
|
|
4
|
-
* Each AI tool has different context preferences:
|
|
5
|
-
* - Claude Code: Detailed markdown with sections
|
|
6
|
-
* - Cursor: Concise rules format
|
|
7
|
-
* - Copilot: Minimal bullet points
|
|
8
|
-
* - Windsurf: Similar to Cursor
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { type ContextSources, cite, defaultSources } from '../utils/citations'
|
|
12
|
-
import type { AIToolConfig } from './registry'
|
|
13
|
-
|
|
14
|
-
export interface ProjectContext {
|
|
15
|
-
projectId: string
|
|
16
|
-
name: string
|
|
17
|
-
version: string
|
|
18
|
-
ecosystem: string
|
|
19
|
-
projectType: string
|
|
20
|
-
languages: string[]
|
|
21
|
-
frameworks: string[]
|
|
22
|
-
repoPath: string
|
|
23
|
-
branch: string
|
|
24
|
-
fileCount: number
|
|
25
|
-
commits: number
|
|
26
|
-
hasChanges: boolean
|
|
27
|
-
commands: {
|
|
28
|
-
install: string
|
|
29
|
-
dev: string
|
|
30
|
-
test: string
|
|
31
|
-
build: string
|
|
32
|
-
lint: string
|
|
33
|
-
format: string
|
|
34
|
-
}
|
|
35
|
-
agents: {
|
|
36
|
-
workflow: string[]
|
|
37
|
-
domain: string[]
|
|
38
|
-
}
|
|
39
|
-
sources?: ContextSources
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Format context for Claude Code (CLAUDE.md)
|
|
44
|
-
* Detailed markdown with full context
|
|
45
|
-
*/
|
|
46
|
-
export function formatForClaude(ctx: ProjectContext, _config: AIToolConfig): string {
|
|
47
|
-
const s = ctx.sources || defaultSources()
|
|
48
|
-
|
|
49
|
-
return `# ${ctx.name} - Project Rules
|
|
50
|
-
<!-- projectId: ${ctx.projectId} -->
|
|
51
|
-
<!-- Generated: ${new Date().toISOString()} -->
|
|
52
|
-
<!-- Ecosystem: ${ctx.ecosystem} | Type: ${ctx.projectType} -->
|
|
53
|
-
|
|
54
|
-
## THIS PROJECT (${ctx.ecosystem})
|
|
55
|
-
|
|
56
|
-
${cite(s.ecosystem)}
|
|
57
|
-
**Type:** ${ctx.projectType}
|
|
58
|
-
**Path:** ${ctx.repoPath}
|
|
59
|
-
|
|
60
|
-
### Commands (USE THESE, NOT OTHERS)
|
|
61
|
-
|
|
62
|
-
${cite(s.commands)}
|
|
63
|
-
| Action | Command |
|
|
64
|
-
|--------|---------|
|
|
65
|
-
| Install dependencies | \`${ctx.commands.install}\` |
|
|
66
|
-
| Run dev server | \`${ctx.commands.dev}\` |
|
|
67
|
-
| Run tests | \`${ctx.commands.test}\` |
|
|
68
|
-
| Build | \`${ctx.commands.build}\` |
|
|
69
|
-
| Lint | \`${ctx.commands.lint}\` |
|
|
70
|
-
| Format | \`${ctx.commands.format}\` |
|
|
71
|
-
|
|
72
|
-
### Code Conventions
|
|
73
|
-
|
|
74
|
-
${cite(s.languages)}
|
|
75
|
-
- **Languages**: ${ctx.languages.join(', ') || 'Not detected'}
|
|
76
|
-
${cite(s.frameworks)}
|
|
77
|
-
- **Frameworks**: ${ctx.frameworks.join(', ') || 'Not detected'}
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## PRJCT RULES
|
|
82
|
-
|
|
83
|
-
### Path Resolution
|
|
84
|
-
**ALL prjct writes go to**: \`~/.prjct-cli/projects/${ctx.projectId}/\`
|
|
85
|
-
- NEVER write to \`.prjct/\`
|
|
86
|
-
- NEVER write to \`./\` for prjct data
|
|
87
|
-
|
|
88
|
-
### Workflow
|
|
89
|
-
\`\`\`
|
|
90
|
-
p. sync → p. task "desc" → [work] → p. done → p. ship
|
|
91
|
-
\`\`\`
|
|
92
|
-
|
|
93
|
-
| Command | Action |
|
|
94
|
-
|---------|--------|
|
|
95
|
-
| \`p. sync\` | Re-analyze project |
|
|
96
|
-
| \`p. task X\` | Start task |
|
|
97
|
-
| \`p. done\` | Complete subtask |
|
|
98
|
-
| \`p. ship X\` | Ship feature |
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## PROJECT STATE
|
|
103
|
-
|
|
104
|
-
${cite(s.name)}
|
|
105
|
-
| Field | Value |
|
|
106
|
-
|-------|-------|
|
|
107
|
-
| Name | ${ctx.name} |
|
|
108
|
-
| Version | ${ctx.version} |
|
|
109
|
-
| Ecosystem | ${ctx.ecosystem} |
|
|
110
|
-
| Branch | ${ctx.branch} |
|
|
111
|
-
| Files | ~${ctx.fileCount} |
|
|
112
|
-
| Commits | ${ctx.commits} |
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## AGENTS
|
|
117
|
-
|
|
118
|
-
Load from \`~/.prjct-cli/projects/${ctx.projectId}/agents/\`:
|
|
119
|
-
|
|
120
|
-
**Workflow**: ${ctx.agents.workflow.join(', ')}
|
|
121
|
-
**Domain**: ${ctx.agents.domain.join(', ') || 'none'}
|
|
122
|
-
`
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Format context for Cursor (.cursor/rules/prjct.mdc)
|
|
127
|
-
* MDC format with YAML frontmatter, optimized for inline suggestions
|
|
128
|
-
*
|
|
129
|
-
* @see https://cursor.com/docs/context/rules
|
|
130
|
-
*/
|
|
131
|
-
export function formatForCursor(ctx: ProjectContext, _config: AIToolConfig): string {
|
|
132
|
-
const s = ctx.sources || defaultSources()
|
|
133
|
-
const lines: string[] = []
|
|
134
|
-
|
|
135
|
-
// MDC format with YAML frontmatter
|
|
136
|
-
lines.push('---')
|
|
137
|
-
lines.push(`description: prjct context for ${ctx.name}`)
|
|
138
|
-
lines.push('globs:')
|
|
139
|
-
lines.push('alwaysApply: true')
|
|
140
|
-
lines.push('---')
|
|
141
|
-
lines.push('')
|
|
142
|
-
|
|
143
|
-
// Project identity
|
|
144
|
-
lines.push(`You are working on ${ctx.name}, a ${ctx.projectType} ${ctx.ecosystem} project.`)
|
|
145
|
-
lines.push('')
|
|
146
|
-
|
|
147
|
-
// Tech stack
|
|
148
|
-
lines.push(cite(s.languages))
|
|
149
|
-
lines.push('## Tech Stack')
|
|
150
|
-
if (ctx.languages.length > 0) {
|
|
151
|
-
lines.push(`- Languages: ${ctx.languages.join(', ')}`)
|
|
152
|
-
}
|
|
153
|
-
if (ctx.frameworks.length > 0) {
|
|
154
|
-
lines.push(`- Frameworks: ${ctx.frameworks.join(', ')}`)
|
|
155
|
-
}
|
|
156
|
-
lines.push('')
|
|
157
|
-
|
|
158
|
-
// Commands
|
|
159
|
-
lines.push(cite(s.commands))
|
|
160
|
-
lines.push('## Commands')
|
|
161
|
-
lines.push(`- Install: \`${ctx.commands.install}\``)
|
|
162
|
-
lines.push(`- Dev: \`${ctx.commands.dev}\``)
|
|
163
|
-
lines.push(`- Test: \`${ctx.commands.test}\``)
|
|
164
|
-
lines.push(`- Build: \`${ctx.commands.build}\``)
|
|
165
|
-
lines.push('')
|
|
166
|
-
|
|
167
|
-
// Code style - language agnostic
|
|
168
|
-
lines.push('## Code Style')
|
|
169
|
-
lines.push(`- Follow ${ctx.ecosystem} conventions`)
|
|
170
|
-
lines.push('- Match existing code patterns in this project')
|
|
171
|
-
lines.push('- Use idiomatic constructs for the language')
|
|
172
|
-
lines.push('')
|
|
173
|
-
|
|
174
|
-
// Best practices
|
|
175
|
-
lines.push('## Best Practices')
|
|
176
|
-
lines.push('- Write clean, readable code')
|
|
177
|
-
lines.push('- Add comments only for complex logic')
|
|
178
|
-
lines.push('- Keep functions small and focused')
|
|
179
|
-
lines.push('- Handle errors appropriately')
|
|
180
|
-
lines.push('- Write tests for new functionality')
|
|
181
|
-
|
|
182
|
-
return lines.join('\n')
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Format context for GitHub Copilot (.github/copilot-instructions.md)
|
|
187
|
-
* Minimal bullet points
|
|
188
|
-
*/
|
|
189
|
-
export function formatForCopilot(ctx: ProjectContext, _config: AIToolConfig): string {
|
|
190
|
-
const s = ctx.sources || defaultSources()
|
|
191
|
-
const lines: string[] = []
|
|
192
|
-
|
|
193
|
-
lines.push('# Copilot Instructions')
|
|
194
|
-
lines.push('')
|
|
195
|
-
lines.push(`This is ${ctx.name}, a ${ctx.ecosystem} project.`)
|
|
196
|
-
lines.push('')
|
|
197
|
-
|
|
198
|
-
// Key info
|
|
199
|
-
lines.push(cite(s.ecosystem))
|
|
200
|
-
lines.push('## Project Info')
|
|
201
|
-
lines.push(`- Type: ${ctx.projectType}`)
|
|
202
|
-
lines.push(`- Stack: ${ctx.frameworks.join(', ') || ctx.ecosystem}`)
|
|
203
|
-
lines.push('')
|
|
204
|
-
|
|
205
|
-
// Conventions
|
|
206
|
-
lines.push('## Conventions')
|
|
207
|
-
lines.push(`- Follow ${ctx.ecosystem} conventions`)
|
|
208
|
-
lines.push('- Match existing code patterns')
|
|
209
|
-
lines.push('- Keep code clean and readable')
|
|
210
|
-
lines.push('')
|
|
211
|
-
|
|
212
|
-
// Commands
|
|
213
|
-
lines.push(cite(s.commands))
|
|
214
|
-
lines.push('## Commands')
|
|
215
|
-
lines.push(`- Test: \`${ctx.commands.test}\``)
|
|
216
|
-
lines.push(`- Build: \`${ctx.commands.build}\``)
|
|
217
|
-
|
|
218
|
-
return lines.join('\n')
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Format context for Windsurf (.windsurf/rules/prjct.md)
|
|
223
|
-
* MD format with YAML frontmatter, optimized for Cascade AI
|
|
224
|
-
*
|
|
225
|
-
* @see https://docs.windsurf.com/windsurf/cascade/memories
|
|
226
|
-
*/
|
|
227
|
-
export function formatForWindsurf(ctx: ProjectContext, _config: AIToolConfig): string {
|
|
228
|
-
const s = ctx.sources || defaultSources()
|
|
229
|
-
const lines: string[] = []
|
|
230
|
-
|
|
231
|
-
// YAML frontmatter (Windsurf uses trigger: always_on instead of alwaysApply)
|
|
232
|
-
lines.push('---')
|
|
233
|
-
lines.push(`description: prjct context for ${ctx.name}`)
|
|
234
|
-
lines.push('trigger: always_on')
|
|
235
|
-
lines.push('---')
|
|
236
|
-
lines.push('')
|
|
237
|
-
|
|
238
|
-
// Project identity
|
|
239
|
-
lines.push(`# ${ctx.name}`)
|
|
240
|
-
lines.push('')
|
|
241
|
-
lines.push(`${ctx.projectType} project using ${ctx.ecosystem}.`)
|
|
242
|
-
lines.push('')
|
|
243
|
-
|
|
244
|
-
// Tech stack (concise)
|
|
245
|
-
lines.push(cite(s.languages))
|
|
246
|
-
lines.push('## Stack')
|
|
247
|
-
lines.push(`- ${ctx.languages.join(', ')}`)
|
|
248
|
-
if (ctx.frameworks.length > 0) {
|
|
249
|
-
lines.push(`- ${ctx.frameworks.join(', ')}`)
|
|
250
|
-
}
|
|
251
|
-
lines.push('')
|
|
252
|
-
|
|
253
|
-
// Commands (essential only)
|
|
254
|
-
lines.push(cite(s.commands))
|
|
255
|
-
lines.push('## Commands')
|
|
256
|
-
lines.push('```bash')
|
|
257
|
-
lines.push(`# Install`)
|
|
258
|
-
lines.push(ctx.commands.install)
|
|
259
|
-
lines.push(`# Dev`)
|
|
260
|
-
lines.push(ctx.commands.dev)
|
|
261
|
-
lines.push(`# Test`)
|
|
262
|
-
lines.push(ctx.commands.test)
|
|
263
|
-
lines.push(`# Build`)
|
|
264
|
-
lines.push(ctx.commands.build)
|
|
265
|
-
lines.push('```')
|
|
266
|
-
lines.push('')
|
|
267
|
-
|
|
268
|
-
// Code style - language agnostic
|
|
269
|
-
lines.push('## Rules')
|
|
270
|
-
lines.push(`- Follow ${ctx.ecosystem} conventions`)
|
|
271
|
-
lines.push('- Match existing project patterns')
|
|
272
|
-
lines.push('- Clean code, minimal comments')
|
|
273
|
-
lines.push('- Test new functionality')
|
|
274
|
-
|
|
275
|
-
return lines.join('\n')
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Format context for Continue.dev (.continue/config.json)
|
|
280
|
-
* JSON config with system message and context providers
|
|
281
|
-
*/
|
|
282
|
-
export function formatForContinue(ctx: ProjectContext, _config: AIToolConfig): string {
|
|
283
|
-
const systemMessage = [
|
|
284
|
-
`You are working on ${ctx.name}, a ${ctx.projectType} ${ctx.ecosystem} project.`,
|
|
285
|
-
'',
|
|
286
|
-
`Stack: ${ctx.languages.join(', ')}${ctx.frameworks.length > 0 ? ` with ${ctx.frameworks.join(', ')}` : ''}`,
|
|
287
|
-
'',
|
|
288
|
-
'Commands:',
|
|
289
|
-
`- Install: ${ctx.commands.install}`,
|
|
290
|
-
`- Dev: ${ctx.commands.dev}`,
|
|
291
|
-
`- Test: ${ctx.commands.test}`,
|
|
292
|
-
`- Build: ${ctx.commands.build}`,
|
|
293
|
-
'',
|
|
294
|
-
`Follow ${ctx.ecosystem} conventions. Match existing code patterns.`,
|
|
295
|
-
].join('\n')
|
|
296
|
-
|
|
297
|
-
const continueConfig = {
|
|
298
|
-
systemMessage,
|
|
299
|
-
models: [],
|
|
300
|
-
contextProviders: [
|
|
301
|
-
{ name: 'code' },
|
|
302
|
-
{ name: 'docs' },
|
|
303
|
-
{ name: 'diff' },
|
|
304
|
-
{ name: 'terminal' },
|
|
305
|
-
{ name: 'problems' },
|
|
306
|
-
{ name: 'folder' },
|
|
307
|
-
{ name: 'codebase' },
|
|
308
|
-
],
|
|
309
|
-
slashCommands: [
|
|
310
|
-
{ name: 'edit', description: 'Edit selected code' },
|
|
311
|
-
{ name: 'comment', description: 'Add comments to code' },
|
|
312
|
-
{ name: 'share', description: 'Export conversation' },
|
|
313
|
-
{ name: 'cmd', description: 'Run terminal command' },
|
|
314
|
-
],
|
|
315
|
-
customCommands: [
|
|
316
|
-
{
|
|
317
|
-
name: 'test',
|
|
318
|
-
prompt: `Write tests for the selected code. Use the project's testing conventions. Test command: ${ctx.commands.test}`,
|
|
319
|
-
},
|
|
320
|
-
],
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return JSON.stringify(continueConfig, null, 2)
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Get formatter function for a tool
|
|
328
|
-
*/
|
|
329
|
-
export function getFormatter(
|
|
330
|
-
toolId: string
|
|
331
|
-
): ((ctx: ProjectContext, config: AIToolConfig) => string) | null {
|
|
332
|
-
const formatters: Record<string, (ctx: ProjectContext, config: AIToolConfig) => string> = {
|
|
333
|
-
claude: formatForClaude,
|
|
334
|
-
cursor: formatForCursor,
|
|
335
|
-
copilot: formatForCopilot,
|
|
336
|
-
windsurf: formatForWindsurf,
|
|
337
|
-
continue: formatForContinue,
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return formatters[toolId] || null
|
|
341
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI Tools Context Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates optimized context files for each AI coding tool.
|
|
5
|
-
* Each tool gets context in its preferred format.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import fs from 'node:fs/promises'
|
|
9
|
-
import path from 'node:path'
|
|
10
|
-
import { getErrorMessage } from '../types/fs'
|
|
11
|
-
import { mergePreservedSections, validatePreserveBlocks } from '../utils/preserve-sections'
|
|
12
|
-
import { getFormatter, type ProjectContext } from './formatters'
|
|
13
|
-
import { AI_TOOLS, type AIToolConfig, DEFAULT_AI_TOOLS, getAIToolConfig } from './registry'
|
|
14
|
-
|
|
15
|
-
export interface GenerateResult {
|
|
16
|
-
toolId: string
|
|
17
|
-
outputFile: string
|
|
18
|
-
outputPath: string
|
|
19
|
-
success: boolean
|
|
20
|
-
error?: string
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Generate context files for specified AI tools
|
|
25
|
-
*/
|
|
26
|
-
export async function generateAIToolContexts(
|
|
27
|
-
context: ProjectContext,
|
|
28
|
-
globalPath: string,
|
|
29
|
-
repoPath: string,
|
|
30
|
-
toolIds: string[] = DEFAULT_AI_TOOLS
|
|
31
|
-
): Promise<GenerateResult[]> {
|
|
32
|
-
const results: GenerateResult[] = []
|
|
33
|
-
|
|
34
|
-
for (const toolId of toolIds) {
|
|
35
|
-
const config = getAIToolConfig(toolId)
|
|
36
|
-
if (!config) {
|
|
37
|
-
results.push({
|
|
38
|
-
toolId,
|
|
39
|
-
outputFile: '',
|
|
40
|
-
outputPath: '',
|
|
41
|
-
success: false,
|
|
42
|
-
error: `Unknown tool: ${toolId}`,
|
|
43
|
-
})
|
|
44
|
-
continue
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const result = await generateForTool(context, config, globalPath, repoPath)
|
|
48
|
-
results.push(result)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return results
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Generate context for a single AI tool
|
|
56
|
-
*/
|
|
57
|
-
async function generateForTool(
|
|
58
|
-
context: ProjectContext,
|
|
59
|
-
config: AIToolConfig,
|
|
60
|
-
globalPath: string,
|
|
61
|
-
repoPath: string
|
|
62
|
-
): Promise<GenerateResult> {
|
|
63
|
-
const formatter = getFormatter(config.id)
|
|
64
|
-
if (!formatter) {
|
|
65
|
-
return {
|
|
66
|
-
toolId: config.id,
|
|
67
|
-
outputFile: config.outputFile,
|
|
68
|
-
outputPath: '',
|
|
69
|
-
success: false,
|
|
70
|
-
error: `No formatter for: ${config.id}`,
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
// Generate content
|
|
76
|
-
let content = formatter(context, config)
|
|
77
|
-
|
|
78
|
-
// Determine output path
|
|
79
|
-
let outputPath: string
|
|
80
|
-
if (config.outputPath === 'repo') {
|
|
81
|
-
outputPath = path.join(repoPath, config.outputFile)
|
|
82
|
-
} else {
|
|
83
|
-
outputPath = path.join(globalPath, 'context', config.outputFile)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Ensure directory exists
|
|
87
|
-
await fs.mkdir(path.dirname(outputPath), { recursive: true })
|
|
88
|
-
|
|
89
|
-
// Read existing file to preserve user customizations
|
|
90
|
-
try {
|
|
91
|
-
const existingContent = await fs.readFile(outputPath, 'utf-8')
|
|
92
|
-
|
|
93
|
-
// Validate existing preserved blocks
|
|
94
|
-
const validation = validatePreserveBlocks(existingContent)
|
|
95
|
-
if (!validation.valid) {
|
|
96
|
-
console.warn(`⚠️ ${config.outputFile} has invalid preserve blocks:`)
|
|
97
|
-
for (const error of validation.errors) {
|
|
98
|
-
console.warn(` ${error}`)
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
content = mergePreservedSections(content, existingContent)
|
|
103
|
-
} catch {
|
|
104
|
-
// File doesn't exist yet - use generated content as-is
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Write file
|
|
108
|
-
await fs.writeFile(outputPath, content, 'utf-8')
|
|
109
|
-
|
|
110
|
-
return {
|
|
111
|
-
toolId: config.id,
|
|
112
|
-
outputFile: config.outputFile,
|
|
113
|
-
outputPath,
|
|
114
|
-
success: true,
|
|
115
|
-
}
|
|
116
|
-
} catch (error) {
|
|
117
|
-
return {
|
|
118
|
-
toolId: config.id,
|
|
119
|
-
outputFile: config.outputFile,
|
|
120
|
-
outputPath: '',
|
|
121
|
-
success: false,
|
|
122
|
-
error: getErrorMessage(error),
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Get list of files that would be generated
|
|
129
|
-
*/
|
|
130
|
-
export function getOutputFiles(
|
|
131
|
-
toolIds: string[] = DEFAULT_AI_TOOLS
|
|
132
|
-
): { toolId: string; file: string; location: 'repo' | 'global' }[] {
|
|
133
|
-
return toolIds
|
|
134
|
-
.map((id) => {
|
|
135
|
-
const config = AI_TOOLS[id]
|
|
136
|
-
if (!config) return null
|
|
137
|
-
return {
|
|
138
|
-
toolId: id,
|
|
139
|
-
file: config.outputFile,
|
|
140
|
-
location: config.outputPath,
|
|
141
|
-
}
|
|
142
|
-
})
|
|
143
|
-
.filter((item): item is NonNullable<typeof item> => item !== null)
|
|
144
|
-
}
|
package/core/ai-tools/index.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI Tools Module
|
|
3
|
-
*
|
|
4
|
-
* Multi-agent context generation for AI coding tools.
|
|
5
|
-
* Supports: Claude Code, Cursor, Copilot, Windsurf, Continue.dev
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Auto-detection of installed tools
|
|
9
|
-
* - Language-agnostic formatters
|
|
10
|
-
* - Tool-specific output formats
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
export * from './formatters'
|
|
14
|
-
export * from './generator'
|
|
15
|
-
export * from './registry'
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI Tools Registry
|
|
3
|
-
*
|
|
4
|
-
* Registry of AI coding tools (Claude Code, Cursor, Copilot, etc.)
|
|
5
|
-
* Each tool has its own context file format and token budget.
|
|
6
|
-
*
|
|
7
|
-
* Phase 1: Claude Code + Cursor
|
|
8
|
-
* Phase 2: + Copilot + Windsurf
|
|
9
|
-
* Phase 3: + Continue.dev + Auto-detection
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { exec } from 'node:child_process'
|
|
13
|
-
import os from 'node:os'
|
|
14
|
-
import path from 'node:path'
|
|
15
|
-
import { promisify } from 'node:util'
|
|
16
|
-
import type { AIToolConfig } from '../types'
|
|
17
|
-
import { fileExists } from '../utils/fs-helpers'
|
|
18
|
-
|
|
19
|
-
const execAsync = promisify(exec)
|
|
20
|
-
|
|
21
|
-
export type { AIToolConfig } from '../types'
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Supported AI tools registry
|
|
25
|
-
*/
|
|
26
|
-
export const AI_TOOLS: Record<string, AIToolConfig> = {
|
|
27
|
-
claude: {
|
|
28
|
-
id: 'claude',
|
|
29
|
-
name: 'Claude Code',
|
|
30
|
-
outputFile: 'CLAUDE.md',
|
|
31
|
-
outputPath: 'global',
|
|
32
|
-
maxTokens: 6000,
|
|
33
|
-
format: 'detailed',
|
|
34
|
-
description: 'Anthropic Claude Code CLI',
|
|
35
|
-
},
|
|
36
|
-
cursor: {
|
|
37
|
-
id: 'cursor',
|
|
38
|
-
name: 'Cursor',
|
|
39
|
-
outputFile: '.cursor/rules/prjct.mdc',
|
|
40
|
-
outputPath: 'repo',
|
|
41
|
-
maxTokens: 2000,
|
|
42
|
-
format: 'concise',
|
|
43
|
-
description: 'Cursor AI Editor',
|
|
44
|
-
},
|
|
45
|
-
copilot: {
|
|
46
|
-
id: 'copilot',
|
|
47
|
-
name: 'GitHub Copilot',
|
|
48
|
-
outputFile: '.github/copilot-instructions.md',
|
|
49
|
-
outputPath: 'repo',
|
|
50
|
-
maxTokens: 1500,
|
|
51
|
-
format: 'minimal',
|
|
52
|
-
description: 'GitHub Copilot',
|
|
53
|
-
},
|
|
54
|
-
windsurf: {
|
|
55
|
-
id: 'windsurf',
|
|
56
|
-
name: 'Windsurf',
|
|
57
|
-
outputFile: '.windsurf/rules/prjct.md',
|
|
58
|
-
outputPath: 'repo',
|
|
59
|
-
maxTokens: 2000,
|
|
60
|
-
format: 'concise',
|
|
61
|
-
description: 'Codeium Windsurf Editor',
|
|
62
|
-
},
|
|
63
|
-
continue: {
|
|
64
|
-
id: 'continue',
|
|
65
|
-
name: 'Continue.dev',
|
|
66
|
-
outputFile: '.continue/config.json',
|
|
67
|
-
outputPath: 'repo',
|
|
68
|
-
maxTokens: 1500,
|
|
69
|
-
format: 'json',
|
|
70
|
-
description: 'Continue.dev open-source AI assistant',
|
|
71
|
-
},
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Default tools to generate
|
|
76
|
-
* CLI tools only - IDE tools (cursor, windsurf, copilot) are OPT-IN
|
|
77
|
-
* Use --editors flag or "all" to include IDE tools
|
|
78
|
-
*/
|
|
79
|
-
export const DEFAULT_AI_TOOLS = ['claude']
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* IDE tools - require explicit opt-in (--editors flag)
|
|
83
|
-
*/
|
|
84
|
-
export const IDE_AI_TOOLS = ['cursor', 'windsurf', 'copilot', 'continue']
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* All supported tool IDs
|
|
88
|
-
*/
|
|
89
|
-
export const SUPPORTED_AI_TOOLS = Object.keys(AI_TOOLS)
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Get tool config by ID
|
|
93
|
-
*/
|
|
94
|
-
export function getAIToolConfig(id: string): AIToolConfig | null {
|
|
95
|
-
return AI_TOOLS[id] || null
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Parse --agents flag value
|
|
100
|
-
* Examples: "claude,cursor" or "all"
|
|
101
|
-
*/
|
|
102
|
-
export function parseAgentsFlag(value: string): string[] {
|
|
103
|
-
if (value === 'all') {
|
|
104
|
-
return SUPPORTED_AI_TOOLS
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const requested = value.split(',').map((s) => s.trim().toLowerCase())
|
|
108
|
-
return requested.filter((id) => AI_TOOLS[id])
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Validate tool IDs
|
|
113
|
-
*/
|
|
114
|
-
export function validateToolIds(ids: string[]): { valid: string[]; invalid: string[] } {
|
|
115
|
-
const valid: string[] = []
|
|
116
|
-
const invalid: string[] = []
|
|
117
|
-
|
|
118
|
-
for (const id of ids) {
|
|
119
|
-
if (AI_TOOLS[id]) {
|
|
120
|
-
valid.push(id)
|
|
121
|
-
} else {
|
|
122
|
-
invalid.push(id)
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return { valid, invalid }
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Check if a command exists in PATH
|
|
131
|
-
*/
|
|
132
|
-
async function commandExists(cmd: string): Promise<boolean> {
|
|
133
|
-
try {
|
|
134
|
-
await execAsync(`which ${cmd}`)
|
|
135
|
-
return true
|
|
136
|
-
} catch {
|
|
137
|
-
return false
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Detect installed AI tools
|
|
143
|
-
* Returns list of tool IDs that are detected on the system
|
|
144
|
-
*/
|
|
145
|
-
export async function detectInstalledTools(repoPath: string = process.cwd()): Promise<string[]> {
|
|
146
|
-
const detected: string[] = []
|
|
147
|
-
|
|
148
|
-
// Claude Code: check for 'claude' command
|
|
149
|
-
if (await commandExists('claude')) {
|
|
150
|
-
detected.push('claude')
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Cursor: check for command or .cursor/ directory in repo
|
|
154
|
-
if ((await commandExists('cursor')) || (await fileExists(path.join(repoPath, '.cursor')))) {
|
|
155
|
-
detected.push('cursor')
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Copilot: check for .github/ directory (likely has Copilot if using GitHub)
|
|
159
|
-
if (await fileExists(path.join(repoPath, '.github'))) {
|
|
160
|
-
detected.push('copilot')
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Windsurf: check for command or .windsurf/ directory
|
|
164
|
-
if ((await commandExists('windsurf')) || (await fileExists(path.join(repoPath, '.windsurf')))) {
|
|
165
|
-
detected.push('windsurf')
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Continue.dev: check for .continue/ directory
|
|
169
|
-
if (
|
|
170
|
-
(await fileExists(path.join(repoPath, '.continue'))) ||
|
|
171
|
-
(await fileExists(path.join(os.homedir(), '.continue')))
|
|
172
|
-
) {
|
|
173
|
-
detected.push('continue')
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return detected
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Get tools to generate based on mode
|
|
181
|
-
* - 'auto': detect installed tools
|
|
182
|
-
* - 'all': all supported tools
|
|
183
|
-
* - specific: use provided list
|
|
184
|
-
*/
|
|
185
|
-
export async function resolveToolIds(
|
|
186
|
-
mode: 'auto' | 'all' | string[],
|
|
187
|
-
repoPath: string = process.cwd()
|
|
188
|
-
): Promise<string[]> {
|
|
189
|
-
if (mode === 'auto') {
|
|
190
|
-
const detected = await detectInstalledTools(repoPath)
|
|
191
|
-
// Always include claude if nothing detected (safe default)
|
|
192
|
-
return detected.length > 0 ? detected : ['claude']
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (mode === 'all') {
|
|
196
|
-
return SUPPORTED_AI_TOOLS
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Specific list provided
|
|
200
|
-
return mode.filter((id) => AI_TOOLS[id])
|
|
201
|
-
}
|