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,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Activity Stream
|
|
3
|
-
*
|
|
4
|
-
* Shows real-time agent activity during task execution.
|
|
5
|
-
* Provides visibility into which agents are working and what they're doing.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import chalk from 'chalk'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Domain icons for visual identification
|
|
12
|
-
*/
|
|
13
|
-
const DOMAIN_ICONS: Record<string, string> = {
|
|
14
|
-
database: '💾',
|
|
15
|
-
backend: '🔧',
|
|
16
|
-
frontend: '📦',
|
|
17
|
-
testing: '🧪',
|
|
18
|
-
devops: '🚀',
|
|
19
|
-
uxui: '🎨',
|
|
20
|
-
security: '🔒',
|
|
21
|
-
docs: '📝',
|
|
22
|
-
api: '🌐',
|
|
23
|
-
default: '⚡',
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Get icon for a domain
|
|
28
|
-
*/
|
|
29
|
-
function getIcon(domain: string): string {
|
|
30
|
-
return DOMAIN_ICONS[domain.toLowerCase()] || DOMAIN_ICONS.default
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Agent Stream - Visual activity tracker
|
|
35
|
-
*/
|
|
36
|
-
class AgentStream {
|
|
37
|
-
private currentAgent: string | null = null
|
|
38
|
-
private startTime: number = 0
|
|
39
|
-
private quiet: boolean = false
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Set quiet mode (no output)
|
|
43
|
-
*/
|
|
44
|
-
setQuiet(quiet: boolean): void {
|
|
45
|
-
this.quiet = quiet
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Show orchestration start
|
|
50
|
-
*/
|
|
51
|
-
orchestrate(domains: string[]): void {
|
|
52
|
-
if (this.quiet) return
|
|
53
|
-
console.log(chalk.cyan(`\n🎯 Orchestrating: ${domains.join(', ')} domains detected\n`))
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Start an agent activity block
|
|
58
|
-
*/
|
|
59
|
-
startAgent(name: string, domain: string, description?: string): void {
|
|
60
|
-
if (this.quiet) return
|
|
61
|
-
|
|
62
|
-
this.currentAgent = name
|
|
63
|
-
this.startTime = Date.now()
|
|
64
|
-
|
|
65
|
-
const icon = getIcon(domain)
|
|
66
|
-
console.log(chalk.cyan(`┌─ ${icon} ${name} (${domain})`))
|
|
67
|
-
|
|
68
|
-
if (description) {
|
|
69
|
-
console.log(chalk.dim(`│ ${description}`))
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Show progress within current agent
|
|
75
|
-
*/
|
|
76
|
-
progress(message: string): void {
|
|
77
|
-
if (this.quiet || !this.currentAgent) return
|
|
78
|
-
console.log(chalk.dim(`│ └── ${message}`))
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Show multiple progress items
|
|
83
|
-
*/
|
|
84
|
-
progressList(items: string[]): void {
|
|
85
|
-
if (this.quiet || !this.currentAgent) return
|
|
86
|
-
for (const item of items) {
|
|
87
|
-
console.log(chalk.dim(`│ └── ${item}`))
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* End current agent block
|
|
93
|
-
*/
|
|
94
|
-
endAgent(success: boolean = true): void {
|
|
95
|
-
if (this.quiet || !this.currentAgent) return
|
|
96
|
-
|
|
97
|
-
const duration = Date.now() - this.startTime
|
|
98
|
-
const durationStr = this.formatDuration(duration)
|
|
99
|
-
|
|
100
|
-
const icon = success ? chalk.green('✓') : chalk.red('✗')
|
|
101
|
-
const status = success ? 'Complete' : 'Failed'
|
|
102
|
-
|
|
103
|
-
console.log(`└─ ${icon} ${status} ${chalk.dim(`(${durationStr})`)}\n`)
|
|
104
|
-
this.currentAgent = null
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Show a simple status line (no block)
|
|
109
|
-
*/
|
|
110
|
-
status(icon: string, message: string): void {
|
|
111
|
-
if (this.quiet) return
|
|
112
|
-
console.log(`${icon} ${message}`)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Show task completion summary
|
|
117
|
-
*/
|
|
118
|
-
complete(taskName: string, totalDuration?: number): void {
|
|
119
|
-
if (this.quiet) return
|
|
120
|
-
|
|
121
|
-
const durationStr = totalDuration
|
|
122
|
-
? ` ${chalk.dim(`[${this.formatDuration(totalDuration)}]`)}`
|
|
123
|
-
: ''
|
|
124
|
-
console.log(chalk.green(`✅ ${taskName}${durationStr}`))
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Format duration in human-readable form
|
|
129
|
-
*/
|
|
130
|
-
private formatDuration(ms: number): string {
|
|
131
|
-
if (ms < 1000) return `${ms}ms`
|
|
132
|
-
const seconds = (ms / 1000).toFixed(1)
|
|
133
|
-
return `${seconds}s`
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Singleton instance
|
|
138
|
-
export const agentStream = new AgentStream()
|
|
139
|
-
|
|
140
|
-
export default agentStream
|
package/core/utils/animations.ts
DELETED
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple animations with basic colors for better compatibility
|
|
3
|
-
* Fallback when terminal doesn't support RGB colors
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import chalk from 'chalk'
|
|
7
|
-
|
|
8
|
-
type ChalkFunction = typeof chalk.green
|
|
9
|
-
|
|
10
|
-
interface Colors {
|
|
11
|
-
success: ChalkFunction
|
|
12
|
-
error: ChalkFunction
|
|
13
|
-
warning: ChalkFunction
|
|
14
|
-
info: ChalkFunction
|
|
15
|
-
ship: ChalkFunction
|
|
16
|
-
celebrate: ChalkFunction
|
|
17
|
-
focus: ChalkFunction
|
|
18
|
-
idea: ChalkFunction
|
|
19
|
-
progress: ChalkFunction
|
|
20
|
-
task: ChalkFunction
|
|
21
|
-
primary: ChalkFunction
|
|
22
|
-
secondary: ChalkFunction
|
|
23
|
-
text: ChalkFunction
|
|
24
|
-
subtext: ChalkFunction
|
|
25
|
-
dim: ChalkFunction
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
interface Frames {
|
|
29
|
-
rocket: string[]
|
|
30
|
-
sparkles: string[]
|
|
31
|
-
loading: string[]
|
|
32
|
-
progress: string[]
|
|
33
|
-
celebration: string[]
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
interface Banners {
|
|
37
|
-
ship: string
|
|
38
|
-
success: string
|
|
39
|
-
error: string
|
|
40
|
-
welcome: string
|
|
41
|
-
cleanup: string
|
|
42
|
-
focus: string
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
interface RecapData {
|
|
46
|
-
currentTask?: string | null
|
|
47
|
-
shippedCount: number
|
|
48
|
-
queuedCount: number
|
|
49
|
-
ideasCount: number
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export const colors: Colors = {
|
|
53
|
-
success: chalk.green,
|
|
54
|
-
error: chalk.red,
|
|
55
|
-
warning: chalk.yellow,
|
|
56
|
-
info: chalk.blue,
|
|
57
|
-
ship: chalk.cyan,
|
|
58
|
-
celebrate: chalk.magenta,
|
|
59
|
-
focus: chalk.green.bold,
|
|
60
|
-
idea: chalk.yellow,
|
|
61
|
-
progress: chalk.blue,
|
|
62
|
-
task: chalk.cyan,
|
|
63
|
-
primary: chalk.magenta,
|
|
64
|
-
secondary: chalk.cyan,
|
|
65
|
-
text: chalk.white,
|
|
66
|
-
subtext: chalk.gray,
|
|
67
|
-
dim: chalk.gray,
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export const frames: Frames = {
|
|
71
|
-
rocket: [
|
|
72
|
-
' 🚀 ',
|
|
73
|
-
' 🚀 ',
|
|
74
|
-
' 🚀 ',
|
|
75
|
-
' 🚀 ',
|
|
76
|
-
' 🚀 ',
|
|
77
|
-
'🚀 ',
|
|
78
|
-
],
|
|
79
|
-
sparkles: [
|
|
80
|
-
'✨ ・ 。゚☆: *.☽ .* :☆゚. ✨',
|
|
81
|
-
'・ 。゚☆: *.☽ .* :☆゚. ✨ ・',
|
|
82
|
-
'。゚☆: *.☽ .* :☆゚. ✨ ・ 。゚',
|
|
83
|
-
'☆: *.☽ .* :☆゚. ✨ ・ 。゚☆:',
|
|
84
|
-
],
|
|
85
|
-
loading: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],
|
|
86
|
-
progress: [
|
|
87
|
-
'[ ]',
|
|
88
|
-
'[▓ ]',
|
|
89
|
-
'[▓▓ ]',
|
|
90
|
-
'[▓▓▓ ]',
|
|
91
|
-
'[▓▓▓▓ ]',
|
|
92
|
-
'[▓▓▓▓▓ ]',
|
|
93
|
-
'[▓▓▓▓▓▓ ]',
|
|
94
|
-
'[▓▓▓▓▓▓▓ ]',
|
|
95
|
-
'[▓▓▓▓▓▓▓▓ ]',
|
|
96
|
-
'[▓▓▓▓▓▓▓▓▓ ]',
|
|
97
|
-
'[▓▓▓▓▓▓▓▓▓▓]',
|
|
98
|
-
],
|
|
99
|
-
celebration: ['🎉', '🎊', '✨', '🌟', '⭐', '💫', '🎆', '🎇'],
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export const banners: Banners = {
|
|
103
|
-
ship: `
|
|
104
|
-
╔════════════════════════════════════════════╗
|
|
105
|
-
║ 🚀 ${colors.ship.bold('S H I P P E D !')} 🚀 ║
|
|
106
|
-
╚════════════════════════════════════════════╝`,
|
|
107
|
-
|
|
108
|
-
success: `
|
|
109
|
-
✨ ${colors.success.bold('Success!')} ✨`,
|
|
110
|
-
|
|
111
|
-
error: `
|
|
112
|
-
❌ ${colors.error.bold('Error')} ❌`,
|
|
113
|
-
|
|
114
|
-
welcome: `
|
|
115
|
-
${colors.primary('╔══════════════════════════════════════════════════╗')}
|
|
116
|
-
${colors.primary('║')} ${colors.text.bold('🚀 prjct')}${colors.primary('/')}${colors.secondary.bold('cli')} ${colors.primary('║')}
|
|
117
|
-
${colors.primary('║')} ${colors.dim('Ship faster with zero friction')} ${colors.primary('║')}
|
|
118
|
-
${colors.primary('╚══════════════════════════════════════════════════╝')}`,
|
|
119
|
-
|
|
120
|
-
cleanup: `
|
|
121
|
-
${colors.focus('🧹 ✨ Cleanup Magic ✨ 🧹')}`,
|
|
122
|
-
|
|
123
|
-
focus: `
|
|
124
|
-
${colors.focus('━━━━━━━━━━━━━━━━━━━━━━━')}
|
|
125
|
-
${colors.focus.bold(' 🎯 FOCUS MODE 🎯 ')}
|
|
126
|
-
${colors.focus('━━━━━━━━━━━━━━━━━━━━━━━')}`,
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
function sleep(ms: number): Promise<void> {
|
|
130
|
-
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export async function animate(frameList: string[], duration = 100): Promise<void> {
|
|
134
|
-
for (const frame of frameList) {
|
|
135
|
-
process.stdout.write(`\r${frame}`)
|
|
136
|
-
await sleep(duration)
|
|
137
|
-
}
|
|
138
|
-
process.stdout.write(`\r${' '.repeat(30)}\r`)
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export async function typeWriter(text: string, delay = 30): Promise<void> {
|
|
142
|
-
for (let i = 0; i <= text.length; i++) {
|
|
143
|
-
process.stdout.write(`\r${text.slice(0, i)}${i < text.length ? '▋' : ''}`)
|
|
144
|
-
await sleep(delay)
|
|
145
|
-
}
|
|
146
|
-
process.stdout.write('\n')
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export async function progressBar(duration = 1000, label = 'Processing'): Promise<void> {
|
|
150
|
-
const steps = 20
|
|
151
|
-
const stepDuration = duration / steps
|
|
152
|
-
|
|
153
|
-
for (let i = 0; i <= steps; i++) {
|
|
154
|
-
const percent = Math.round((i / steps) * 100)
|
|
155
|
-
const filled = '▓'.repeat(i)
|
|
156
|
-
const empty = '░'.repeat(steps - i)
|
|
157
|
-
const bar = `${colors.dim(label)} [${colors.primary(filled)}${colors.dim(empty)}] ${colors.text(`${percent}%`)}`
|
|
158
|
-
process.stdout.write(`\r${bar}`)
|
|
159
|
-
await sleep(stepDuration)
|
|
160
|
-
}
|
|
161
|
-
process.stdout.write('\n')
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export async function sparkle(message: string): Promise<void> {
|
|
165
|
-
const sparkles = ['✨', '⭐', '💫', '🌟']
|
|
166
|
-
let output = ''
|
|
167
|
-
|
|
168
|
-
for (let i = 0; i < 3; i++) {
|
|
169
|
-
const spark = sparkles[Math.floor(Math.random() * sparkles.length)]
|
|
170
|
-
output = `${spark} ${message} ${spark}`
|
|
171
|
-
process.stdout.write(`\r${output}`)
|
|
172
|
-
await sleep(200)
|
|
173
|
-
process.stdout.write(`\r${' '.repeat(output.length)}`)
|
|
174
|
-
await sleep(100)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
console.log(output)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export function formatShip(feature: string, count: number): string {
|
|
181
|
-
const banner = banners.ship
|
|
182
|
-
const stats = `
|
|
183
|
-
${colors.text('Feature:')} ${colors.ship.bold(feature)}
|
|
184
|
-
${colors.text('Total shipped:')} ${colors.success.bold(String(count))}
|
|
185
|
-
${colors.text('Velocity:')} ${colors.celebrate('🔥 On fire!')}
|
|
186
|
-
`
|
|
187
|
-
|
|
188
|
-
return banner + stats
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export function formatFocus(task: string, timestamp: string): string {
|
|
192
|
-
const banner = banners.focus
|
|
193
|
-
const info = `
|
|
194
|
-
${colors.text('Current task:')} ${colors.focus.bold(task)}
|
|
195
|
-
${colors.dim('Started:')} ${colors.subtext(timestamp)}
|
|
196
|
-
`
|
|
197
|
-
|
|
198
|
-
return banner + info
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export function formatSuccess(message: string): string {
|
|
202
|
-
return `${colors.success('✅')} ${colors.text(message)}`
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export function formatError(message: string): string {
|
|
206
|
-
return `${colors.error('❌')} ${colors.text(message)}`
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export function formatIdea(idea: string): string {
|
|
210
|
-
return `
|
|
211
|
-
${colors.idea('💡 Idea captured!')}
|
|
212
|
-
${colors.text('―'.repeat(30))}
|
|
213
|
-
${colors.subtext(idea)}
|
|
214
|
-
${colors.text('―'.repeat(30))}
|
|
215
|
-
${colors.dim('Added to your ideas backlog')}
|
|
216
|
-
`
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export function formatCleanup(
|
|
220
|
-
filesRemoved: number,
|
|
221
|
-
tasksArchived: number,
|
|
222
|
-
spaceFeed: number
|
|
223
|
-
): string {
|
|
224
|
-
return `
|
|
225
|
-
${banners.cleanup}
|
|
226
|
-
|
|
227
|
-
${colors.text('🗑️ Files removed:')} ${colors.success.bold(String(filesRemoved))}
|
|
228
|
-
${colors.text('📦 Tasks archived:')} ${colors.success.bold(String(tasksArchived))}
|
|
229
|
-
${colors.text('💾 Space freed:')} ${colors.success.bold(`${spaceFeed} MB`)}
|
|
230
|
-
|
|
231
|
-
${colors.celebrate('✨ Your project is clean and lean!')}
|
|
232
|
-
`
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export function formatRecap(data: RecapData): string {
|
|
236
|
-
const divider = colors.primary('━'.repeat(40))
|
|
237
|
-
|
|
238
|
-
return `
|
|
239
|
-
${divider}
|
|
240
|
-
${colors.primary.bold('📊 PROJECT RECAP')}
|
|
241
|
-
${divider}
|
|
242
|
-
|
|
243
|
-
${colors.text('🎯 Current focus:')} ${data.currentTask || colors.dim('No active task')}
|
|
244
|
-
${colors.text('🚀 Shipped this week:')} ${colors.success.bold(String(data.shippedCount))}
|
|
245
|
-
${colors.text('📝 Queued tasks:')} ${colors.info.bold(String(data.queuedCount))}
|
|
246
|
-
${colors.text('💡 Ideas captured:')} ${colors.idea.bold(String(data.ideasCount))}
|
|
247
|
-
|
|
248
|
-
${divider}
|
|
249
|
-
${colors.dim('Keep shipping! 🚀')}
|
|
250
|
-
`
|
|
251
|
-
}
|
package/core/utils/branding.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Branding Configuration for prjct-cli
|
|
3
|
-
* Single source of truth for all branding across CLI and AI agents
|
|
4
|
-
*
|
|
5
|
-
* Supports multiple AI providers (Claude Code, Gemini CLI)
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import chalk from 'chalk'
|
|
9
|
-
import { getProviderBranding } from '../infrastructure/ai-provider'
|
|
10
|
-
import type { AIProviderName } from '../types/provider'
|
|
11
|
-
|
|
12
|
-
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
|
|
13
|
-
const SPINNER_SPEED = 80
|
|
14
|
-
|
|
15
|
-
interface Branding {
|
|
16
|
-
name: string
|
|
17
|
-
icon: string
|
|
18
|
-
signature: string
|
|
19
|
-
spinner: {
|
|
20
|
-
frames: string[]
|
|
21
|
-
speed: number
|
|
22
|
-
}
|
|
23
|
-
cli: {
|
|
24
|
-
header: () => string
|
|
25
|
-
footer: () => string
|
|
26
|
-
spin: (frame: number, msg?: string) => string
|
|
27
|
-
}
|
|
28
|
-
template: {
|
|
29
|
-
header: string
|
|
30
|
-
footer: string
|
|
31
|
-
}
|
|
32
|
-
commitFooter: string
|
|
33
|
-
urls: {
|
|
34
|
-
website: string
|
|
35
|
-
docs: string
|
|
36
|
-
}
|
|
37
|
-
// Provider-aware methods
|
|
38
|
-
getCommitFooter: (provider?: AIProviderName) => string
|
|
39
|
-
getSignature: (provider?: AIProviderName) => string
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const branding: Branding = {
|
|
43
|
-
// Core identity
|
|
44
|
-
name: 'prjct',
|
|
45
|
-
icon: '⚡',
|
|
46
|
-
signature: '⚡ prjct',
|
|
47
|
-
|
|
48
|
-
// Spinner config
|
|
49
|
-
spinner: {
|
|
50
|
-
frames: SPINNER_FRAMES,
|
|
51
|
-
speed: SPINNER_SPEED,
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
// CLI output (with chalk colors)
|
|
55
|
-
cli: {
|
|
56
|
-
header: () => `${chalk.cyan.bold('⚡')} ${chalk.cyan('prjct')}`,
|
|
57
|
-
footer: () => chalk.dim('⚡ prjct'),
|
|
58
|
-
spin: (frame: number, msg?: string) =>
|
|
59
|
-
`${chalk.cyan('⚡')} ${chalk.cyan('prjct')} ${chalk.cyan(SPINNER_FRAMES[frame % 10])} ${chalk.dim(msg || '')}`,
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
// Template (plain text)
|
|
63
|
-
template: {
|
|
64
|
-
header: '⚡ prjct',
|
|
65
|
-
footer: '⚡ prjct',
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
// Default Git commit footer (generic)
|
|
69
|
-
commitFooter: `Generated with [p/](https://www.prjct.app/)`,
|
|
70
|
-
|
|
71
|
-
// URLs
|
|
72
|
-
urls: {
|
|
73
|
-
website: 'https://prjct.app',
|
|
74
|
-
docs: 'https://prjct.app/docs',
|
|
75
|
-
},
|
|
76
|
-
|
|
77
|
-
// Provider-aware commit footer
|
|
78
|
-
getCommitFooter: (provider: AIProviderName = 'claude') => {
|
|
79
|
-
return getProviderBranding(provider).commitFooter
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
// Provider-aware signature
|
|
83
|
-
getSignature: (provider: AIProviderName = 'claude') => {
|
|
84
|
-
return getProviderBranding(provider).signature
|
|
85
|
-
},
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export default branding
|
package/core/utils/cache.ts
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cache Utilities - Shared caching primitives for storage layers
|
|
3
|
-
*
|
|
4
|
-
* Provides two cache implementations:
|
|
5
|
-
* - TTLCache: Time-based cache with LRU eviction (for StorageManager)
|
|
6
|
-
* - LazyCache: Single-project lazy loading cache (for memory system)
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { CacheEntry, CacheOptions, CacheStats } from '../types'
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* TTL Cache with LRU eviction
|
|
13
|
-
*
|
|
14
|
-
* Used by StorageManager for project-keyed caching.
|
|
15
|
-
* Automatically evicts expired entries and oldest entries when over capacity.
|
|
16
|
-
*/
|
|
17
|
-
export class TTLCache<T> {
|
|
18
|
-
private cache = new Map<string, CacheEntry<T>>()
|
|
19
|
-
private readonly ttl: number
|
|
20
|
-
private readonly maxSize: number
|
|
21
|
-
|
|
22
|
-
constructor(options: CacheOptions = {}) {
|
|
23
|
-
this.ttl = options.ttl ?? 5000
|
|
24
|
-
this.maxSize = options.maxSize ?? 50
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Check if entry exists and is not expired
|
|
29
|
-
*/
|
|
30
|
-
isValid(key: string): boolean {
|
|
31
|
-
const entry = this.cache.get(key)
|
|
32
|
-
if (!entry) return false
|
|
33
|
-
return Date.now() - entry.timestamp < this.ttl
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Get entry if valid, otherwise null
|
|
38
|
-
*/
|
|
39
|
-
get(key: string): T | null {
|
|
40
|
-
const entry = this.cache.get(key)
|
|
41
|
-
|
|
42
|
-
if (!entry) return null
|
|
43
|
-
|
|
44
|
-
if (!this.isValid(key)) {
|
|
45
|
-
this.cache.delete(key)
|
|
46
|
-
return null
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return entry.data
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Set entry with current timestamp
|
|
54
|
-
*/
|
|
55
|
-
set(key: string, data: T): void {
|
|
56
|
-
this.cache.set(key, { data, timestamp: Date.now() })
|
|
57
|
-
this.evictOldEntries()
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Delete entry
|
|
62
|
-
*/
|
|
63
|
-
delete(key: string): void {
|
|
64
|
-
this.cache.delete(key)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Clear all entries
|
|
69
|
-
*/
|
|
70
|
-
clear(): void {
|
|
71
|
-
this.cache.clear()
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Check if key exists (may be expired)
|
|
76
|
-
*/
|
|
77
|
-
has(key: string): boolean {
|
|
78
|
-
return this.cache.has(key)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Get number of entries (including expired)
|
|
83
|
-
*/
|
|
84
|
-
get size(): number {
|
|
85
|
-
return this.cache.size
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Evict oldest entries if over max size
|
|
90
|
-
*/
|
|
91
|
-
private evictOldEntries(): void {
|
|
92
|
-
if (this.cache.size <= this.maxSize) return
|
|
93
|
-
|
|
94
|
-
const entries = Array.from(this.cache.entries()).sort((a, b) => a[1].timestamp - b[1].timestamp)
|
|
95
|
-
|
|
96
|
-
const toRemove = entries.slice(0, this.cache.size - this.maxSize)
|
|
97
|
-
for (const [key] of toRemove) {
|
|
98
|
-
this.cache.delete(key)
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Get cache statistics
|
|
104
|
-
*/
|
|
105
|
-
stats(): CacheStats {
|
|
106
|
-
return {
|
|
107
|
-
size: this.cache.size,
|
|
108
|
-
maxSize: this.maxSize,
|
|
109
|
-
ttl: this.ttl,
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Remove all expired entries
|
|
115
|
-
*/
|
|
116
|
-
prune(): number {
|
|
117
|
-
let removed = 0
|
|
118
|
-
for (const key of this.cache.keys()) {
|
|
119
|
-
if (!this.isValid(key)) {
|
|
120
|
-
this.cache.delete(key)
|
|
121
|
-
removed++
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return removed
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Single-project lazy cache
|
|
130
|
-
*
|
|
131
|
-
* Used by CachedStore for memory system (one project at a time).
|
|
132
|
-
* Simpler than TTLCache - just tracks if data is loaded for current project.
|
|
133
|
-
*/
|
|
134
|
-
export class LazyCache<T> {
|
|
135
|
-
private data: T | null = null
|
|
136
|
-
private loaded = false
|
|
137
|
-
private projectId: string | null = null
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Check if loaded for a specific project
|
|
141
|
-
*/
|
|
142
|
-
isLoaded(projectId?: string): boolean {
|
|
143
|
-
if (projectId) {
|
|
144
|
-
return this.loaded && this.projectId === projectId
|
|
145
|
-
}
|
|
146
|
-
return this.loaded
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Get cached data (may be null if not loaded)
|
|
151
|
-
*/
|
|
152
|
-
get(): T | null {
|
|
153
|
-
return this.data
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Set data for a project
|
|
158
|
-
*/
|
|
159
|
-
set(projectId: string, data: T): void {
|
|
160
|
-
this.data = data
|
|
161
|
-
this.loaded = true
|
|
162
|
-
this.projectId = projectId
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Reset cache
|
|
167
|
-
*/
|
|
168
|
-
reset(): void {
|
|
169
|
-
this.data = null
|
|
170
|
-
this.loaded = false
|
|
171
|
-
this.projectId = null
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Get current project ID
|
|
176
|
-
*/
|
|
177
|
-
getProjectId(): string | null {
|
|
178
|
-
return this.projectId
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Check if cache is empty
|
|
183
|
-
*/
|
|
184
|
-
isEmpty(): boolean {
|
|
185
|
-
return !this.loaded || this.data === null
|
|
186
|
-
}
|
|
187
|
-
}
|
package/core/utils/citations.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Citation utilities for context source tracking
|
|
3
|
-
*
|
|
4
|
-
* Generates HTML comments indicating where each section's data came from.
|
|
5
|
-
* Source types: detected (from files), user-defined (from config), inferred (from heuristics)
|
|
6
|
-
*
|
|
7
|
-
* @see PRJ-113
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { ContextSources, SourceInfo } from '../types/citations'
|
|
11
|
-
|
|
12
|
-
export type { ContextSources, SourceInfo, SourceType } from '../types/citations'
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Generate an HTML citation comment
|
|
16
|
-
*
|
|
17
|
-
* @example cite({ file: 'package.json', type: 'detected' })
|
|
18
|
-
* // => '<!-- source: package.json, detected -->'
|
|
19
|
-
*/
|
|
20
|
-
export function cite(source: SourceInfo): string {
|
|
21
|
-
return `<!-- source: ${source.file}, ${source.type} -->`
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Create default sources (all unknown) - used as fallback
|
|
26
|
-
*/
|
|
27
|
-
export function defaultSources(): ContextSources {
|
|
28
|
-
const unknown: SourceInfo = { file: 'unknown', type: 'detected' }
|
|
29
|
-
return {
|
|
30
|
-
name: { ...unknown },
|
|
31
|
-
version: { ...unknown },
|
|
32
|
-
ecosystem: { ...unknown },
|
|
33
|
-
languages: { ...unknown },
|
|
34
|
-
frameworks: { ...unknown },
|
|
35
|
-
commands: { ...unknown },
|
|
36
|
-
projectType: { ...unknown },
|
|
37
|
-
git: { file: 'git', type: 'detected' },
|
|
38
|
-
}
|
|
39
|
-
}
|