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,355 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ProjectIndex Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for the persistent project scanner with scoring
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
8
|
-
import fs from 'node:fs/promises'
|
|
9
|
-
import os from 'node:os'
|
|
10
|
-
import path from 'node:path'
|
|
11
|
-
import pathManager from '../../infrastructure/path-manager'
|
|
12
|
-
import { FileScorer } from '../../services/file-scorer'
|
|
13
|
-
import { createProjectIndexer, RELEVANCE_THRESHOLD } from '../../services/project-index'
|
|
14
|
-
import { getDefaultIndex, indexStorage } from '../../storage/index-storage'
|
|
15
|
-
|
|
16
|
-
describe('FileScorer', () => {
|
|
17
|
-
describe('scoreFile', () => {
|
|
18
|
-
it('should give higher scores to recently modified files', () => {
|
|
19
|
-
const scorer = new FileScorer()
|
|
20
|
-
|
|
21
|
-
const recentFile = {
|
|
22
|
-
path: 'src/recent.ts',
|
|
23
|
-
size: 1000,
|
|
24
|
-
mtime: new Date(), // today
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const oldFile = {
|
|
28
|
-
path: 'src/old.ts',
|
|
29
|
-
size: 1000,
|
|
30
|
-
mtime: new Date(Date.now() - 365 * 24 * 60 * 60 * 1000), // 1 year ago
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const context = {
|
|
34
|
-
allFiles: new Map([
|
|
35
|
-
['src/recent.ts', recentFile],
|
|
36
|
-
['src/old.ts', oldFile],
|
|
37
|
-
]),
|
|
38
|
-
configFiles: new Set<string>(),
|
|
39
|
-
maxFileSize: 1000,
|
|
40
|
-
maxRecentCommits: 0,
|
|
41
|
-
now: new Date(),
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const recentScore = scorer.scoreFile(recentFile, context)
|
|
45
|
-
const oldScore = scorer.scoreFile(oldFile, context)
|
|
46
|
-
|
|
47
|
-
expect(recentScore.factors.recency).toBeGreaterThan(oldScore.factors.recency)
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('should give higher scores to config files', () => {
|
|
51
|
-
const scorer = new FileScorer()
|
|
52
|
-
|
|
53
|
-
const configFile = {
|
|
54
|
-
path: 'package.json',
|
|
55
|
-
size: 500,
|
|
56
|
-
mtime: new Date(),
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const sourceFile = {
|
|
60
|
-
path: 'src/utils.ts',
|
|
61
|
-
size: 500,
|
|
62
|
-
mtime: new Date(),
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const context = {
|
|
66
|
-
allFiles: new Map([
|
|
67
|
-
['package.json', configFile],
|
|
68
|
-
['src/utils.ts', sourceFile],
|
|
69
|
-
]),
|
|
70
|
-
configFiles: new Set(['package.json']),
|
|
71
|
-
maxFileSize: 500,
|
|
72
|
-
maxRecentCommits: 0,
|
|
73
|
-
now: new Date(),
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const configScore = scorer.scoreFile(configFile, context)
|
|
77
|
-
const sourceScore = scorer.scoreFile(sourceFile, context)
|
|
78
|
-
|
|
79
|
-
expect(configScore.factors.configRelevance).toBe(20)
|
|
80
|
-
expect(sourceScore.factors.configRelevance).toBe(0)
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('should give higher scores to index/main files', () => {
|
|
84
|
-
const scorer = new FileScorer()
|
|
85
|
-
|
|
86
|
-
const indexFile = {
|
|
87
|
-
path: 'src/index.ts',
|
|
88
|
-
size: 500,
|
|
89
|
-
mtime: new Date(),
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const helperFile = {
|
|
93
|
-
path: 'src/random-helper.ts',
|
|
94
|
-
size: 500,
|
|
95
|
-
mtime: new Date(),
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const context = {
|
|
99
|
-
allFiles: new Map([
|
|
100
|
-
['src/index.ts', indexFile],
|
|
101
|
-
['src/random-helper.ts', helperFile],
|
|
102
|
-
]),
|
|
103
|
-
configFiles: new Set<string>(),
|
|
104
|
-
maxFileSize: 500,
|
|
105
|
-
maxRecentCommits: 0,
|
|
106
|
-
now: new Date(),
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const indexScore = scorer.scoreFile(indexFile, context)
|
|
110
|
-
const helperScore = scorer.scoreFile(helperFile, context)
|
|
111
|
-
|
|
112
|
-
expect(indexScore.factors.nameRelevance).toBe(15)
|
|
113
|
-
expect(helperScore.factors.nameRelevance).toBe(0)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('should penalize very large files', () => {
|
|
117
|
-
const scorer = new FileScorer()
|
|
118
|
-
|
|
119
|
-
const normalFile = {
|
|
120
|
-
path: 'src/normal.ts',
|
|
121
|
-
size: 5000, // 5KB - optimal
|
|
122
|
-
mtime: new Date(),
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const hugeFile = {
|
|
126
|
-
path: 'src/huge.ts',
|
|
127
|
-
size: 500000, // 500KB - too large
|
|
128
|
-
mtime: new Date(),
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const context = {
|
|
132
|
-
allFiles: new Map([
|
|
133
|
-
['src/normal.ts', normalFile],
|
|
134
|
-
['src/huge.ts', hugeFile],
|
|
135
|
-
]),
|
|
136
|
-
configFiles: new Set<string>(),
|
|
137
|
-
maxFileSize: 500000,
|
|
138
|
-
maxRecentCommits: 0,
|
|
139
|
-
now: new Date(),
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const normalScore = scorer.scoreFile(normalFile, context)
|
|
143
|
-
const hugeScore = scorer.scoreFile(hugeFile, context)
|
|
144
|
-
|
|
145
|
-
expect(normalScore.factors.sizeOptimal).toBeGreaterThan(hugeScore.factors.sizeOptimal)
|
|
146
|
-
})
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
describe('getRelevantFiles', () => {
|
|
150
|
-
it('should filter files below threshold', () => {
|
|
151
|
-
const scorer = new FileScorer()
|
|
152
|
-
|
|
153
|
-
// Config file should be relevant
|
|
154
|
-
const configFile = {
|
|
155
|
-
path: 'package.json',
|
|
156
|
-
size: 500,
|
|
157
|
-
mtime: new Date(),
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Random old file should not be relevant
|
|
161
|
-
const randomFile = {
|
|
162
|
-
path: 'src/old-unused.ts',
|
|
163
|
-
size: 50, // very small
|
|
164
|
-
mtime: new Date(Date.now() - 365 * 24 * 60 * 60 * 1000), // old
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const context = {
|
|
168
|
-
allFiles: new Map([
|
|
169
|
-
['package.json', configFile],
|
|
170
|
-
['src/old-unused.ts', randomFile],
|
|
171
|
-
]),
|
|
172
|
-
configFiles: new Set(['package.json']),
|
|
173
|
-
maxFileSize: 500,
|
|
174
|
-
maxRecentCommits: 0,
|
|
175
|
-
now: new Date(),
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const relevant = scorer.getRelevantFiles(context, RELEVANCE_THRESHOLD)
|
|
179
|
-
|
|
180
|
-
expect(relevant.length).toBeGreaterThanOrEqual(1)
|
|
181
|
-
expect(relevant[0].path).toBe('package.json')
|
|
182
|
-
})
|
|
183
|
-
})
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
describe('IndexStorage', () => {
|
|
187
|
-
let testProjectId: string
|
|
188
|
-
|
|
189
|
-
beforeEach(async () => {
|
|
190
|
-
// Generate unique project ID for each test to ensure isolation
|
|
191
|
-
testProjectId = `test-project-${Date.now()}-${Math.random().toString(36).slice(2)}`
|
|
192
|
-
// Set up test directory
|
|
193
|
-
const testDir = path.join(os.tmpdir(), `prjct-test-${Date.now()}`)
|
|
194
|
-
pathManager.setGlobalBaseDir(testDir)
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
afterEach(async () => {
|
|
198
|
-
// Cleanup is handled by temp directory
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
describe('readIndex/writeIndex', () => {
|
|
202
|
-
it('should return null for non-existent index', async () => {
|
|
203
|
-
const index = await indexStorage.readIndex(testProjectId)
|
|
204
|
-
expect(index).toBeNull()
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
it('should persist and retrieve index', async () => {
|
|
208
|
-
const testIndex = getDefaultIndex('/test/project')
|
|
209
|
-
testIndex.lastFullScan = new Date().toISOString()
|
|
210
|
-
testIndex.totalFiles = 100
|
|
211
|
-
|
|
212
|
-
await indexStorage.writeIndex(testProjectId, testIndex)
|
|
213
|
-
const retrieved = await indexStorage.readIndex(testProjectId)
|
|
214
|
-
|
|
215
|
-
expect(retrieved).not.toBeNull()
|
|
216
|
-
expect(retrieved!.totalFiles).toBe(100)
|
|
217
|
-
expect(retrieved!.lastFullScan).toBe(testIndex.lastFullScan)
|
|
218
|
-
})
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
describe('hasValidIndex', () => {
|
|
222
|
-
it('should return false for non-existent index', async () => {
|
|
223
|
-
const valid = await indexStorage.hasValidIndex(testProjectId)
|
|
224
|
-
expect(valid).toBe(false)
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
it('should return true for index with lastFullScan', async () => {
|
|
228
|
-
const testIndex = getDefaultIndex('/test/project')
|
|
229
|
-
testIndex.lastFullScan = new Date().toISOString()
|
|
230
|
-
|
|
231
|
-
await indexStorage.writeIndex(testProjectId, testIndex)
|
|
232
|
-
const valid = await indexStorage.hasValidIndex(testProjectId)
|
|
233
|
-
|
|
234
|
-
expect(valid).toBe(true)
|
|
235
|
-
})
|
|
236
|
-
})
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
describe('ProjectIndexer', () => {
|
|
240
|
-
const testProjectId = `test-indexer-${Date.now()}`
|
|
241
|
-
let testProjectPath: string
|
|
242
|
-
|
|
243
|
-
beforeEach(async () => {
|
|
244
|
-
// Create a temp project directory
|
|
245
|
-
testProjectPath = path.join(os.tmpdir(), `prjct-indexer-test-${Date.now()}`)
|
|
246
|
-
await fs.mkdir(testProjectPath, { recursive: true })
|
|
247
|
-
|
|
248
|
-
// Create some test files
|
|
249
|
-
await fs.mkdir(path.join(testProjectPath, 'src'), { recursive: true })
|
|
250
|
-
await fs.writeFile(
|
|
251
|
-
path.join(testProjectPath, 'src', 'index.ts'),
|
|
252
|
-
'export const main = () => {}'
|
|
253
|
-
)
|
|
254
|
-
await fs.writeFile(
|
|
255
|
-
path.join(testProjectPath, 'src', 'utils.ts'),
|
|
256
|
-
'export const helper = () => {}'
|
|
257
|
-
)
|
|
258
|
-
await fs.writeFile(
|
|
259
|
-
path.join(testProjectPath, 'package.json'),
|
|
260
|
-
JSON.stringify(
|
|
261
|
-
{
|
|
262
|
-
name: 'test-project',
|
|
263
|
-
version: '1.0.0',
|
|
264
|
-
dependencies: { express: '^4.0.0' },
|
|
265
|
-
devDependencies: { typescript: '^5.0.0' },
|
|
266
|
-
},
|
|
267
|
-
null,
|
|
268
|
-
2
|
|
269
|
-
)
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
// Set up test storage directory
|
|
273
|
-
const testStorageDir = path.join(os.tmpdir(), `prjct-storage-${Date.now()}`)
|
|
274
|
-
pathManager.setGlobalBaseDir(testStorageDir)
|
|
275
|
-
})
|
|
276
|
-
|
|
277
|
-
afterEach(async () => {
|
|
278
|
-
// Cleanup
|
|
279
|
-
try {
|
|
280
|
-
await fs.rm(testProjectPath, { recursive: true })
|
|
281
|
-
} catch {
|
|
282
|
-
// Ignore cleanup errors
|
|
283
|
-
}
|
|
284
|
-
})
|
|
285
|
-
|
|
286
|
-
describe('fullScan', () => {
|
|
287
|
-
it('should scan project and create index', async () => {
|
|
288
|
-
const indexer = createProjectIndexer(testProjectPath, testProjectId)
|
|
289
|
-
const result = await indexer.fullScan()
|
|
290
|
-
|
|
291
|
-
expect(result.fromCache).toBe(false)
|
|
292
|
-
expect(result.index.totalFiles).toBeGreaterThanOrEqual(2)
|
|
293
|
-
expect(result.index.lastFullScan).not.toBe('')
|
|
294
|
-
})
|
|
295
|
-
|
|
296
|
-
it('should detect TypeScript from config files', async () => {
|
|
297
|
-
// Add tsconfig.json
|
|
298
|
-
await fs.writeFile(
|
|
299
|
-
path.join(testProjectPath, 'tsconfig.json'),
|
|
300
|
-
JSON.stringify({
|
|
301
|
-
compilerOptions: { target: 'ES2020' },
|
|
302
|
-
})
|
|
303
|
-
)
|
|
304
|
-
|
|
305
|
-
const indexer = createProjectIndexer(testProjectPath, testProjectId)
|
|
306
|
-
const result = await indexer.fullScan()
|
|
307
|
-
|
|
308
|
-
expect(result.index.configFiles.some((cf) => cf.type === 'tsconfig.json')).toBe(true)
|
|
309
|
-
})
|
|
310
|
-
|
|
311
|
-
it('should detect Express backend', async () => {
|
|
312
|
-
const indexer = createProjectIndexer(testProjectPath, testProjectId)
|
|
313
|
-
const result = await indexer.fullScan()
|
|
314
|
-
|
|
315
|
-
expect(result.index.detectedStack.frameworks).toContain('Express')
|
|
316
|
-
})
|
|
317
|
-
})
|
|
318
|
-
|
|
319
|
-
describe('loadOrScan', () => {
|
|
320
|
-
it('should use cached index if valid', async () => {
|
|
321
|
-
const indexer = createProjectIndexer(testProjectPath, testProjectId)
|
|
322
|
-
|
|
323
|
-
// First scan
|
|
324
|
-
const firstResult = await indexer.fullScan()
|
|
325
|
-
expect(firstResult.fromCache).toBe(false)
|
|
326
|
-
|
|
327
|
-
// Second load should use cache
|
|
328
|
-
const secondResult = await indexer.loadOrScan()
|
|
329
|
-
expect(secondResult.fromCache).toBe(true)
|
|
330
|
-
})
|
|
331
|
-
|
|
332
|
-
it('should rescan if forceFullScan is true', async () => {
|
|
333
|
-
const indexer = createProjectIndexer(testProjectPath, testProjectId)
|
|
334
|
-
|
|
335
|
-
// First scan
|
|
336
|
-
await indexer.fullScan()
|
|
337
|
-
|
|
338
|
-
// Force rescan
|
|
339
|
-
const result = await indexer.loadOrScan({ forceFullScan: true })
|
|
340
|
-
expect(result.fromCache).toBe(false)
|
|
341
|
-
})
|
|
342
|
-
})
|
|
343
|
-
|
|
344
|
-
describe('getRelevantContext', () => {
|
|
345
|
-
it('should return files within token limit', async () => {
|
|
346
|
-
const indexer = createProjectIndexer(testProjectPath, testProjectId)
|
|
347
|
-
await indexer.fullScan()
|
|
348
|
-
|
|
349
|
-
const context = await indexer.getRelevantContext(10000)
|
|
350
|
-
|
|
351
|
-
expect(context.estimatedTokens).toBeLessThanOrEqual(10000)
|
|
352
|
-
expect(context.compressionRate).toBeGreaterThanOrEqual(0)
|
|
353
|
-
})
|
|
354
|
-
})
|
|
355
|
-
})
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Staleness Checker Tests (PRJ-120)
|
|
3
|
-
*
|
|
4
|
-
* Tests for the StalenessChecker service:
|
|
5
|
-
* - Fresh context detection
|
|
6
|
-
* - Stale context detection (commits, days, significant files)
|
|
7
|
-
* - No sync history handling
|
|
8
|
-
* - Output formatting
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
12
|
-
import fs from 'node:fs/promises'
|
|
13
|
-
import os from 'node:os'
|
|
14
|
-
import path from 'node:path'
|
|
15
|
-
import pathManager from '../../infrastructure/path-manager'
|
|
16
|
-
import { createStalenessChecker, type StalenessStatus } from '../../services/staleness-checker'
|
|
17
|
-
|
|
18
|
-
// =============================================================================
|
|
19
|
-
// Test Setup
|
|
20
|
-
// =============================================================================
|
|
21
|
-
|
|
22
|
-
let tmpRoot: string | null = null
|
|
23
|
-
let testProjectId: string
|
|
24
|
-
const originalGetGlobalProjectPath = pathManager.getGlobalProjectPath.bind(pathManager)
|
|
25
|
-
|
|
26
|
-
describe('StalenessChecker', () => {
|
|
27
|
-
beforeEach(async () => {
|
|
28
|
-
tmpRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'prjct-staleness-test-'))
|
|
29
|
-
testProjectId = 'staleness-test-project'
|
|
30
|
-
|
|
31
|
-
// Mock pathManager to use temp directory
|
|
32
|
-
pathManager.getGlobalProjectPath = (projectId: string) => {
|
|
33
|
-
return path.join(tmpRoot!, projectId)
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
afterEach(async () => {
|
|
38
|
-
pathManager.getGlobalProjectPath = originalGetGlobalProjectPath
|
|
39
|
-
|
|
40
|
-
if (tmpRoot) {
|
|
41
|
-
await fs.rm(tmpRoot, { recursive: true, force: true })
|
|
42
|
-
tmpRoot = null
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
// ===========================================================================
|
|
47
|
-
// No Sync History Tests
|
|
48
|
-
// ===========================================================================
|
|
49
|
-
|
|
50
|
-
describe('no sync history', () => {
|
|
51
|
-
it('should report stale when no project.json exists', async () => {
|
|
52
|
-
const checker = createStalenessChecker(process.cwd())
|
|
53
|
-
const status = await checker.check(testProjectId)
|
|
54
|
-
|
|
55
|
-
expect(status.isStale).toBe(true)
|
|
56
|
-
expect(status.reason).toContain('No sync history found')
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
it('should report stale when no lastSyncCommit in project.json', async () => {
|
|
60
|
-
// Create project.json without lastSyncCommit
|
|
61
|
-
const projectPath = path.join(tmpRoot!, testProjectId)
|
|
62
|
-
await fs.mkdir(projectPath, { recursive: true })
|
|
63
|
-
await fs.writeFile(
|
|
64
|
-
path.join(projectPath, 'project.json'),
|
|
65
|
-
JSON.stringify({ name: 'test', lastSync: new Date().toISOString() })
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
const checker = createStalenessChecker(process.cwd())
|
|
69
|
-
const status = await checker.check(testProjectId)
|
|
70
|
-
|
|
71
|
-
expect(status.isStale).toBe(true)
|
|
72
|
-
expect(status.reason).toContain('No sync commit recorded')
|
|
73
|
-
})
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
// ===========================================================================
|
|
77
|
-
// Status Formatting Tests
|
|
78
|
-
// ===========================================================================
|
|
79
|
-
|
|
80
|
-
describe('formatStatus', () => {
|
|
81
|
-
it('should format fresh status correctly', () => {
|
|
82
|
-
const checker = createStalenessChecker(process.cwd())
|
|
83
|
-
const status: StalenessStatus = {
|
|
84
|
-
isStale: false,
|
|
85
|
-
reason: 'Context is up to date',
|
|
86
|
-
lastSyncCommit: 'abc123',
|
|
87
|
-
currentCommit: 'abc123',
|
|
88
|
-
commitsSinceSync: 0,
|
|
89
|
-
daysSinceSync: 0,
|
|
90
|
-
changedFiles: [],
|
|
91
|
-
significantChanges: [],
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const formatted = checker.formatStatus(status)
|
|
95
|
-
|
|
96
|
-
expect(formatted).toContain('✓ Fresh')
|
|
97
|
-
expect(formatted).toContain('Last sync:')
|
|
98
|
-
expect(formatted).toContain('abc123')
|
|
99
|
-
expect(formatted).not.toContain('Run `prjct sync`')
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
it('should format stale status with sync prompt', () => {
|
|
103
|
-
const checker = createStalenessChecker(process.cwd())
|
|
104
|
-
const status: StalenessStatus = {
|
|
105
|
-
isStale: true,
|
|
106
|
-
reason: '15 commits since last sync (threshold: 10)',
|
|
107
|
-
lastSyncCommit: 'abc123',
|
|
108
|
-
currentCommit: 'def456',
|
|
109
|
-
commitsSinceSync: 15,
|
|
110
|
-
daysSinceSync: 2,
|
|
111
|
-
changedFiles: ['src/index.ts', 'package.json'],
|
|
112
|
-
significantChanges: ['package.json'],
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const formatted = checker.formatStatus(status)
|
|
116
|
-
|
|
117
|
-
expect(formatted).toContain('⚠️ STALE')
|
|
118
|
-
expect(formatted).toContain('15')
|
|
119
|
-
expect(formatted).toContain('Significant changes')
|
|
120
|
-
expect(formatted).toContain('package.json')
|
|
121
|
-
expect(formatted).toContain('Run `prjct sync`')
|
|
122
|
-
})
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
// ===========================================================================
|
|
126
|
-
// Warning Message Tests
|
|
127
|
-
// ===========================================================================
|
|
128
|
-
|
|
129
|
-
describe('getWarning', () => {
|
|
130
|
-
it('should return null for fresh status', () => {
|
|
131
|
-
const checker = createStalenessChecker(process.cwd())
|
|
132
|
-
const status: StalenessStatus = {
|
|
133
|
-
isStale: false,
|
|
134
|
-
reason: 'Context is up to date',
|
|
135
|
-
lastSyncCommit: 'abc123',
|
|
136
|
-
currentCommit: 'abc123',
|
|
137
|
-
commitsSinceSync: 0,
|
|
138
|
-
daysSinceSync: 0,
|
|
139
|
-
changedFiles: [],
|
|
140
|
-
significantChanges: [],
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const warning = checker.getWarning(status)
|
|
144
|
-
expect(warning).toBeNull()
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
it('should return commit-based warning', () => {
|
|
148
|
-
const checker = createStalenessChecker(process.cwd())
|
|
149
|
-
const status: StalenessStatus = {
|
|
150
|
-
isStale: true,
|
|
151
|
-
reason: '15 commits since last sync',
|
|
152
|
-
lastSyncCommit: 'abc123',
|
|
153
|
-
currentCommit: 'def456',
|
|
154
|
-
commitsSinceSync: 15,
|
|
155
|
-
daysSinceSync: 0,
|
|
156
|
-
changedFiles: [],
|
|
157
|
-
significantChanges: [],
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const warning = checker.getWarning(status)
|
|
161
|
-
expect(warning).toContain('15 commits behind')
|
|
162
|
-
expect(warning).toContain('prjct sync')
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
it('should return days-based warning', () => {
|
|
166
|
-
const checker = createStalenessChecker(process.cwd())
|
|
167
|
-
const status: StalenessStatus = {
|
|
168
|
-
isStale: true,
|
|
169
|
-
reason: '5 days since last sync',
|
|
170
|
-
lastSyncCommit: 'abc123',
|
|
171
|
-
currentCommit: 'abc123',
|
|
172
|
-
commitsSinceSync: 0,
|
|
173
|
-
daysSinceSync: 5,
|
|
174
|
-
changedFiles: [],
|
|
175
|
-
significantChanges: [],
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const warning = checker.getWarning(status)
|
|
179
|
-
expect(warning).toContain('5 days old')
|
|
180
|
-
expect(warning).toContain('prjct sync')
|
|
181
|
-
})
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
// ===========================================================================
|
|
185
|
-
// Configuration Tests
|
|
186
|
-
// ===========================================================================
|
|
187
|
-
|
|
188
|
-
describe('configuration', () => {
|
|
189
|
-
it('should use default thresholds', () => {
|
|
190
|
-
const checker = createStalenessChecker(process.cwd())
|
|
191
|
-
// Default commitThreshold is 10, dayThreshold is 3
|
|
192
|
-
expect(checker).toBeDefined()
|
|
193
|
-
})
|
|
194
|
-
|
|
195
|
-
it('should accept custom thresholds', () => {
|
|
196
|
-
const checker = createStalenessChecker(process.cwd(), {
|
|
197
|
-
commitThreshold: 5,
|
|
198
|
-
dayThreshold: 1,
|
|
199
|
-
significantFiles: ['custom.config.js'],
|
|
200
|
-
})
|
|
201
|
-
expect(checker).toBeDefined()
|
|
202
|
-
})
|
|
203
|
-
})
|
|
204
|
-
})
|