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,286 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Issue Tracker Manager
|
|
3
|
-
* Orchestrates multiple issue tracker providers and enrichment.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { getErrorMessage } from '../../types/fs'
|
|
7
|
-
import { jiraProvider } from '../jira/client'
|
|
8
|
-
import { linearProvider } from '../linear/client'
|
|
9
|
-
import {
|
|
10
|
-
buildEnrichedIssue,
|
|
11
|
-
type EnrichmentResult,
|
|
12
|
-
formatEnrichmentAsMarkdown,
|
|
13
|
-
generateEnrichmentPrompt,
|
|
14
|
-
generateQuickEnrichment,
|
|
15
|
-
type ProjectContext,
|
|
16
|
-
} from './enricher'
|
|
17
|
-
import type {
|
|
18
|
-
CreateIssueInput,
|
|
19
|
-
EnrichedIssue,
|
|
20
|
-
FetchOptions,
|
|
21
|
-
Issue,
|
|
22
|
-
IssueProvider,
|
|
23
|
-
IssueTrackerConfig,
|
|
24
|
-
IssueTrackerProvider,
|
|
25
|
-
SyncResult,
|
|
26
|
-
} from './types'
|
|
27
|
-
|
|
28
|
-
// =============================================================================
|
|
29
|
-
// Manager Class
|
|
30
|
-
// =============================================================================
|
|
31
|
-
|
|
32
|
-
export class IssueTrackerManager {
|
|
33
|
-
private providers: Map<IssueProvider, IssueTrackerProvider> = new Map()
|
|
34
|
-
private activeProvider: IssueTrackerProvider | null = null
|
|
35
|
-
private config: IssueTrackerConfig | null = null
|
|
36
|
-
|
|
37
|
-
constructor() {
|
|
38
|
-
// Register available providers
|
|
39
|
-
this.providers.set('linear', linearProvider)
|
|
40
|
-
this.providers.set('jira', jiraProvider)
|
|
41
|
-
// Future: this.providers.set('monday', mondayProvider)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Initialize manager with config
|
|
46
|
-
*/
|
|
47
|
-
async initialize(config: IssueTrackerConfig): Promise<void> {
|
|
48
|
-
this.config = config
|
|
49
|
-
|
|
50
|
-
if (!config.enabled) {
|
|
51
|
-
console.log('[issue-tracker] Integration disabled')
|
|
52
|
-
return
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const provider = this.providers.get(config.provider)
|
|
56
|
-
if (!provider) {
|
|
57
|
-
throw new Error(`Unknown issue tracker provider: ${config.provider}`)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
await provider.initialize(config)
|
|
61
|
-
this.activeProvider = provider
|
|
62
|
-
|
|
63
|
-
console.log(`[issue-tracker] Initialized ${provider.displayName}`)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Check if manager is ready
|
|
68
|
-
*/
|
|
69
|
-
isReady(): boolean {
|
|
70
|
-
return this.activeProvider?.isConfigured() === true
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Get the active provider
|
|
75
|
-
*/
|
|
76
|
-
getProvider(): IssueTrackerProvider | null {
|
|
77
|
-
return this.activeProvider
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Get provider name
|
|
82
|
-
*/
|
|
83
|
-
getProviderName(): string {
|
|
84
|
-
return this.activeProvider?.displayName || 'None'
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// ===========================================================================
|
|
88
|
-
// Issue Operations
|
|
89
|
-
// ===========================================================================
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Fetch assigned issues
|
|
93
|
-
*/
|
|
94
|
-
async fetchAssignedIssues(options?: FetchOptions): Promise<Issue[]> {
|
|
95
|
-
if (!this.activeProvider) {
|
|
96
|
-
throw new Error('No issue tracker configured')
|
|
97
|
-
}
|
|
98
|
-
return this.activeProvider.fetchAssignedIssues(options)
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Fetch single issue
|
|
103
|
-
*/
|
|
104
|
-
async fetchIssue(id: string): Promise<Issue | null> {
|
|
105
|
-
if (!this.activeProvider) {
|
|
106
|
-
throw new Error('No issue tracker configured')
|
|
107
|
-
}
|
|
108
|
-
return this.activeProvider.fetchIssue(id)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Create issue
|
|
113
|
-
*/
|
|
114
|
-
async createIssue(input: CreateIssueInput): Promise<Issue> {
|
|
115
|
-
if (!this.activeProvider) {
|
|
116
|
-
throw new Error('No issue tracker configured')
|
|
117
|
-
}
|
|
118
|
-
return this.activeProvider.createIssue(input)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Mark issue in progress
|
|
123
|
-
*/
|
|
124
|
-
async markInProgress(id: string): Promise<void> {
|
|
125
|
-
if (!this.activeProvider) {
|
|
126
|
-
throw new Error('No issue tracker configured')
|
|
127
|
-
}
|
|
128
|
-
return this.activeProvider.markInProgress(id)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Mark issue done
|
|
133
|
-
*/
|
|
134
|
-
async markDone(id: string): Promise<void> {
|
|
135
|
-
if (!this.activeProvider) {
|
|
136
|
-
throw new Error('No issue tracker configured')
|
|
137
|
-
}
|
|
138
|
-
return this.activeProvider.markDone(id)
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// ===========================================================================
|
|
142
|
-
// Enrichment Operations
|
|
143
|
-
// ===========================================================================
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Enrich an issue with AI-generated context
|
|
147
|
-
* Returns the enrichment prompt for Claude to execute
|
|
148
|
-
*/
|
|
149
|
-
getEnrichmentPrompt(issue: Issue, projectContext: ProjectContext): string {
|
|
150
|
-
return generateEnrichmentPrompt(issue, projectContext)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Build enriched issue from AI result
|
|
155
|
-
*/
|
|
156
|
-
buildEnrichedIssue(issue: Issue, enrichment: EnrichmentResult): EnrichedIssue {
|
|
157
|
-
return buildEnrichedIssue(issue, enrichment)
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Format enrichment as markdown for provider update
|
|
162
|
-
*/
|
|
163
|
-
formatEnrichment(enrichment: EnrichmentResult): string {
|
|
164
|
-
return formatEnrichmentAsMarkdown(enrichment)
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Quick enrichment without AI
|
|
169
|
-
*/
|
|
170
|
-
quickEnrich(issue: Issue): EnrichedIssue {
|
|
171
|
-
const enrichment = generateQuickEnrichment(issue)
|
|
172
|
-
return buildEnrichedIssue(issue, enrichment)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Update issue with enrichment in provider
|
|
177
|
-
*/
|
|
178
|
-
async pushEnrichment(issue: Issue, enrichment: EnrichmentResult): Promise<Issue> {
|
|
179
|
-
if (!this.activeProvider) {
|
|
180
|
-
throw new Error('No issue tracker configured')
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (!this.config?.enrichment.updateProvider) {
|
|
184
|
-
console.log('[issue-tracker] Skipping provider update (disabled)')
|
|
185
|
-
return issue
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const markdown = formatEnrichmentAsMarkdown(enrichment)
|
|
189
|
-
return this.activeProvider.updateIssue(issue.id, {
|
|
190
|
-
description: markdown,
|
|
191
|
-
})
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// ===========================================================================
|
|
195
|
-
// Sync Operations
|
|
196
|
-
// ===========================================================================
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Sync and optionally enrich assigned issues
|
|
200
|
-
*/
|
|
201
|
-
async syncAssignedIssues(
|
|
202
|
-
projectContext: ProjectContext,
|
|
203
|
-
options?: {
|
|
204
|
-
enrich?: boolean
|
|
205
|
-
limit?: number
|
|
206
|
-
}
|
|
207
|
-
): Promise<SyncResult> {
|
|
208
|
-
if (!this.activeProvider) {
|
|
209
|
-
throw new Error('No issue tracker configured')
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const result: SyncResult = {
|
|
213
|
-
provider: this.activeProvider.name,
|
|
214
|
-
fetched: 0,
|
|
215
|
-
enriched: 0,
|
|
216
|
-
updated: 0,
|
|
217
|
-
errors: [],
|
|
218
|
-
timestamp: new Date().toISOString(),
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
// Fetch issues
|
|
223
|
-
const issues = await this.activeProvider.fetchAssignedIssues({
|
|
224
|
-
limit: options?.limit || 20,
|
|
225
|
-
includeCompleted: false,
|
|
226
|
-
})
|
|
227
|
-
result.fetched = issues.length
|
|
228
|
-
|
|
229
|
-
console.log(`[issue-tracker] Fetched ${issues.length} issues`)
|
|
230
|
-
|
|
231
|
-
// Enrich if requested
|
|
232
|
-
if (options?.enrich && this.config?.enrichment.enabled) {
|
|
233
|
-
for (const issue of issues) {
|
|
234
|
-
try {
|
|
235
|
-
// Generate prompt (actual AI execution is external)
|
|
236
|
-
const _prompt = this.getEnrichmentPrompt(issue, projectContext)
|
|
237
|
-
console.log(`[issue-tracker] Enrichment prompt ready for ${issue.externalId}`)
|
|
238
|
-
|
|
239
|
-
// For now, use quick enrichment as placeholder
|
|
240
|
-
// Real enrichment happens through Claude Code execution
|
|
241
|
-
result.enriched++
|
|
242
|
-
} catch (error) {
|
|
243
|
-
result.errors.push({
|
|
244
|
-
issueId: issue.externalId,
|
|
245
|
-
error: getErrorMessage(error),
|
|
246
|
-
})
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return result
|
|
252
|
-
} catch (error) {
|
|
253
|
-
result.errors.push({
|
|
254
|
-
issueId: 'sync',
|
|
255
|
-
error: getErrorMessage(error),
|
|
256
|
-
})
|
|
257
|
-
return result
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// ===========================================================================
|
|
262
|
-
// Team/Project Operations
|
|
263
|
-
// ===========================================================================
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Get available teams
|
|
267
|
-
*/
|
|
268
|
-
async getTeams(): Promise<Array<{ id: string; name: string; key?: string }>> {
|
|
269
|
-
if (!this.activeProvider) return []
|
|
270
|
-
return this.activeProvider.getTeams()
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Get available projects
|
|
275
|
-
*/
|
|
276
|
-
async getProjects(): Promise<Array<{ id: string; name: string }>> {
|
|
277
|
-
if (!this.activeProvider) return []
|
|
278
|
-
return this.activeProvider.getProjects()
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// =============================================================================
|
|
283
|
-
// Singleton Instance
|
|
284
|
-
// =============================================================================
|
|
285
|
-
|
|
286
|
-
export const issueTrackerManager = new IssueTrackerManager()
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Issue Tracker Abstraction Types
|
|
3
|
-
* Unified interface for Linear, Jira, Monday, and other issue trackers.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// =============================================================================
|
|
7
|
-
// Core Issue Types
|
|
8
|
-
// =============================================================================
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Normalized issue from any tracker
|
|
12
|
-
*/
|
|
13
|
-
export interface Issue {
|
|
14
|
-
id: string
|
|
15
|
-
externalId: string // Original ID from provider (e.g., "ENG-123")
|
|
16
|
-
provider: IssueProvider
|
|
17
|
-
title: string
|
|
18
|
-
description?: string
|
|
19
|
-
status: IssueStatus
|
|
20
|
-
priority: IssuePriority
|
|
21
|
-
type: IssueType
|
|
22
|
-
assignee?: {
|
|
23
|
-
id: string
|
|
24
|
-
name: string
|
|
25
|
-
email?: string
|
|
26
|
-
}
|
|
27
|
-
labels: string[]
|
|
28
|
-
project?: {
|
|
29
|
-
id: string
|
|
30
|
-
name: string
|
|
31
|
-
}
|
|
32
|
-
team?: {
|
|
33
|
-
id: string
|
|
34
|
-
name: string
|
|
35
|
-
key?: string
|
|
36
|
-
}
|
|
37
|
-
url: string
|
|
38
|
-
createdAt: string
|
|
39
|
-
updatedAt: string
|
|
40
|
-
// Original data from provider
|
|
41
|
-
raw?: unknown
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Enriched issue with AI-generated context
|
|
46
|
-
*/
|
|
47
|
-
export interface EnrichedIssue extends Issue {
|
|
48
|
-
enrichment: {
|
|
49
|
-
description: string // Enhanced description
|
|
50
|
-
acceptanceCriteria: string[] // Generated ACs
|
|
51
|
-
affectedFiles: string[] // Files likely to change
|
|
52
|
-
technicalNotes: string // Implementation hints
|
|
53
|
-
estimatedComplexity: 'trivial' | 'small' | 'medium' | 'large' | 'epic'
|
|
54
|
-
suggestedApproach?: string // High-level approach
|
|
55
|
-
relatedCode?: {
|
|
56
|
-
file: string
|
|
57
|
-
relevance: string
|
|
58
|
-
}[]
|
|
59
|
-
generatedAt: string
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Input for creating issues
|
|
65
|
-
*/
|
|
66
|
-
export interface CreateIssueInput {
|
|
67
|
-
title: string
|
|
68
|
-
description?: string
|
|
69
|
-
priority?: IssuePriority
|
|
70
|
-
type?: IssueType
|
|
71
|
-
labels?: string[]
|
|
72
|
-
projectId?: string
|
|
73
|
-
teamId?: string
|
|
74
|
-
assigneeId?: string
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Update input for issues
|
|
79
|
-
*/
|
|
80
|
-
export interface UpdateIssueInput {
|
|
81
|
-
title?: string
|
|
82
|
-
description?: string
|
|
83
|
-
priority?: IssuePriority
|
|
84
|
-
assigneeId?: string | null // null to unassign
|
|
85
|
-
stateId?: string
|
|
86
|
-
projectId?: string
|
|
87
|
-
labels?: string[]
|
|
88
|
-
// Provider-specific: may update custom fields for AC, etc.
|
|
89
|
-
customFields?: Record<string, unknown>
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// =============================================================================
|
|
93
|
-
// Enums
|
|
94
|
-
// =============================================================================
|
|
95
|
-
|
|
96
|
-
export type IssueProvider = 'linear' | 'jira' | 'monday' | 'github' | 'asana' | 'none'
|
|
97
|
-
|
|
98
|
-
export type IssueStatus = 'backlog' | 'todo' | 'in_progress' | 'in_review' | 'done' | 'cancelled'
|
|
99
|
-
|
|
100
|
-
export type IssuePriority = 'none' | 'urgent' | 'high' | 'medium' | 'low'
|
|
101
|
-
|
|
102
|
-
export type IssueType = 'feature' | 'bug' | 'improvement' | 'task' | 'chore' | 'epic'
|
|
103
|
-
|
|
104
|
-
// =============================================================================
|
|
105
|
-
// Provider Interface
|
|
106
|
-
// =============================================================================
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Interface for issue tracker providers
|
|
110
|
-
* Implement this for each provider (Linear, Jira, Monday, etc.)
|
|
111
|
-
*/
|
|
112
|
-
export interface IssueTrackerProvider {
|
|
113
|
-
readonly name: IssueProvider
|
|
114
|
-
readonly displayName: string
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Check if provider is configured and ready
|
|
118
|
-
*/
|
|
119
|
-
isConfigured(): boolean
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Initialize the provider with config
|
|
123
|
-
*/
|
|
124
|
-
initialize(config: IssueTrackerConfig): Promise<void>
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Get issues assigned to current user
|
|
128
|
-
*/
|
|
129
|
-
fetchAssignedIssues(options?: FetchOptions): Promise<Issue[]>
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Get issues from a specific team/project
|
|
133
|
-
*/
|
|
134
|
-
fetchTeamIssues(teamId: string, options?: FetchOptions): Promise<Issue[]>
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Get a single issue by ID
|
|
138
|
-
*/
|
|
139
|
-
fetchIssue(id: string): Promise<Issue | null>
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Create a new issue
|
|
143
|
-
*/
|
|
144
|
-
createIssue(input: CreateIssueInput): Promise<Issue>
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Update an issue (for enrichment)
|
|
148
|
-
*/
|
|
149
|
-
updateIssue(id: string, input: UpdateIssueInput): Promise<Issue>
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Mark issue as in progress
|
|
153
|
-
*/
|
|
154
|
-
markInProgress(id: string): Promise<void>
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Mark issue as done/completed
|
|
158
|
-
*/
|
|
159
|
-
markDone(id: string): Promise<void>
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Get available teams
|
|
163
|
-
*/
|
|
164
|
-
getTeams(): Promise<Array<{ id: string; name: string; key?: string }>>
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Get available projects
|
|
168
|
-
*/
|
|
169
|
-
getProjects(): Promise<Array<{ id: string; name: string }>>
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// =============================================================================
|
|
173
|
-
// Configuration Types
|
|
174
|
-
// =============================================================================
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Base config for all providers
|
|
178
|
-
*/
|
|
179
|
-
export interface IssueTrackerConfig {
|
|
180
|
-
enabled: boolean
|
|
181
|
-
provider: IssueProvider
|
|
182
|
-
// API authentication
|
|
183
|
-
apiKey?: string
|
|
184
|
-
accessToken?: string
|
|
185
|
-
// Default team/project for new issues
|
|
186
|
-
defaultTeamId?: string
|
|
187
|
-
defaultProjectId?: string
|
|
188
|
-
// Sync preferences
|
|
189
|
-
syncOn: {
|
|
190
|
-
task: boolean // Sync on p. task
|
|
191
|
-
done: boolean // Sync on p. done
|
|
192
|
-
ship: boolean // Sync on p. ship
|
|
193
|
-
}
|
|
194
|
-
// Enrichment settings
|
|
195
|
-
enrichment: {
|
|
196
|
-
enabled: boolean
|
|
197
|
-
updateProvider: boolean // Push enriched description back to provider
|
|
198
|
-
}
|
|
199
|
-
// Metadata
|
|
200
|
-
setupAt?: string
|
|
201
|
-
lastSyncAt?: string
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Linear-specific config
|
|
206
|
-
*/
|
|
207
|
-
export interface LinearConfig extends IssueTrackerConfig {
|
|
208
|
-
provider: 'linear'
|
|
209
|
-
// Linear-specific settings
|
|
210
|
-
teamKey?: string // e.g., "ENG"
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Jira-specific config (future)
|
|
215
|
-
*/
|
|
216
|
-
export interface JiraConfig extends IssueTrackerConfig {
|
|
217
|
-
provider: 'jira'
|
|
218
|
-
baseUrl: string // e.g., "https://company.atlassian.net"
|
|
219
|
-
projectKey?: string
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Monday-specific config (future)
|
|
224
|
-
*/
|
|
225
|
-
export interface MondayConfig extends IssueTrackerConfig {
|
|
226
|
-
provider: 'monday'
|
|
227
|
-
boardId?: string
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* GitHub Issues config (future)
|
|
232
|
-
*/
|
|
233
|
-
export interface GitHubConfig extends IssueTrackerConfig {
|
|
234
|
-
provider: 'github'
|
|
235
|
-
owner: string // e.g., "anthropics"
|
|
236
|
-
repo: string // e.g., "claude-code"
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// =============================================================================
|
|
240
|
-
// Fetch Options
|
|
241
|
-
// =============================================================================
|
|
242
|
-
|
|
243
|
-
export interface FetchOptions {
|
|
244
|
-
limit?: number
|
|
245
|
-
status?: IssueStatus[]
|
|
246
|
-
includeCompleted?: boolean
|
|
247
|
-
since?: string // ISO date
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Scope filter - who's issues to fetch
|
|
251
|
-
* Default: 'mine' (only issues assigned to current user)
|
|
252
|
-
*/
|
|
253
|
-
scope?: 'mine' | 'team' | 'project' | 'unassigned'
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Project filter (when scope is 'project')
|
|
257
|
-
*/
|
|
258
|
-
projectId?: string
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Team filter (when scope is 'team')
|
|
262
|
-
*/
|
|
263
|
-
teamId?: string
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// =============================================================================
|
|
267
|
-
// Sync Result
|
|
268
|
-
// =============================================================================
|
|
269
|
-
|
|
270
|
-
export interface SyncResult {
|
|
271
|
-
provider: IssueProvider
|
|
272
|
-
fetched: number
|
|
273
|
-
enriched: number
|
|
274
|
-
updated: number
|
|
275
|
-
errors: Array<{ issueId: string; error: string }>
|
|
276
|
-
timestamp: string
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// =============================================================================
|
|
280
|
-
// Default Configs
|
|
281
|
-
// =============================================================================
|
|
282
|
-
|
|
283
|
-
export const DEFAULT_LINEAR_CONFIG: LinearConfig = {
|
|
284
|
-
enabled: false,
|
|
285
|
-
provider: 'linear',
|
|
286
|
-
syncOn: {
|
|
287
|
-
task: true,
|
|
288
|
-
done: true,
|
|
289
|
-
ship: true,
|
|
290
|
-
},
|
|
291
|
-
enrichment: {
|
|
292
|
-
enabled: true,
|
|
293
|
-
updateProvider: true,
|
|
294
|
-
},
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
export const DEFAULT_JIRA_CONFIG: JiraConfig = {
|
|
298
|
-
enabled: false,
|
|
299
|
-
provider: 'jira',
|
|
300
|
-
baseUrl: '',
|
|
301
|
-
syncOn: {
|
|
302
|
-
task: true,
|
|
303
|
-
done: true,
|
|
304
|
-
ship: true,
|
|
305
|
-
},
|
|
306
|
-
enrichment: {
|
|
307
|
-
enabled: true,
|
|
308
|
-
updateProvider: true,
|
|
309
|
-
},
|
|
310
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JIRA Cache Module
|
|
3
|
-
* 5-minute TTL cache for JIRA API responses to reduce API calls
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { TTLCache } from '../../utils/cache'
|
|
7
|
-
import type { Issue } from '../issue-tracker/types'
|
|
8
|
-
|
|
9
|
-
// 5-minute TTL for JIRA API responses
|
|
10
|
-
const JIRA_CACHE_TTL = 5 * 60 * 1000 // 300000ms
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Cache for individual issues (by key like "ENG-123" or ID)
|
|
14
|
-
* Key format: "issue:{key}" or "issue:{id}"
|
|
15
|
-
*/
|
|
16
|
-
export const issueCache = new TTLCache<Issue>({
|
|
17
|
-
ttl: JIRA_CACHE_TTL,
|
|
18
|
-
maxSize: 100,
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Cache for assigned issues list
|
|
23
|
-
* Key format: "assigned:{userId}" or "assigned:me"
|
|
24
|
-
*/
|
|
25
|
-
export const assignedIssuesCache = new TTLCache<Issue[]>({
|
|
26
|
-
ttl: JIRA_CACHE_TTL,
|
|
27
|
-
maxSize: 10,
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Cache for projects list
|
|
32
|
-
* Key format: "projects"
|
|
33
|
-
*/
|
|
34
|
-
export const projectsCache = new TTLCache<Array<{ id: string; name: string; key?: string }>>({
|
|
35
|
-
ttl: JIRA_CACHE_TTL,
|
|
36
|
-
maxSize: 5,
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Clear all JIRA caches
|
|
41
|
-
*/
|
|
42
|
-
export function clearJiraCache(): void {
|
|
43
|
-
issueCache.clear()
|
|
44
|
-
assignedIssuesCache.clear()
|
|
45
|
-
projectsCache.clear()
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Get cache statistics for debugging
|
|
50
|
-
*/
|
|
51
|
-
export function getJiraCacheStats() {
|
|
52
|
-
return {
|
|
53
|
-
issues: issueCache.stats(),
|
|
54
|
-
assignedIssues: assignedIssuesCache.stats(),
|
|
55
|
-
projects: projectsCache.stats(),
|
|
56
|
-
}
|
|
57
|
-
}
|