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,246 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UpdateChecker - Checks for package updates from npm registry
|
|
3
|
-
*
|
|
4
|
-
* @version 0.5.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import fs from 'node:fs/promises'
|
|
8
|
-
import https from 'node:https'
|
|
9
|
-
import os from 'node:os'
|
|
10
|
-
import path from 'node:path'
|
|
11
|
-
import chalk from 'chalk'
|
|
12
|
-
import { getErrorMessage } from '../types/fs'
|
|
13
|
-
import { fileExists } from '../utils/fs-helpers'
|
|
14
|
-
|
|
15
|
-
interface UpdateCache {
|
|
16
|
-
lastCheck: number
|
|
17
|
-
latestVersion: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface UpdateResult {
|
|
21
|
-
updateAvailable: boolean
|
|
22
|
-
currentVersion: string
|
|
23
|
-
latestVersion: string
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
class UpdateChecker {
|
|
27
|
-
packageName: string
|
|
28
|
-
cacheDir: string
|
|
29
|
-
cacheFile: string
|
|
30
|
-
checkInterval: number
|
|
31
|
-
|
|
32
|
-
constructor() {
|
|
33
|
-
this.packageName = 'prjct-cli'
|
|
34
|
-
this.cacheDir = path.join(os.homedir(), '.prjct-cli', 'config')
|
|
35
|
-
this.cacheFile = path.join(this.cacheDir, 'update-cache.json')
|
|
36
|
-
this.checkInterval = 24 * 60 * 60 * 1000 // 24 hours in milliseconds
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Get current installed version from package.json
|
|
41
|
-
*/
|
|
42
|
-
async getCurrentVersion(): Promise<string | null> {
|
|
43
|
-
try {
|
|
44
|
-
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json')
|
|
45
|
-
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'))
|
|
46
|
-
return packageJson.version
|
|
47
|
-
} catch (error) {
|
|
48
|
-
console.error('Error reading package version:', getErrorMessage(error))
|
|
49
|
-
return null
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Fetch latest version from npm registry
|
|
55
|
-
*/
|
|
56
|
-
async getLatestVersion(): Promise<string> {
|
|
57
|
-
return new Promise((resolve, reject) => {
|
|
58
|
-
const options = {
|
|
59
|
-
hostname: 'registry.npmjs.org',
|
|
60
|
-
path: `/${this.packageName}/latest`,
|
|
61
|
-
method: 'GET',
|
|
62
|
-
headers: {
|
|
63
|
-
'User-Agent': 'prjct-cli-update-checker',
|
|
64
|
-
Accept: 'application/json',
|
|
65
|
-
},
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const req = https.request(options, (res) => {
|
|
69
|
-
let data = ''
|
|
70
|
-
|
|
71
|
-
res.on('data', (chunk) => {
|
|
72
|
-
data += chunk
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
res.on('end', () => {
|
|
76
|
-
try {
|
|
77
|
-
if (res.statusCode === 200) {
|
|
78
|
-
const packageData = JSON.parse(data)
|
|
79
|
-
resolve(packageData.version)
|
|
80
|
-
} else {
|
|
81
|
-
reject(new Error(`npm registry returned status ${res.statusCode}`))
|
|
82
|
-
}
|
|
83
|
-
} catch (error) {
|
|
84
|
-
reject(error)
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
req.on('error', (error) => {
|
|
90
|
-
reject(error)
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
req.setTimeout(5000, () => {
|
|
94
|
-
req.destroy()
|
|
95
|
-
reject(new Error('Request timeout'))
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
req.end()
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Compare two semantic versions
|
|
104
|
-
* Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
|
|
105
|
-
*/
|
|
106
|
-
compareVersions(v1: string, v2: string): number {
|
|
107
|
-
const parts1 = v1.split('.').map(Number)
|
|
108
|
-
const parts2 = v2.split('.').map(Number)
|
|
109
|
-
|
|
110
|
-
for (let i = 0; i < 3; i++) {
|
|
111
|
-
const part1 = parts1[i] || 0
|
|
112
|
-
const part2 = parts2[i] || 0
|
|
113
|
-
|
|
114
|
-
if (part1 > part2) return 1
|
|
115
|
-
if (part1 < part2) return -1
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return 0
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Read cache file
|
|
123
|
-
*/
|
|
124
|
-
async readCache(): Promise<UpdateCache | null> {
|
|
125
|
-
try {
|
|
126
|
-
if (await fileExists(this.cacheFile)) {
|
|
127
|
-
const cache = JSON.parse(await fs.readFile(this.cacheFile, 'utf8'))
|
|
128
|
-
return cache
|
|
129
|
-
}
|
|
130
|
-
} catch (_error) {
|
|
131
|
-
// Cache file doesn't exist or is corrupted - expected
|
|
132
|
-
}
|
|
133
|
-
return null
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Write cache file
|
|
138
|
-
*/
|
|
139
|
-
async writeCache(data: UpdateCache): Promise<void> {
|
|
140
|
-
try {
|
|
141
|
-
// Ensure cache directory exists
|
|
142
|
-
if (!(await fileExists(this.cacheDir))) {
|
|
143
|
-
await fs.mkdir(this.cacheDir, { recursive: true })
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
await fs.writeFile(this.cacheFile, JSON.stringify(data, null, 2), 'utf8')
|
|
147
|
-
} catch (_error) {
|
|
148
|
-
// Fail silently - cache is not critical
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Check if update is available (respects 24-hour cache)
|
|
154
|
-
* Returns: { updateAvailable: boolean, currentVersion: string, latestVersion: string } or null
|
|
155
|
-
*/
|
|
156
|
-
async checkForUpdates(): Promise<UpdateResult | null> {
|
|
157
|
-
try {
|
|
158
|
-
const currentVersion = await this.getCurrentVersion()
|
|
159
|
-
if (!currentVersion) {
|
|
160
|
-
return null
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Check cache first
|
|
164
|
-
const cache = await this.readCache()
|
|
165
|
-
const now = Date.now()
|
|
166
|
-
|
|
167
|
-
if (cache?.lastCheck && now - cache.lastCheck < this.checkInterval) {
|
|
168
|
-
// Cache is still valid
|
|
169
|
-
if (cache.latestVersion && this.compareVersions(cache.latestVersion, currentVersion) > 0) {
|
|
170
|
-
return {
|
|
171
|
-
updateAvailable: true,
|
|
172
|
-
currentVersion,
|
|
173
|
-
latestVersion: cache.latestVersion,
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
return {
|
|
177
|
-
updateAvailable: false,
|
|
178
|
-
currentVersion,
|
|
179
|
-
latestVersion: currentVersion,
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Cache expired or doesn't exist, fetch from npm
|
|
184
|
-
const latestVersion = await this.getLatestVersion()
|
|
185
|
-
|
|
186
|
-
// Update cache
|
|
187
|
-
await this.writeCache({
|
|
188
|
-
lastCheck: now,
|
|
189
|
-
latestVersion,
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
// Compare versions
|
|
193
|
-
const updateAvailable = this.compareVersions(latestVersion, currentVersion) > 0
|
|
194
|
-
|
|
195
|
-
return {
|
|
196
|
-
updateAvailable,
|
|
197
|
-
currentVersion,
|
|
198
|
-
latestVersion,
|
|
199
|
-
}
|
|
200
|
-
} catch (_error) {
|
|
201
|
-
// Network error or other issue - fail silently (expected)
|
|
202
|
-
// Return null to indicate check couldn't be performed
|
|
203
|
-
return null
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Get formatted update notification message
|
|
209
|
-
*/
|
|
210
|
-
async getUpdateNotification(): Promise<string | null> {
|
|
211
|
-
const result = await this.checkForUpdates()
|
|
212
|
-
|
|
213
|
-
if (!result || !result.updateAvailable) {
|
|
214
|
-
return null
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return (
|
|
218
|
-
'\n' +
|
|
219
|
-
chalk.yellow('┌───────────────────────────────────────────────────────────┐') +
|
|
220
|
-
'\n' +
|
|
221
|
-
chalk.yellow('│') +
|
|
222
|
-
' ' +
|
|
223
|
-
chalk.bold('Update available!') +
|
|
224
|
-
' ' +
|
|
225
|
-
chalk.dim(`${result.currentVersion} → ${result.latestVersion}`) +
|
|
226
|
-
' ' +
|
|
227
|
-
chalk.yellow('│') +
|
|
228
|
-
'\n' +
|
|
229
|
-
chalk.yellow('│') +
|
|
230
|
-
' ' +
|
|
231
|
-
chalk.yellow('│') +
|
|
232
|
-
'\n' +
|
|
233
|
-
chalk.yellow('│') +
|
|
234
|
-
' Run: ' +
|
|
235
|
-
chalk.cyan('npm update -g prjct-cli') +
|
|
236
|
-
' ' +
|
|
237
|
-
chalk.yellow('│') +
|
|
238
|
-
'\n' +
|
|
239
|
-
chalk.yellow('└───────────────────────────────────────────────────────────┘') +
|
|
240
|
-
'\n'
|
|
241
|
-
)
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export default UpdateChecker
|
|
246
|
-
export { UpdateChecker }
|
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Issue Enricher
|
|
3
|
-
* Generates rich context for issues using AI analysis of the codebase.
|
|
4
|
-
*
|
|
5
|
-
* This module provides prompts and templates for Claude to enrich issues.
|
|
6
|
-
* The actual AI call happens through Claude Code's execution context.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { getErrorMessage } from '../../types/fs'
|
|
10
|
-
import type { EnrichedIssue, Issue } from './types'
|
|
11
|
-
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// Enrichment Templates
|
|
14
|
-
// =============================================================================
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Generate enrichment prompt
|
|
18
|
-
* This prompt can be used with any AI assistant (Claude, ChatGPT, Copilot, Gemini, etc.)
|
|
19
|
-
*/
|
|
20
|
-
export function generateEnrichmentPrompt(issue: Issue, projectContext: ProjectContext): string {
|
|
21
|
-
return `
|
|
22
|
-
# Issue Enrichment Request
|
|
23
|
-
|
|
24
|
-
## Original Issue
|
|
25
|
-
- **ID**: ${issue.externalId}
|
|
26
|
-
- **Title**: ${issue.title}
|
|
27
|
-
- **Type**: ${issue.type}
|
|
28
|
-
- **Priority**: ${issue.priority}
|
|
29
|
-
- **Current Description**: ${issue.description || '(no description provided)'}
|
|
30
|
-
- **Labels**: ${issue.labels.join(', ') || 'none'}
|
|
31
|
-
- **Team**: ${issue.team?.name || 'unknown'}
|
|
32
|
-
|
|
33
|
-
## Project Context
|
|
34
|
-
- **Project**: ${projectContext.name}
|
|
35
|
-
- **Tech Stack**: ${projectContext.techStack.join(', ')}
|
|
36
|
-
- **Key Directories**: ${projectContext.keyDirectories.join(', ')}
|
|
37
|
-
|
|
38
|
-
## Your Task
|
|
39
|
-
|
|
40
|
-
Analyze this issue and the codebase to generate comprehensive enrichment.
|
|
41
|
-
|
|
42
|
-
### 1. Enhanced Description
|
|
43
|
-
Write a clear, detailed description that includes:
|
|
44
|
-
- What the user/stakeholder is trying to achieve
|
|
45
|
-
- Why this change is needed
|
|
46
|
-
- Any relevant context from similar features in the codebase
|
|
47
|
-
|
|
48
|
-
### 2. Acceptance Criteria
|
|
49
|
-
Generate 3-7 specific, testable acceptance criteria in the format:
|
|
50
|
-
- [ ] When [action], then [expected result]
|
|
51
|
-
|
|
52
|
-
### 3. Affected Files
|
|
53
|
-
Based on the issue title and codebase analysis, identify files likely to be modified:
|
|
54
|
-
- List specific file paths
|
|
55
|
-
- Explain why each file is relevant
|
|
56
|
-
|
|
57
|
-
### 4. Technical Notes
|
|
58
|
-
Provide implementation hints:
|
|
59
|
-
- Relevant existing patterns to follow
|
|
60
|
-
- Potential gotchas or edge cases
|
|
61
|
-
- Dependencies or related code
|
|
62
|
-
|
|
63
|
-
### 5. Complexity Estimate
|
|
64
|
-
Rate as: trivial | small | medium | large | epic
|
|
65
|
-
Explain your reasoning.
|
|
66
|
-
|
|
67
|
-
### 6. Suggested Approach (optional)
|
|
68
|
-
If there are multiple ways to implement this, suggest the recommended approach.
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
**Format your response as JSON matching the EnrichedIssue.enrichment schema.**
|
|
73
|
-
`.trim()
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Generate copy-paste ready LLM prompt
|
|
78
|
-
* Compatible with Claude, ChatGPT, Copilot, Gemini, Cursor, etc.
|
|
79
|
-
*/
|
|
80
|
-
export function generateLLMPrompt(
|
|
81
|
-
issue: Issue,
|
|
82
|
-
projectContext: ProjectContext,
|
|
83
|
-
enrichment: EnrichmentResult
|
|
84
|
-
): string {
|
|
85
|
-
const filesList = enrichment.affectedFiles.map((f) => `- ${f}`).join('\n')
|
|
86
|
-
|
|
87
|
-
const acList = enrichment.acceptanceCriteria.map((ac) => `- [ ] ${ac}`).join('\n')
|
|
88
|
-
|
|
89
|
-
return `## Task: ${issue.title}
|
|
90
|
-
|
|
91
|
-
### Context
|
|
92
|
-
I'm working on a codebase with the following structure:
|
|
93
|
-
- Stack: ${projectContext.techStack.join(', ')}
|
|
94
|
-
- Key directories: ${projectContext.keyDirectories.join(', ')}
|
|
95
|
-
|
|
96
|
-
### Problem
|
|
97
|
-
${enrichment.description}
|
|
98
|
-
|
|
99
|
-
### What needs to be done
|
|
100
|
-
${enrichment.technicalNotes}
|
|
101
|
-
|
|
102
|
-
### Files to modify
|
|
103
|
-
${filesList || '(analyze codebase to identify)'}
|
|
104
|
-
|
|
105
|
-
### Reference implementation
|
|
106
|
-
${enrichment.suggestedApproach || 'Follow existing patterns in the codebase.'}
|
|
107
|
-
|
|
108
|
-
### Acceptance criteria
|
|
109
|
-
${acList}
|
|
110
|
-
|
|
111
|
-
### How to verify
|
|
112
|
-
1. Run tests to ensure nothing is broken
|
|
113
|
-
2. Manually test the affected functionality
|
|
114
|
-
3. Review code for edge cases
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
*Generated by prjct - Use with any AI assistant*
|
|
118
|
-
`.trim()
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// =============================================================================
|
|
122
|
-
// Types
|
|
123
|
-
// =============================================================================
|
|
124
|
-
|
|
125
|
-
export interface ProjectContext {
|
|
126
|
-
name: string
|
|
127
|
-
techStack: string[]
|
|
128
|
-
keyDirectories: string[]
|
|
129
|
-
recentCommits?: string[]
|
|
130
|
-
patterns?: Record<string, string>
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export interface EnrichmentResult {
|
|
134
|
-
description: string
|
|
135
|
-
acceptanceCriteria: string[]
|
|
136
|
-
affectedFiles: string[]
|
|
137
|
-
technicalNotes: string
|
|
138
|
-
estimatedComplexity: 'trivial' | 'small' | 'medium' | 'large' | 'epic'
|
|
139
|
-
suggestedApproach?: string
|
|
140
|
-
relatedCode?: Array<{ file: string; relevance: string }>
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// =============================================================================
|
|
144
|
-
// Enrichment Helpers
|
|
145
|
-
// =============================================================================
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Build enriched issue from result
|
|
149
|
-
*/
|
|
150
|
-
export function buildEnrichedIssue(issue: Issue, enrichment: EnrichmentResult): EnrichedIssue {
|
|
151
|
-
return {
|
|
152
|
-
...issue,
|
|
153
|
-
enrichment: {
|
|
154
|
-
...enrichment,
|
|
155
|
-
generatedAt: new Date().toISOString(),
|
|
156
|
-
},
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Format enrichment as markdown for updating issue description
|
|
162
|
-
*/
|
|
163
|
-
export function formatEnrichmentAsMarkdown(enrichment: EnrichmentResult): string {
|
|
164
|
-
const sections: string[] = []
|
|
165
|
-
|
|
166
|
-
// Description
|
|
167
|
-
sections.push(enrichment.description)
|
|
168
|
-
sections.push('')
|
|
169
|
-
|
|
170
|
-
// Acceptance Criteria
|
|
171
|
-
sections.push('## Acceptance Criteria')
|
|
172
|
-
for (const ac of enrichment.acceptanceCriteria) {
|
|
173
|
-
sections.push(`- [ ] ${ac}`)
|
|
174
|
-
}
|
|
175
|
-
sections.push('')
|
|
176
|
-
|
|
177
|
-
// Technical Notes
|
|
178
|
-
if (enrichment.technicalNotes) {
|
|
179
|
-
sections.push('## Technical Notes')
|
|
180
|
-
sections.push(enrichment.technicalNotes)
|
|
181
|
-
sections.push('')
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Affected Files
|
|
185
|
-
if (enrichment.affectedFiles.length > 0) {
|
|
186
|
-
sections.push('## Affected Files')
|
|
187
|
-
for (const file of enrichment.affectedFiles) {
|
|
188
|
-
sections.push(`- \`${file}\``)
|
|
189
|
-
}
|
|
190
|
-
sections.push('')
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Complexity
|
|
194
|
-
sections.push(`**Estimated Complexity**: ${enrichment.estimatedComplexity}`)
|
|
195
|
-
|
|
196
|
-
// Footer
|
|
197
|
-
sections.push('')
|
|
198
|
-
sections.push('---')
|
|
199
|
-
sections.push('*Enriched by prjct*')
|
|
200
|
-
|
|
201
|
-
return sections.join('\n')
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Parse JSON enrichment response from Claude
|
|
206
|
-
*/
|
|
207
|
-
export function parseEnrichmentResponse(response: string): EnrichmentResult | null {
|
|
208
|
-
try {
|
|
209
|
-
// Extract JSON from response (may be wrapped in markdown code block)
|
|
210
|
-
const jsonMatch =
|
|
211
|
-
response.match(/```(?:json)?\s*([\s\S]*?)```/) || response.match(/\{[\s\S]*\}/)
|
|
212
|
-
|
|
213
|
-
if (!jsonMatch) {
|
|
214
|
-
console.error('[enricher] No JSON found in response')
|
|
215
|
-
return null
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const jsonStr = jsonMatch[1] || jsonMatch[0]
|
|
219
|
-
const parsed = JSON.parse(jsonStr)
|
|
220
|
-
|
|
221
|
-
// Validate required fields
|
|
222
|
-
if (!parsed.description || !parsed.acceptanceCriteria || !parsed.estimatedComplexity) {
|
|
223
|
-
console.error('[enricher] Missing required fields in enrichment')
|
|
224
|
-
return null
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return {
|
|
228
|
-
description: parsed.description,
|
|
229
|
-
acceptanceCriteria: Array.isArray(parsed.acceptanceCriteria) ? parsed.acceptanceCriteria : [],
|
|
230
|
-
affectedFiles: Array.isArray(parsed.affectedFiles) ? parsed.affectedFiles : [],
|
|
231
|
-
technicalNotes: parsed.technicalNotes || '',
|
|
232
|
-
estimatedComplexity: parsed.estimatedComplexity,
|
|
233
|
-
suggestedApproach: parsed.suggestedApproach,
|
|
234
|
-
relatedCode: parsed.relatedCode,
|
|
235
|
-
}
|
|
236
|
-
} catch (error) {
|
|
237
|
-
console.error('[enricher] Failed to parse enrichment:', getErrorMessage(error))
|
|
238
|
-
return null
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// =============================================================================
|
|
243
|
-
// Quick Enrichment (Minimal AI)
|
|
244
|
-
// =============================================================================
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Generate basic enrichment without full AI analysis
|
|
248
|
-
* Useful for quick syncs or when AI is unavailable
|
|
249
|
-
*/
|
|
250
|
-
export function generateQuickEnrichment(issue: Issue): EnrichmentResult {
|
|
251
|
-
const typeToComplexity: Record<string, 'trivial' | 'small' | 'medium' | 'large'> = {
|
|
252
|
-
bug: 'small',
|
|
253
|
-
chore: 'trivial',
|
|
254
|
-
task: 'small',
|
|
255
|
-
improvement: 'medium',
|
|
256
|
-
feature: 'medium',
|
|
257
|
-
epic: 'large',
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
return {
|
|
261
|
-
description: issue.description || `Implement: ${issue.title}`,
|
|
262
|
-
acceptanceCriteria: [
|
|
263
|
-
`The ${issue.type} "${issue.title}" is implemented`,
|
|
264
|
-
'All existing tests pass',
|
|
265
|
-
'New functionality is tested',
|
|
266
|
-
],
|
|
267
|
-
affectedFiles: [],
|
|
268
|
-
technicalNotes: 'Analyze codebase to identify affected files and implementation approach.',
|
|
269
|
-
estimatedComplexity: typeToComplexity[issue.type] || 'medium',
|
|
270
|
-
}
|
|
271
|
-
}
|