prjct-cli 1.22.0 → 1.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +230 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct-core.mjs +1748 -0
- package/dist/bin/prjct.mjs +17 -36672
- package/dist/cli/linear.mjs +14 -0
- package/dist/daemon/entry.mjs +1429 -0
- package/dist/templates.json +1 -0
- package/package.json +4 -5
- package/bin/prjct.ts +0 -342
- package/core/__tests__/agentic/analysis-injection.test.ts +0 -377
- package/core/__tests__/agentic/cache-eviction.test.ts +0 -294
- package/core/__tests__/agentic/command-context.test.ts +0 -281
- package/core/__tests__/agentic/command-executor.test.ts +0 -659
- package/core/__tests__/agentic/domain-classifier.test.ts +0 -330
- package/core/__tests__/agentic/injection-validator.test.ts +0 -255
- package/core/__tests__/agentic/memory-system.test.ts +0 -281
- package/core/__tests__/agentic/plan-mode.test.ts +0 -386
- package/core/__tests__/agentic/prompt-assembly.test.ts +0 -298
- package/core/__tests__/agentic/prompt-builder.test.ts +0 -243
- package/core/__tests__/agentic/response-validator.test.ts +0 -263
- package/core/__tests__/agentic/semantic-matching.test.ts +0 -131
- package/core/__tests__/agentic/smart-context.test.ts +0 -372
- package/core/__tests__/agentic/tech-normalizer.test.ts +0 -136
- package/core/__tests__/agentic/token-budget.test.ts +0 -294
- package/core/__tests__/ai-tools/formatters.test.ts +0 -476
- package/core/__tests__/domain/bm25.test.ts +0 -225
- package/core/__tests__/domain/change-propagator.test.ts +0 -100
- package/core/__tests__/domain/fibonacci.test.ts +0 -113
- package/core/__tests__/domain/file-hasher.test.ts +0 -146
- package/core/__tests__/domain/file-ranker.test.ts +0 -169
- package/core/__tests__/domain/git-cochange.test.ts +0 -121
- package/core/__tests__/domain/import-graph.test.ts +0 -156
- package/core/__tests__/domain/velocity.test.ts +0 -623
- package/core/__tests__/infrastructure/performance-tracker.test.ts +0 -328
- package/core/__tests__/schemas/model.test.ts +0 -272
- package/core/__tests__/services/dependency-validator.test.ts +0 -175
- package/core/__tests__/services/hierarchical-agent-resolver.test.ts +0 -359
- package/core/__tests__/services/nested-context-resolver.test.ts +0 -443
- package/core/__tests__/services/project-index.test.ts +0 -355
- package/core/__tests__/services/staleness-checker.test.ts +0 -204
- package/core/__tests__/storage/analysis-storage.test.ts +0 -641
- package/core/__tests__/storage/archive-storage.test.ts +0 -455
- package/core/__tests__/storage/safe-reader.test.ts +0 -262
- package/core/__tests__/storage/sqlite-migration.test.ts +0 -1016
- package/core/__tests__/storage/state-storage-feedback.test.ts +0 -463
- package/core/__tests__/storage/state-storage-history.test.ts +0 -469
- package/core/__tests__/storage/storage-manager.test.ts +0 -383
- package/core/__tests__/storage/subtask-handoff.test.ts +0 -237
- package/core/__tests__/types/fs.test.ts +0 -125
- package/core/__tests__/utils/date-helper.test.ts +0 -449
- package/core/__tests__/utils/output.test.ts +0 -278
- package/core/__tests__/utils/preserve-sections.test.ts +0 -216
- package/core/__tests__/utils/project-commands.test.ts +0 -71
- package/core/__tests__/utils/retry.test.ts +0 -381
- package/core/__tests__/workflow/state-machine.test.ts +0 -216
- package/core/agentic/agent-router.ts +0 -150
- package/core/agentic/anti-hallucination.ts +0 -141
- package/core/agentic/chain-of-thought.ts +0 -234
- package/core/agentic/command-classifier.ts +0 -141
- package/core/agentic/command-context.ts +0 -168
- package/core/agentic/command-executor.ts +0 -471
- package/core/agentic/context-builder.ts +0 -285
- package/core/agentic/domain-classifier.ts +0 -525
- package/core/agentic/environment-block.ts +0 -102
- package/core/agentic/ground-truth.ts +0 -706
- package/core/agentic/index.ts +0 -193
- package/core/agentic/injection-validator.ts +0 -208
- package/core/agentic/loop-detector.ts +0 -451
- package/core/agentic/memory-system.ts +0 -1547
- package/core/agentic/orchestrator-executor.ts +0 -579
- package/core/agentic/plan-mode.ts +0 -525
- package/core/agentic/prompt-builder.ts +0 -1069
- package/core/agentic/response-validator.ts +0 -98
- package/core/agentic/services.ts +0 -167
- package/core/agentic/skill-loader.ts +0 -106
- package/core/agentic/smart-context.ts +0 -393
- package/core/agentic/tech-normalizer.ts +0 -167
- package/core/agentic/template-executor.ts +0 -272
- package/core/agentic/template-loader.ts +0 -109
- package/core/agentic/token-budget.ts +0 -226
- package/core/agentic/tool-registry.ts +0 -146
- package/core/agents/index.ts +0 -28
- package/core/agents/performance.ts +0 -429
- package/core/ai-tools/formatters.ts +0 -341
- package/core/ai-tools/generator.ts +0 -144
- package/core/ai-tools/index.ts +0 -15
- package/core/ai-tools/registry.ts +0 -201
- package/core/bus/bus.ts +0 -314
- package/core/bus/index.ts +0 -8
- package/core/cli/linear.ts +0 -500
- package/core/cli/lint-meta-commentary.ts +0 -177
- package/core/cli/start.ts +0 -386
- package/core/commands/analysis.ts +0 -1274
- package/core/commands/analytics.ts +0 -342
- package/core/commands/base.ts +0 -118
- package/core/commands/cleanup.ts +0 -157
- package/core/commands/command-data.ts +0 -463
- package/core/commands/commands.ts +0 -306
- package/core/commands/context.ts +0 -238
- package/core/commands/design.ts +0 -77
- package/core/commands/index.ts +0 -19
- package/core/commands/maintenance.ts +0 -77
- package/core/commands/performance.ts +0 -114
- package/core/commands/planning.ts +0 -662
- package/core/commands/register.ts +0 -127
- package/core/commands/registry.ts +0 -444
- package/core/commands/setup.ts +0 -280
- package/core/commands/shipping.ts +0 -267
- package/core/commands/snapshots.ts +0 -297
- package/core/commands/uninstall.ts +0 -542
- package/core/commands/velocity.ts +0 -149
- package/core/commands/workflow.ts +0 -505
- package/core/config/command-context.config.json +0 -66
- package/core/constants/index.ts +0 -379
- package/core/context/generator.ts +0 -368
- package/core/context-tools/files-tool.ts +0 -577
- package/core/context-tools/imports-tool.ts +0 -400
- package/core/context-tools/index.ts +0 -434
- package/core/context-tools/recent-tool.ts +0 -301
- package/core/context-tools/signatures-tool.ts +0 -495
- package/core/context-tools/summary-tool.ts +0 -301
- package/core/context-tools/token-counter.ts +0 -273
- package/core/context-tools/types.ts +0 -253
- package/core/domain/agent-generator.ts +0 -186
- package/core/domain/agent-loader.ts +0 -419
- package/core/domain/analyzer.ts +0 -387
- package/core/domain/architecture-generator.ts +0 -108
- package/core/domain/bm25.ts +0 -525
- package/core/domain/change-propagator.ts +0 -162
- package/core/domain/context-estimator.ts +0 -175
- package/core/domain/fibonacci.ts +0 -128
- package/core/domain/file-hasher.ts +0 -296
- package/core/domain/file-ranker.ts +0 -151
- package/core/domain/git-cochange.ts +0 -250
- package/core/domain/import-graph.ts +0 -315
- package/core/domain/snapshot-manager.ts +0 -415
- package/core/domain/task-stack.ts +0 -578
- package/core/domain/velocity.ts +0 -470
- package/core/errors.ts +0 -335
- package/core/events/events.ts +0 -85
- package/core/events/index.ts +0 -8
- package/core/index.ts +0 -481
- package/core/infrastructure/agent-detector.ts +0 -135
- package/core/infrastructure/ai-provider.ts +0 -578
- package/core/infrastructure/author-detector.ts +0 -133
- package/core/infrastructure/capability-installer.ts +0 -76
- package/core/infrastructure/claude-agent.ts +0 -297
- package/core/infrastructure/command-installer.ts +0 -752
- package/core/infrastructure/config-manager.ts +0 -364
- package/core/infrastructure/editors-config.ts +0 -172
- package/core/infrastructure/path-manager.ts +0 -571
- package/core/infrastructure/performance-tracker.ts +0 -326
- package/core/infrastructure/permission-manager.ts +0 -289
- package/core/infrastructure/setup.ts +0 -1061
- package/core/infrastructure/update-checker.ts +0 -246
- package/core/integrations/issue-tracker/enricher.ts +0 -271
- package/core/integrations/issue-tracker/index.ts +0 -8
- package/core/integrations/issue-tracker/manager.ts +0 -286
- package/core/integrations/issue-tracker/types.ts +0 -310
- package/core/integrations/jira/cache.ts +0 -57
- package/core/integrations/jira/client.ts +0 -688
- package/core/integrations/jira/index.ts +0 -23
- package/core/integrations/jira/service.ts +0 -244
- package/core/integrations/linear/cache.ts +0 -68
- package/core/integrations/linear/client.ts +0 -436
- package/core/integrations/linear/index.ts +0 -20
- package/core/integrations/linear/service.ts +0 -260
- package/core/integrations/linear/sync.ts +0 -314
- package/core/outcomes/analyzer.ts +0 -286
- package/core/outcomes/index.ts +0 -34
- package/core/outcomes/recorder.ts +0 -195
- package/core/plugin/builtin/webhook.ts +0 -148
- package/core/plugin/hooks.ts +0 -315
- package/core/plugin/index.ts +0 -50
- package/core/plugin/loader.ts +0 -354
- package/core/plugin/registry.ts +0 -326
- package/core/schemas/agents.ts +0 -27
- package/core/schemas/analysis.ts +0 -530
- package/core/schemas/classification.ts +0 -91
- package/core/schemas/command-context.ts +0 -29
- package/core/schemas/enriched-task.ts +0 -291
- package/core/schemas/ideas.ts +0 -114
- package/core/schemas/index.ts +0 -53
- package/core/schemas/issues.ts +0 -159
- package/core/schemas/llm-output.ts +0 -170
- package/core/schemas/metrics.ts +0 -143
- package/core/schemas/model.ts +0 -153
- package/core/schemas/outcomes.ts +0 -487
- package/core/schemas/performance.ts +0 -128
- package/core/schemas/permissions.ts +0 -180
- package/core/schemas/prd.ts +0 -450
- package/core/schemas/project.ts +0 -57
- package/core/schemas/roadmap.ts +0 -322
- package/core/schemas/schemas.ts +0 -38
- package/core/schemas/shipped.ts +0 -109
- package/core/schemas/state.ts +0 -284
- package/core/schemas/velocity.ts +0 -103
- package/core/server/index.ts +0 -21
- package/core/server/routes-extended.ts +0 -566
- package/core/server/routes.ts +0 -176
- package/core/server/server.ts +0 -149
- package/core/server/sse.ts +0 -192
- package/core/services/agent-generator.ts +0 -385
- package/core/services/agent-service.ts +0 -168
- package/core/services/breakdown-service.ts +0 -124
- package/core/services/context-generator.ts +0 -445
- package/core/services/context-selector.ts +0 -429
- package/core/services/dependency-validator.ts +0 -318
- package/core/services/diff-generator.ts +0 -313
- package/core/services/doctor-service.ts +0 -423
- package/core/services/file-categorizer.ts +0 -448
- package/core/services/file-scorer.ts +0 -270
- package/core/services/git-analyzer.ts +0 -293
- package/core/services/hierarchical-agent-resolver.ts +0 -236
- package/core/services/hooks-service.ts +0 -685
- package/core/services/index.ts +0 -46
- package/core/services/local-state-generator.ts +0 -158
- package/core/services/memory-service.ts +0 -181
- package/core/services/nested-context-resolver.ts +0 -842
- package/core/services/project-index.ts +0 -911
- package/core/services/project-service.ts +0 -155
- package/core/services/session-tracker.ts +0 -287
- package/core/services/skill-installer.ts +0 -447
- package/core/services/skill-lock.ts +0 -132
- package/core/services/skill-service.ts +0 -306
- package/core/services/stack-detector.ts +0 -229
- package/core/services/staleness-checker.ts +0 -327
- package/core/services/sync-service.ts +0 -1515
- package/core/services/sync-verifier.ts +0 -253
- package/core/services/watch-service.ts +0 -312
- package/core/session/compaction.ts +0 -248
- package/core/session/index.ts +0 -35
- package/core/session/log-migration.ts +0 -88
- package/core/session/metrics.ts +0 -323
- package/core/session/session-log-manager.ts +0 -307
- package/core/session/task-session-manager.ts +0 -404
- package/core/session/utils.ts +0 -51
- package/core/storage/analysis-storage.ts +0 -373
- package/core/storage/archive-storage.ts +0 -205
- package/core/storage/database.ts +0 -575
- package/core/storage/ideas-storage.ts +0 -298
- package/core/storage/index-storage.ts +0 -523
- package/core/storage/index.ts +0 -79
- package/core/storage/metrics-storage.ts +0 -321
- package/core/storage/migrate-json.ts +0 -720
- package/core/storage/queue-storage.ts +0 -336
- package/core/storage/safe-reader.ts +0 -105
- package/core/storage/shipped-storage.ts +0 -253
- package/core/storage/state-storage.ts +0 -1035
- package/core/storage/storage-manager.ts +0 -205
- package/core/storage/storage.ts +0 -177
- package/core/storage/velocity-storage.ts +0 -149
- package/core/sync/auth-config.ts +0 -138
- package/core/sync/index.ts +0 -31
- package/core/sync/oauth-handler.ts +0 -143
- package/core/sync/sync-client.ts +0 -251
- package/core/sync/sync-manager.ts +0 -327
- package/core/tsconfig.json +0 -22
- package/core/types/agentic.ts +0 -760
- package/core/types/agents.ts +0 -150
- package/core/types/bus.ts +0 -193
- package/core/types/citations.ts +0 -22
- package/core/types/commands.ts +0 -399
- package/core/types/config.ts +0 -92
- package/core/types/core.ts +0 -96
- package/core/types/diff.ts +0 -41
- package/core/types/domain.ts +0 -71
- package/core/types/errors.ts +0 -111
- package/core/types/events.ts +0 -42
- package/core/types/fs.ts +0 -72
- package/core/types/index.ts +0 -510
- package/core/types/infrastructure.ts +0 -210
- package/core/types/integrations.ts +0 -31
- package/core/types/jira.ts +0 -51
- package/core/types/logger.ts +0 -17
- package/core/types/memory.ts +0 -313
- package/core/types/outcomes.ts +0 -190
- package/core/types/output.ts +0 -47
- package/core/types/plugin.ts +0 -25
- package/core/types/project-sync.ts +0 -129
- package/core/types/provider.ts +0 -163
- package/core/types/server.ts +0 -71
- package/core/types/services.ts +0 -84
- package/core/types/session.ts +0 -135
- package/core/types/stack.ts +0 -19
- package/core/types/storage.ts +0 -318
- package/core/types/sync-verifier.ts +0 -33
- package/core/types/sync.ts +0 -121
- package/core/types/task.ts +0 -72
- package/core/types/template.ts +0 -24
- package/core/types/utils.ts +0 -92
- package/core/types/workflow.ts +0 -23
- package/core/utils/agent-stream.ts +0 -140
- package/core/utils/animations.ts +0 -251
- package/core/utils/branding.ts +0 -88
- package/core/utils/cache.ts +0 -187
- package/core/utils/citations.ts +0 -39
- package/core/utils/collection-filters.ts +0 -209
- package/core/utils/date-helper.ts +0 -176
- package/core/utils/error-messages.ts +0 -38
- package/core/utils/file-helper.ts +0 -277
- package/core/utils/fs-helpers.ts +0 -14
- package/core/utils/help.ts +0 -314
- package/core/utils/jsonl-helper.ts +0 -290
- package/core/utils/keychain.ts +0 -127
- package/core/utils/logger.ts +0 -77
- package/core/utils/markdown-builder.ts +0 -280
- package/core/utils/next-steps.ts +0 -95
- package/core/utils/output.ts +0 -403
- package/core/utils/preserve-sections.ts +0 -218
- package/core/utils/project-commands.ts +0 -126
- package/core/utils/project-credentials.ts +0 -143
- package/core/utils/provider-cache.ts +0 -49
- package/core/utils/retry.ts +0 -318
- package/core/utils/runtime.ts +0 -108
- package/core/utils/session-helper.ts +0 -278
- package/core/utils/subtask-table.ts +0 -227
- package/core/utils/version.ts +0 -128
- package/core/wizard/index.ts +0 -13
- package/core/wizard/onboarding.ts +0 -633
- package/core/workflow/index.ts +0 -7
- package/core/workflow/state-machine.ts +0 -198
- package/core/workflow/workflow-preferences.ts +0 -294
- package/dist/core/infrastructure/command-installer.js +0 -1141
- package/dist/core/infrastructure/editors-config.js +0 -177
- package/dist/core/infrastructure/setup.js +0 -2244
- package/dist/core/utils/version.js +0 -141
- package/templates/agentic/agent-routing.md +0 -45
- package/templates/agentic/agents/uxui.md +0 -63
- package/templates/agentic/checklist-routing.md +0 -98
- package/templates/agentic/orchestrator.md +0 -68
- package/templates/agentic/task-fragmentation.md +0 -89
- package/templates/agents/AGENTS.md +0 -68
- package/templates/analysis/analyze.md +0 -84
- package/templates/analysis/patterns.md +0 -60
- package/templates/antigravity/SKILL.md +0 -39
- package/templates/architect/discovery.md +0 -67
- package/templates/architect/phases.md +0 -59
- package/templates/checklists/architecture.md +0 -28
- package/templates/checklists/code-quality.md +0 -28
- package/templates/checklists/data.md +0 -33
- package/templates/checklists/documentation.md +0 -33
- package/templates/checklists/infrastructure.md +0 -33
- package/templates/checklists/performance.md +0 -33
- package/templates/checklists/security.md +0 -33
- package/templates/checklists/testing.md +0 -33
- package/templates/checklists/ux-ui.md +0 -37
- package/templates/commands/analyze.md +0 -56
- package/templates/commands/auth.md +0 -234
- package/templates/commands/bug.md +0 -163
- package/templates/commands/cleanup.md +0 -19
- package/templates/commands/dash.md +0 -99
- package/templates/commands/design.md +0 -15
- package/templates/commands/done.md +0 -291
- package/templates/commands/enrich.md +0 -174
- package/templates/commands/git.md +0 -295
- package/templates/commands/history.md +0 -389
- package/templates/commands/idea.md +0 -88
- package/templates/commands/impact.md +0 -864
- package/templates/commands/init.md +0 -54
- package/templates/commands/jira.md +0 -278
- package/templates/commands/linear.md +0 -288
- package/templates/commands/merge.md +0 -206
- package/templates/commands/next.md +0 -80
- package/templates/commands/p.md +0 -67
- package/templates/commands/p.toml +0 -37
- package/templates/commands/pause.md +0 -136
- package/templates/commands/plan.md +0 -696
- package/templates/commands/prd.md +0 -356
- package/templates/commands/resume.md +0 -171
- package/templates/commands/review.md +0 -276
- package/templates/commands/serve.md +0 -118
- package/templates/commands/setup.md +0 -91
- package/templates/commands/ship.md +0 -475
- package/templates/commands/skill.md +0 -259
- package/templates/commands/spec.md +0 -218
- package/templates/commands/status.md +0 -207
- package/templates/commands/sync.md +0 -104
- package/templates/commands/task.md +0 -312
- package/templates/commands/test.md +0 -93
- package/templates/commands/update.md +0 -63
- package/templates/commands/verify.md +0 -204
- package/templates/commands/workflow.md +0 -150
- package/templates/config/skill-mappings.json +0 -82
- package/templates/context/dashboard.md +0 -256
- package/templates/context/roadmap.md +0 -221
- package/templates/cursor/commands/bug.md +0 -8
- package/templates/cursor/commands/done.md +0 -4
- package/templates/cursor/commands/pause.md +0 -6
- package/templates/cursor/commands/resume.md +0 -4
- package/templates/cursor/commands/ship.md +0 -8
- package/templates/cursor/commands/sync.md +0 -4
- package/templates/cursor/commands/task.md +0 -8
- package/templates/cursor/p.md +0 -29
- package/templates/cursor/router.mdc +0 -28
- package/templates/design/api.md +0 -95
- package/templates/design/architecture.md +0 -77
- package/templates/design/component.md +0 -89
- package/templates/design/database.md +0 -78
- package/templates/design/flow.md +0 -94
- package/templates/global/ANTIGRAVITY.md +0 -254
- package/templates/global/CLAUDE.md +0 -497
- package/templates/global/CURSOR.mdc +0 -266
- package/templates/global/GEMINI.md +0 -293
- package/templates/global/STORAGE-SPEC.md +0 -391
- package/templates/global/WINDSURF.md +0 -266
- package/templates/global/modules/CLAUDE-commands.md +0 -70
- package/templates/global/modules/CLAUDE-core.md +0 -105
- package/templates/global/modules/CLAUDE-git.md +0 -50
- package/templates/global/modules/CLAUDE-intelligence.md +0 -92
- package/templates/global/modules/CLAUDE-storage.md +0 -50
- package/templates/global/modules/module-config.json +0 -36
- package/templates/mcp-config.json +0 -19
- package/templates/permissions/default.jsonc +0 -60
- package/templates/permissions/permissive.jsonc +0 -49
- package/templates/permissions/strict.jsonc +0 -58
- package/templates/planning-methodology.md +0 -195
- package/templates/skills/code-review.md +0 -47
- package/templates/skills/debug.md +0 -61
- package/templates/skills/refactor.md +0 -47
- package/templates/subagents/agent-base.md +0 -20
- package/templates/subagents/domain/backend.md +0 -109
- package/templates/subagents/domain/database.md +0 -121
- package/templates/subagents/domain/devops.md +0 -152
- package/templates/subagents/domain/frontend.md +0 -103
- package/templates/subagents/domain/testing.md +0 -169
- package/templates/subagents/pm-expert.md +0 -366
- package/templates/subagents/workflow/chief-architect.md +0 -657
- package/templates/subagents/workflow/prjct-planner.md +0 -159
- package/templates/subagents/workflow/prjct-shipper.md +0 -188
- package/templates/subagents/workflow/prjct-workflow.md +0 -98
- package/templates/tools/bash.txt +0 -22
- package/templates/tools/edit.txt +0 -18
- package/templates/tools/glob.txt +0 -19
- package/templates/tools/grep.txt +0 -21
- package/templates/tools/read.txt +0 -14
- package/templates/tools/task.txt +0 -20
- package/templates/tools/webfetch.txt +0 -16
- package/templates/tools/websearch.txt +0 -18
- package/templates/tools/write.txt +0 -17
- package/templates/windsurf/router.md +0 -28
- package/templates/windsurf/workflows/bug.md +0 -8
- package/templates/windsurf/workflows/done.md +0 -4
- package/templates/windsurf/workflows/pause.md +0 -4
- package/templates/windsurf/workflows/resume.md +0 -4
- package/templates/windsurf/workflows/ship.md +0 -8
- package/templates/windsurf/workflows/sync.md +0 -4
- package/templates/windsurf/workflows/task.md +0 -8
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analytics Commands: dash, help
|
|
3
|
-
* Unified dashboard and contextual help - MD-First Architecture
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import path from 'node:path'
|
|
7
|
-
import { createStalenessChecker } from '../services'
|
|
8
|
-
import { ideasStorage, queueStorage, shippedStorage, stateStorage } from '../storage'
|
|
9
|
-
import type { CommandResult, ProjectContext } from '../types'
|
|
10
|
-
import { getErrorMessage } from '../types/fs'
|
|
11
|
-
import {
|
|
12
|
-
configManager,
|
|
13
|
-
contextBuilder,
|
|
14
|
-
dateHelper,
|
|
15
|
-
jsonlHelper,
|
|
16
|
-
out,
|
|
17
|
-
PrjctCommandsBase,
|
|
18
|
-
pathManager,
|
|
19
|
-
toolRegistry,
|
|
20
|
-
} from './base'
|
|
21
|
-
import { commandRegistry } from './registry'
|
|
22
|
-
|
|
23
|
-
interface MemoryEntry {
|
|
24
|
-
timestamp: string
|
|
25
|
-
action: string
|
|
26
|
-
data?: Record<string, unknown>
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export class AnalyticsCommands extends PrjctCommandsBase {
|
|
30
|
-
/**
|
|
31
|
-
* /p:dash - Unified dashboard
|
|
32
|
-
* Views: default, week, month, roadmap, compact
|
|
33
|
-
*/
|
|
34
|
-
async dash(
|
|
35
|
-
view: string = 'default',
|
|
36
|
-
projectPath: string = process.cwd()
|
|
37
|
-
): Promise<CommandResult> {
|
|
38
|
-
try {
|
|
39
|
-
const initResult = await this.ensureProjectInit(projectPath)
|
|
40
|
-
if (!initResult.success) return initResult
|
|
41
|
-
|
|
42
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
43
|
-
if (!projectId) {
|
|
44
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
45
|
-
return { success: false, error: 'No project ID found' }
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const projectName = path.basename(projectPath)
|
|
49
|
-
|
|
50
|
-
// Get current task (from storage layer - JSON source of truth)
|
|
51
|
-
const currentTask = await stateStorage.getCurrentTask(projectId)
|
|
52
|
-
|
|
53
|
-
// Get queue
|
|
54
|
-
const queueTasks = await queueStorage.getActiveTasks(projectId)
|
|
55
|
-
|
|
56
|
-
// Get shipped (recent)
|
|
57
|
-
const shipped = await shippedStorage.getRecent(projectId, 5)
|
|
58
|
-
|
|
59
|
-
// Get ideas
|
|
60
|
-
const ideas = await ideasStorage.getPending(projectId)
|
|
61
|
-
|
|
62
|
-
if (view === 'compact') {
|
|
63
|
-
// One-liner status
|
|
64
|
-
const taskStatus = currentTask ? `🎯 ${currentTask.description.slice(0, 30)}` : '💤 idle'
|
|
65
|
-
const queueStatus = `📋 ${queueTasks.length}`
|
|
66
|
-
const shippedStatus = `🚀 ${shipped.length}`
|
|
67
|
-
out.done(`${taskStatus} | ${queueStatus} | ${shippedStatus}`)
|
|
68
|
-
return { success: true, view: 'compact' }
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (view === 'week' || view === 'month') {
|
|
72
|
-
// Period-based metrics
|
|
73
|
-
const days = view === 'week' ? 7 : 30
|
|
74
|
-
const startDate = dateHelper.getDaysAgo(days)
|
|
75
|
-
|
|
76
|
-
const memoryPath = pathManager.getFilePath(projectId, 'memory', 'context.jsonl')
|
|
77
|
-
let entries: MemoryEntry[] = []
|
|
78
|
-
try {
|
|
79
|
-
const allEntries = (await jsonlHelper.readJsonLines(memoryPath)) as MemoryEntry[]
|
|
80
|
-
entries = allEntries.filter((e) => new Date(e.timestamp) >= startDate)
|
|
81
|
-
} catch {
|
|
82
|
-
entries = []
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const metrics = {
|
|
86
|
-
tasksCompleted: entries.filter((e) => e.action === 'task_completed').length,
|
|
87
|
-
featuresShipped: entries.filter((e) => e.action === 'feature_shipped').length,
|
|
88
|
-
totalActions: entries.length,
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
console.log(`\n📊 ${view.toUpperCase()} PROGRESS - ${projectName}\n`)
|
|
92
|
-
console.log('═'.repeat(50))
|
|
93
|
-
console.log(` Tasks completed: ${metrics.tasksCompleted}`)
|
|
94
|
-
console.log(` Features shipped: ${metrics.featuresShipped}`)
|
|
95
|
-
console.log(` Total actions: ${metrics.totalActions}`)
|
|
96
|
-
console.log('═'.repeat(50))
|
|
97
|
-
|
|
98
|
-
// ASCII sparkline
|
|
99
|
-
const sparkline = this._generateSparkline(entries, days)
|
|
100
|
-
console.log(`\n Activity: ${sparkline}\n`)
|
|
101
|
-
|
|
102
|
-
return { success: true, view, metrics }
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (view === 'roadmap') {
|
|
106
|
-
// Roadmap view
|
|
107
|
-
const context = (await contextBuilder.build(projectPath)) as ProjectContext
|
|
108
|
-
const roadmapContent = (await toolRegistry.get('Read')!(context.paths.roadmap)) as
|
|
109
|
-
| string
|
|
110
|
-
| null
|
|
111
|
-
|
|
112
|
-
console.log(`\n🗺️ ROADMAP - ${projectName}\n`)
|
|
113
|
-
console.log('═'.repeat(50))
|
|
114
|
-
|
|
115
|
-
if (!roadmapContent || roadmapContent.trim() === '# ROADMAP') {
|
|
116
|
-
console.log(' No features planned yet.')
|
|
117
|
-
console.log(' Use /p:feature to add features.\n')
|
|
118
|
-
} else {
|
|
119
|
-
// Parse and display roadmap
|
|
120
|
-
const features = roadmapContent
|
|
121
|
-
.split('##')
|
|
122
|
-
.filter((s) => s.trim() && !s.includes('ROADMAP'))
|
|
123
|
-
features.slice(0, 5).forEach((f, i) => {
|
|
124
|
-
const name = f.split('\n')[0].trim()
|
|
125
|
-
console.log(` ${i + 1}. ${name}`)
|
|
126
|
-
})
|
|
127
|
-
if (features.length > 5) {
|
|
128
|
-
console.log(` ... and ${features.length - 5} more`)
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
console.log(`${'═'.repeat(50)}\n`)
|
|
132
|
-
|
|
133
|
-
return { success: true, view: 'roadmap' }
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Default view - project overview
|
|
137
|
-
console.log(`\n📊 DASHBOARD - ${projectName}\n`)
|
|
138
|
-
console.log('═'.repeat(50))
|
|
139
|
-
|
|
140
|
-
// Check staleness (PRJ-120)
|
|
141
|
-
const checker = createStalenessChecker(projectPath)
|
|
142
|
-
const stalenessStatus = await checker.check(projectId)
|
|
143
|
-
const stalenessWarning = checker.getWarning(stalenessStatus)
|
|
144
|
-
if (stalenessWarning) {
|
|
145
|
-
console.log(`\n${stalenessWarning}`)
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Current task
|
|
149
|
-
console.log('\n🎯 CURRENT FOCUS')
|
|
150
|
-
if (currentTask) {
|
|
151
|
-
console.log(` ${currentTask.description}`)
|
|
152
|
-
if (currentTask.startedAt) {
|
|
153
|
-
const elapsed = dateHelper.calculateDuration(new Date(currentTask.startedAt))
|
|
154
|
-
console.log(` Started: ${elapsed} ago`)
|
|
155
|
-
}
|
|
156
|
-
} else {
|
|
157
|
-
console.log(' No active task. Use /p:work to start.')
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Queue
|
|
161
|
-
console.log('\n📋 QUEUE')
|
|
162
|
-
if (queueTasks.length === 0) {
|
|
163
|
-
console.log(' Queue is empty')
|
|
164
|
-
} else {
|
|
165
|
-
queueTasks.slice(0, 3).forEach((t, i) => {
|
|
166
|
-
const priority = t.priority ? `[${t.priority}]` : ''
|
|
167
|
-
console.log(` ${i + 1}. ${t.description.slice(0, 40)} ${priority}`)
|
|
168
|
-
})
|
|
169
|
-
if (queueTasks.length > 3) {
|
|
170
|
-
console.log(` ... and ${queueTasks.length - 3} more`)
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// Recent ships
|
|
175
|
-
console.log('\n🚀 RECENT SHIPS')
|
|
176
|
-
if (shipped.length === 0) {
|
|
177
|
-
console.log(' Nothing shipped yet')
|
|
178
|
-
} else {
|
|
179
|
-
shipped.slice(0, 3).forEach((s) => {
|
|
180
|
-
const date = s.shippedAt ? new Date(s.shippedAt).toLocaleDateString() : ''
|
|
181
|
-
console.log(` • ${s.name} ${date ? `(${date})` : ''}`)
|
|
182
|
-
})
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Ideas
|
|
186
|
-
console.log('\n💡 IDEAS')
|
|
187
|
-
console.log(` ${ideas.length} pending ideas`)
|
|
188
|
-
|
|
189
|
-
console.log(`\n${'═'.repeat(50)}`)
|
|
190
|
-
console.log('💡 /p:work to start | /p:done to complete | /p:ship to ship\n')
|
|
191
|
-
|
|
192
|
-
await this.logToMemory(projectPath, 'dash_viewed', {
|
|
193
|
-
view,
|
|
194
|
-
timestamp: dateHelper.getTimestamp(),
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
return {
|
|
198
|
-
success: true,
|
|
199
|
-
view: 'default',
|
|
200
|
-
stats: {
|
|
201
|
-
currentTask: currentTask?.description || null,
|
|
202
|
-
queueCount: queueTasks.length,
|
|
203
|
-
shippedCount: shipped.length,
|
|
204
|
-
ideasCount: ideas.length,
|
|
205
|
-
},
|
|
206
|
-
}
|
|
207
|
-
} catch (error) {
|
|
208
|
-
out.fail(getErrorMessage(error))
|
|
209
|
-
return { success: false, error: getErrorMessage(error) }
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* /p:help - Contextual help and guidance
|
|
215
|
-
*/
|
|
216
|
-
async help(topic: string = '', _projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
217
|
-
try {
|
|
218
|
-
if (!topic) {
|
|
219
|
-
// Show command overview
|
|
220
|
-
console.log('\n PRJCT COMMANDS\n')
|
|
221
|
-
console.log('='.repeat(50))
|
|
222
|
-
|
|
223
|
-
const categories = commandRegistry.getAllCategories()
|
|
224
|
-
const commands = commandRegistry.getAll()
|
|
225
|
-
|
|
226
|
-
// Group by category
|
|
227
|
-
const byCategory: Record<string, typeof commands> = {}
|
|
228
|
-
commands.forEach((cmd) => {
|
|
229
|
-
if (cmd.deprecated) return
|
|
230
|
-
if (!byCategory[cmd.group]) byCategory[cmd.group] = []
|
|
231
|
-
byCategory[cmd.group].push(cmd)
|
|
232
|
-
})
|
|
233
|
-
|
|
234
|
-
Object.entries(byCategory).forEach(([cat, cmds]) => {
|
|
235
|
-
const catInfo = categories.get(cat)
|
|
236
|
-
console.log(`\n${catInfo?.title || cat}:`)
|
|
237
|
-
cmds.forEach((cmd) => {
|
|
238
|
-
const params = cmd.params ? ` ${cmd.params}` : ''
|
|
239
|
-
console.log(` ${cmd.name}${params}`)
|
|
240
|
-
console.log(` ${cmd.description}`)
|
|
241
|
-
})
|
|
242
|
-
})
|
|
243
|
-
|
|
244
|
-
console.log(`\n${'═'.repeat(50)}`)
|
|
245
|
-
console.log('💡 Use /p:help <command> for detailed help\n')
|
|
246
|
-
|
|
247
|
-
return { success: true, topic: 'overview' }
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Topic-specific help
|
|
251
|
-
const command = commandRegistry.getByName(topic)
|
|
252
|
-
if (command) {
|
|
253
|
-
console.log(`\n📚 HELP: /p:${command.name}\n`)
|
|
254
|
-
console.log('═'.repeat(50))
|
|
255
|
-
console.log(`Description: ${command.description}`)
|
|
256
|
-
|
|
257
|
-
if (command.params) {
|
|
258
|
-
console.log(`Parameters: ${command.params}`)
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
if (command.usage) {
|
|
262
|
-
console.log('\nUsage:')
|
|
263
|
-
if (command.usage.claude) console.log(` Claude: ${command.usage.claude}`)
|
|
264
|
-
if (command.usage.terminal) console.log(` Terminal: ${command.usage.terminal}`)
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
if (command.features) {
|
|
268
|
-
console.log('\nFeatures:')
|
|
269
|
-
for (const f of command.features) {
|
|
270
|
-
console.log(` • ${f}`)
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
console.log(`\n${'═'.repeat(50)}\n`)
|
|
275
|
-
return { success: true, topic, command }
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// Intent translation (like old /p:ask)
|
|
279
|
-
const intents: Record<string, { command: string; hint: string }> = {
|
|
280
|
-
start: { command: 'work', hint: 'Start working on a task' },
|
|
281
|
-
begin: { command: 'work', hint: 'Start working on a task' },
|
|
282
|
-
finish: { command: 'done', hint: 'Mark current task complete' },
|
|
283
|
-
complete: { command: 'done', hint: 'Mark current task complete' },
|
|
284
|
-
deploy: { command: 'ship', hint: 'Ship a feature' },
|
|
285
|
-
release: { command: 'ship', hint: 'Ship a feature' },
|
|
286
|
-
status: { command: 'dash', hint: 'View project dashboard' },
|
|
287
|
-
overview: { command: 'dash', hint: 'View project dashboard' },
|
|
288
|
-
queue: { command: 'next', hint: 'View task queue' },
|
|
289
|
-
tasks: { command: 'next', hint: 'View task queue' },
|
|
290
|
-
add: { command: 'feature', hint: 'Add a new feature' },
|
|
291
|
-
new: { command: 'feature', hint: 'Add a new feature' },
|
|
292
|
-
break: { command: 'pause', hint: 'Pause current task' },
|
|
293
|
-
stop: { command: 'pause', hint: 'Pause current task' },
|
|
294
|
-
continue: { command: 'resume', hint: 'Resume paused task' },
|
|
295
|
-
back: { command: 'resume', hint: 'Resume paused task' },
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const lowerTopic = topic.toLowerCase()
|
|
299
|
-
for (const [intent, info] of Object.entries(intents)) {
|
|
300
|
-
if (lowerTopic.includes(intent)) {
|
|
301
|
-
console.log(`\n💡 Did you mean /p:${info.command}?`)
|
|
302
|
-
console.log(` ${info.hint}\n`)
|
|
303
|
-
return { success: true, topic, suggestion: info.command }
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
console.log(`\n❓ Unknown topic: ${topic}`)
|
|
308
|
-
console.log(' Use /p:help to see all commands\n')
|
|
309
|
-
return { success: false, error: `Unknown topic: ${topic}` }
|
|
310
|
-
} catch (error) {
|
|
311
|
-
out.fail(getErrorMessage(error))
|
|
312
|
-
return { success: false, error: getErrorMessage(error) }
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Generate ASCII sparkline for activity
|
|
318
|
-
*/
|
|
319
|
-
private _generateSparkline(entries: MemoryEntry[], days: number): string {
|
|
320
|
-
const bars = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█']
|
|
321
|
-
const now = new Date()
|
|
322
|
-
const counts: number[] = []
|
|
323
|
-
|
|
324
|
-
// Count entries per day
|
|
325
|
-
for (let i = days - 1; i >= 0; i--) {
|
|
326
|
-
const date = new Date(now)
|
|
327
|
-
date.setDate(date.getDate() - i)
|
|
328
|
-
const dayStart = new Date(date.setHours(0, 0, 0, 0))
|
|
329
|
-
const dayEnd = new Date(date.setHours(23, 59, 59, 999))
|
|
330
|
-
|
|
331
|
-
const count = entries.filter((e) => {
|
|
332
|
-
const ts = new Date(e.timestamp)
|
|
333
|
-
return ts >= dayStart && ts <= dayEnd
|
|
334
|
-
}).length
|
|
335
|
-
|
|
336
|
-
counts.push(count)
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
const max = Math.max(...counts, 1)
|
|
340
|
-
return counts.map((c) => bars[Math.floor((c / max) * (bars.length - 1))]).join('')
|
|
341
|
-
}
|
|
342
|
-
}
|
package/core/commands/base.ts
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base class and helpers for PrjctCommands
|
|
3
|
-
*
|
|
4
|
-
* Delegates to service modules for business logic.
|
|
5
|
-
* This class maintains backward compatibility while services handle implementation.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import commandExecutor from '../agentic/command-executor'
|
|
9
|
-
import contextBuilder from '../agentic/context-builder'
|
|
10
|
-
import toolRegistry from '../agentic/tool-registry'
|
|
11
|
-
import configManager from '../infrastructure/config-manager'
|
|
12
|
-
import pathManager from '../infrastructure/path-manager'
|
|
13
|
-
import UpdateChecker from '../infrastructure/update-checker'
|
|
14
|
-
// Services
|
|
15
|
-
import { agentService, breakdownService, memoryService, projectService } from '../services'
|
|
16
|
-
import type {
|
|
17
|
-
AgentAssignmentResult,
|
|
18
|
-
AgentInfo,
|
|
19
|
-
Author,
|
|
20
|
-
CommandResult,
|
|
21
|
-
ProjectContext,
|
|
22
|
-
} from '../types'
|
|
23
|
-
import * as dateHelper from '../utils/date-helper'
|
|
24
|
-
import * as fileHelper from '../utils/file-helper'
|
|
25
|
-
import * as jsonlHelper from '../utils/jsonl-helper'
|
|
26
|
-
import out from '../utils/output'
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Base class with shared state and utilities
|
|
30
|
-
* Delegates to service modules for implementation
|
|
31
|
-
*/
|
|
32
|
-
export class PrjctCommandsBase {
|
|
33
|
-
prjctDir: string
|
|
34
|
-
updateChecker: UpdateChecker
|
|
35
|
-
updateNotificationShown: boolean
|
|
36
|
-
commandExecutor: typeof commandExecutor
|
|
37
|
-
|
|
38
|
-
constructor() {
|
|
39
|
-
this.prjctDir = '.prjct'
|
|
40
|
-
this.updateChecker = new UpdateChecker()
|
|
41
|
-
this.updateNotificationShown = false
|
|
42
|
-
this.commandExecutor = commandExecutor
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Agent accessors (delegate to agentService)
|
|
46
|
-
get agent(): unknown {
|
|
47
|
-
return agentService.getAgent()
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
get agentInfo(): AgentInfo | null {
|
|
51
|
-
return agentService.getInfo()
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
get currentAuthor(): Author | null {
|
|
55
|
-
return projectService.getCurrentAuthor()
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async initializeAgent(): Promise<unknown> {
|
|
59
|
-
return agentService.initialize()
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async ensureProjectInit(projectPath: string): Promise<CommandResult> {
|
|
63
|
-
return projectService.ensureInit(projectPath)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async ensureAuthor(): Promise<Author> {
|
|
67
|
-
return projectService.ensureAuthor()
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async getGlobalProjectPath(projectPath: string): Promise<string> {
|
|
71
|
-
return projectService.getGlobalPath(projectPath)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async logToMemory(
|
|
75
|
-
projectPath: string,
|
|
76
|
-
action: string,
|
|
77
|
-
data: Record<string, unknown>
|
|
78
|
-
): Promise<void> {
|
|
79
|
-
const author = await this.ensureAuthor()
|
|
80
|
-
return memoryService.log(projectPath, action, data, author.name)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async _detectEmptyDirectory(projectPath: string): Promise<boolean> {
|
|
84
|
-
return projectService.isEmptyDirectory(projectPath)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
async _detectExistingCode(projectPath: string): Promise<boolean> {
|
|
88
|
-
return projectService.hasExistingCode(projectPath)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
_breakdownFeatureTasks(description: string): string[] {
|
|
92
|
-
return breakdownService.breakdownFeature(description)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
_detectBugSeverity(description: string): string {
|
|
96
|
-
return breakdownService.detectBugSeverity(description)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async _assignAgentForTask(
|
|
100
|
-
task: string,
|
|
101
|
-
projectPath: string,
|
|
102
|
-
context: ProjectContext
|
|
103
|
-
): Promise<AgentAssignmentResult> {
|
|
104
|
-
return agentService.assignForTask(task, projectPath, context)
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Re-export dependencies for use by other modules
|
|
109
|
-
export {
|
|
110
|
-
contextBuilder,
|
|
111
|
-
toolRegistry,
|
|
112
|
-
pathManager,
|
|
113
|
-
configManager,
|
|
114
|
-
fileHelper,
|
|
115
|
-
jsonlHelper,
|
|
116
|
-
dateHelper,
|
|
117
|
-
out,
|
|
118
|
-
}
|
package/core/commands/cleanup.ts
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cleanup Commands
|
|
3
|
-
*
|
|
4
|
-
* Memory and project file cleanup operations.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import path from 'node:path'
|
|
8
|
-
import { memoryService } from '../services'
|
|
9
|
-
import { ideasStorage, queueStorage } from '../storage'
|
|
10
|
-
import type { CleanupOptions, CommandResult } from '../types'
|
|
11
|
-
import { getErrorMessage, isNotFoundError } from '../types/fs'
|
|
12
|
-
import { configManager, dateHelper, jsonlHelper, out, pathManager } from './base'
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Memory cleanup helper
|
|
16
|
-
*/
|
|
17
|
-
export async function cleanupMemory(projectPath: string): Promise<{
|
|
18
|
-
success: boolean
|
|
19
|
-
results: { rotated: string[]; totalSize: number; freedSpace: number }
|
|
20
|
-
}> {
|
|
21
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
22
|
-
|
|
23
|
-
const results = { rotated: [] as string[], totalSize: 0, freedSpace: 0 }
|
|
24
|
-
const jsonlFiles = [
|
|
25
|
-
pathManager.getFilePath(projectId!, 'memory', 'context.jsonl'),
|
|
26
|
-
pathManager.getFilePath(projectId!, 'progress', 'shipped.md'),
|
|
27
|
-
pathManager.getFilePath(projectId!, 'planning', 'ideas.md'),
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
for (const filePath of jsonlFiles) {
|
|
31
|
-
try {
|
|
32
|
-
const sizeMB = await jsonlHelper.getFileSizeMB(filePath)
|
|
33
|
-
if (sizeMB > 0) {
|
|
34
|
-
results.totalSize += sizeMB
|
|
35
|
-
const rotated = await jsonlHelper.rotateJsonLinesIfNeeded(filePath, 10)
|
|
36
|
-
if (rotated) {
|
|
37
|
-
results.rotated.push(path.basename(filePath))
|
|
38
|
-
results.freedSpace += sizeMB
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
} catch (error) {
|
|
42
|
-
// Skip file if not found, otherwise log unexpected errors
|
|
43
|
-
if (!isNotFoundError(error)) {
|
|
44
|
-
console.error(`Cleanup warning for ${filePath}: ${getErrorMessage(error)}`)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return { success: true, results }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Internal cleanup helper for memory during normal cleanup
|
|
54
|
-
*/
|
|
55
|
-
export async function cleanupMemoryInternal(projectPath: string): Promise<void> {
|
|
56
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
57
|
-
const memoryPath = pathManager.getFilePath(projectId!, 'memory', 'context.jsonl')
|
|
58
|
-
await jsonlHelper.rotateJsonLinesIfNeeded(memoryPath, 10)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* /p:cleanup - Clean temp files and old entries
|
|
63
|
-
*/
|
|
64
|
-
export async function cleanup(
|
|
65
|
-
options: CleanupOptions = {},
|
|
66
|
-
projectPath: string = process.cwd()
|
|
67
|
-
): Promise<CommandResult> {
|
|
68
|
-
try {
|
|
69
|
-
const isMemoryMode = options.memory === true || options.type === 'memory'
|
|
70
|
-
|
|
71
|
-
if (isMemoryMode) {
|
|
72
|
-
out.spin('cleaning memory...')
|
|
73
|
-
const result = await cleanupMemory(projectPath)
|
|
74
|
-
out.done('memory cleaned')
|
|
75
|
-
return result
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
out.spin('cleaning up...')
|
|
79
|
-
|
|
80
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
81
|
-
if (!projectId) {
|
|
82
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
83
|
-
return { success: false, error: 'No project ID found' }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const cleaned: string[] = []
|
|
87
|
-
|
|
88
|
-
// Clean memory (keep last 100 entries)
|
|
89
|
-
const memoryPath = pathManager.getFilePath(projectId, 'memory', 'context.jsonl')
|
|
90
|
-
try {
|
|
91
|
-
const entries = await jsonlHelper.readJsonLines(memoryPath)
|
|
92
|
-
|
|
93
|
-
if (entries.length > 100) {
|
|
94
|
-
const kept = entries.slice(-100)
|
|
95
|
-
await jsonlHelper.writeJsonLines(memoryPath, kept)
|
|
96
|
-
cleaned.push(`Memory: ${entries.length - 100} old entries removed`)
|
|
97
|
-
} else {
|
|
98
|
-
cleaned.push('Memory: No cleanup needed')
|
|
99
|
-
}
|
|
100
|
-
} catch (error) {
|
|
101
|
-
if (isNotFoundError(error)) {
|
|
102
|
-
cleaned.push('Memory: No file found')
|
|
103
|
-
} else {
|
|
104
|
-
cleaned.push(`Memory: Error - ${getErrorMessage(error)}`)
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Clean ideas using ideasStorage
|
|
109
|
-
try {
|
|
110
|
-
const result = await ideasStorage.cleanup(projectId)
|
|
111
|
-
if (result.removed > 0) {
|
|
112
|
-
cleaned.push(`Ideas: ${result.removed} old archived ideas removed`)
|
|
113
|
-
} else {
|
|
114
|
-
cleaned.push('Ideas: No cleanup needed')
|
|
115
|
-
}
|
|
116
|
-
} catch (error) {
|
|
117
|
-
if (isNotFoundError(error)) {
|
|
118
|
-
cleaned.push('Ideas: No file found')
|
|
119
|
-
} else {
|
|
120
|
-
cleaned.push(`Ideas: Error - ${getErrorMessage(error)}`)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Check queue for completed tasks using queueStorage
|
|
125
|
-
try {
|
|
126
|
-
const tasks = await queueStorage.getActiveTasks(projectId)
|
|
127
|
-
const completedTasks = tasks.filter((t) => t.completed).length
|
|
128
|
-
|
|
129
|
-
if (completedTasks > 0) {
|
|
130
|
-
cleaned.push(
|
|
131
|
-
`Queue: ${completedTasks} completed tasks found (not removed - use /p:done to clear)`
|
|
132
|
-
)
|
|
133
|
-
} else {
|
|
134
|
-
cleaned.push('Queue: No completed tasks')
|
|
135
|
-
}
|
|
136
|
-
} catch (error) {
|
|
137
|
-
if (isNotFoundError(error)) {
|
|
138
|
-
cleaned.push('Queue: No file found')
|
|
139
|
-
} else {
|
|
140
|
-
cleaned.push(`Queue: Error - ${getErrorMessage(error)}`)
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
await cleanupMemoryInternal(projectPath)
|
|
145
|
-
|
|
146
|
-
await memoryService.log(projectPath, 'cleanup_performed', {
|
|
147
|
-
items: cleaned.length,
|
|
148
|
-
timestamp: dateHelper.getTimestamp(),
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
out.done(`${cleaned.length} items cleaned`)
|
|
152
|
-
return { success: true, cleaned }
|
|
153
|
-
} catch (error) {
|
|
154
|
-
out.fail(getErrorMessage(error))
|
|
155
|
-
return { success: false, error: getErrorMessage(error) }
|
|
156
|
-
}
|
|
157
|
-
}
|