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,505 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workflow Commands: work (now), done, next, pause, resume
|
|
3
|
-
* Core task management - Write-Through Architecture
|
|
4
|
-
*
|
|
5
|
-
* Uses storage layer: JSON (source) → MD (context) → Event (sync)
|
|
6
|
-
*
|
|
7
|
-
* AGENTIC: Uses template-executor for Claude-driven decisions.
|
|
8
|
-
* TypeScript provides infrastructure; Claude decides via templates.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import commandExecutor from '../agentic/command-executor'
|
|
12
|
-
import { templateExecutor } from '../agentic/template-executor'
|
|
13
|
-
import {
|
|
14
|
-
type FibonacciPoint,
|
|
15
|
-
isValidPoint,
|
|
16
|
-
pointsToMinutes,
|
|
17
|
-
pointsToTimeRange,
|
|
18
|
-
} from '../domain/fibonacci'
|
|
19
|
-
import { linearService } from '../integrations/linear'
|
|
20
|
-
import outcomeRecorder from '../outcomes/recorder'
|
|
21
|
-
import { generateUUID } from '../schemas'
|
|
22
|
-
import type { TaskFeedback } from '../schemas/state'
|
|
23
|
-
import { queueStorage, stateStorage } from '../storage'
|
|
24
|
-
import type { CommandResult } from '../types'
|
|
25
|
-
import { getErrorMessage } from '../types/fs'
|
|
26
|
-
import { showNextSteps, showStateInfo } from '../utils/next-steps'
|
|
27
|
-
import { getLinearApiKey, getProjectCredentials } from '../utils/project-credentials'
|
|
28
|
-
import {
|
|
29
|
-
formatWorkflowPreferences,
|
|
30
|
-
type HookCommand,
|
|
31
|
-
type HookPhase,
|
|
32
|
-
listWorkflowPreferences,
|
|
33
|
-
type PreferenceScope,
|
|
34
|
-
removeWorkflowPreference,
|
|
35
|
-
runWorkflowHooks,
|
|
36
|
-
setWorkflowPreference,
|
|
37
|
-
} from '../workflow/workflow-preferences'
|
|
38
|
-
import { configManager, dateHelper, out, PrjctCommandsBase } from './base'
|
|
39
|
-
|
|
40
|
-
export class WorkflowCommands extends PrjctCommandsBase {
|
|
41
|
-
/**
|
|
42
|
-
* /p:now - Set or show current task
|
|
43
|
-
*/
|
|
44
|
-
async now(
|
|
45
|
-
task: string | null = null,
|
|
46
|
-
projectPath: string = process.cwd(),
|
|
47
|
-
options: { skipHooks?: boolean } = {}
|
|
48
|
-
): Promise<CommandResult> {
|
|
49
|
-
try {
|
|
50
|
-
const initResult = await this.ensureProjectInit(projectPath)
|
|
51
|
-
if (!initResult.success) return initResult
|
|
52
|
-
|
|
53
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
54
|
-
if (!projectId) {
|
|
55
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
56
|
-
return { success: false, error: 'No project ID found' }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (task) {
|
|
60
|
-
// Run before_task hooks (using memory-based preferences)
|
|
61
|
-
const beforeResult = await runWorkflowHooks(projectId, 'before', 'task', {
|
|
62
|
-
projectPath,
|
|
63
|
-
skipHooks: options.skipHooks,
|
|
64
|
-
})
|
|
65
|
-
if (!beforeResult.success) {
|
|
66
|
-
return { success: false, error: `Hook failed: ${beforeResult.failed}` }
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// AGENTIC: Use CommandExecutor for full orchestration support
|
|
70
|
-
const result = await commandExecutor.execute('task', { task }, projectPath)
|
|
71
|
-
|
|
72
|
-
if (!result.success) {
|
|
73
|
-
out.fail(result.error || 'Failed to execute task')
|
|
74
|
-
return { success: false, error: result.error }
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Check if task is a Linear issue ID (e.g., PRJ-139)
|
|
78
|
-
let linearId: string | undefined
|
|
79
|
-
let taskDescription = task
|
|
80
|
-
const linearPattern = /^[A-Z]+-\d+$/
|
|
81
|
-
if (linearPattern.test(task)) {
|
|
82
|
-
try {
|
|
83
|
-
const creds = await getProjectCredentials(projectId)
|
|
84
|
-
const apiKey = await getLinearApiKey(projectId)
|
|
85
|
-
if (apiKey && creds.linear?.teamId) {
|
|
86
|
-
await linearService.initializeFromApiKey(apiKey, creds.linear.teamId)
|
|
87
|
-
const issue = await linearService.fetchIssue(task)
|
|
88
|
-
if (issue) {
|
|
89
|
-
linearId = task
|
|
90
|
-
taskDescription = `${task}: ${issue.title}`
|
|
91
|
-
// Mark as in progress in Linear
|
|
92
|
-
await linearService.markInProgress(task)
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
} catch {
|
|
96
|
-
// Linear fetch failed - continue with task as-is
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Write-through: JSON → MD → Event
|
|
101
|
-
await stateStorage.startTask(projectId, {
|
|
102
|
-
id: generateUUID(),
|
|
103
|
-
description: taskDescription,
|
|
104
|
-
sessionId: generateUUID(),
|
|
105
|
-
linearId,
|
|
106
|
-
} as Parameters<typeof stateStorage.startTask>[1])
|
|
107
|
-
|
|
108
|
-
// Get available agents for backward compatibility
|
|
109
|
-
const availableAgents = await templateExecutor.getAvailableAgents(projectPath)
|
|
110
|
-
const _agentsList =
|
|
111
|
-
availableAgents.length > 0 ? availableAgents.join(', ') : 'none (run p. sync)'
|
|
112
|
-
|
|
113
|
-
// Build metrics from orchestrator context
|
|
114
|
-
const agentCount = result.orchestratorContext?.agents?.length || availableAgents.length
|
|
115
|
-
out.done(`${task}`, {
|
|
116
|
-
agents: agentCount > 0 ? agentCount : undefined,
|
|
117
|
-
})
|
|
118
|
-
showStateInfo('working')
|
|
119
|
-
showNextSteps('task')
|
|
120
|
-
|
|
121
|
-
await this.logToMemory(projectPath, 'task_started', {
|
|
122
|
-
task,
|
|
123
|
-
agenticMode: true,
|
|
124
|
-
availableAgents,
|
|
125
|
-
orchestratorContext: result.orchestratorContext,
|
|
126
|
-
timestamp: dateHelper.getTimestamp(),
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
// Run after_task hooks
|
|
130
|
-
await runWorkflowHooks(projectId, 'after', 'task', {
|
|
131
|
-
projectPath,
|
|
132
|
-
skipHooks: options.skipHooks,
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
// Include full CommandExecutor result first (orchestratorContext, prompt, etc.)
|
|
137
|
-
...result,
|
|
138
|
-
// Then override with our specific values
|
|
139
|
-
success: true,
|
|
140
|
-
task,
|
|
141
|
-
agenticMode: true,
|
|
142
|
-
availableAgents,
|
|
143
|
-
// Fibonacci estimation helpers for templates
|
|
144
|
-
fibonacci: {
|
|
145
|
-
isValidPoint,
|
|
146
|
-
pointsToMinutes,
|
|
147
|
-
pointsToTimeRange,
|
|
148
|
-
storeEstimate: async (points: FibonacciPoint) => {
|
|
149
|
-
const minutes = pointsToMinutes(points)
|
|
150
|
-
await stateStorage.updateCurrentTask(projectId, {
|
|
151
|
-
estimatedPoints: points,
|
|
152
|
-
estimatedMinutes: minutes.typical,
|
|
153
|
-
})
|
|
154
|
-
return minutes
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
}
|
|
158
|
-
} else {
|
|
159
|
-
// Read from storage (JSON is source of truth)
|
|
160
|
-
const currentTask = await stateStorage.getCurrentTask(projectId)
|
|
161
|
-
|
|
162
|
-
if (!currentTask) {
|
|
163
|
-
out.warn('no active task')
|
|
164
|
-
return { success: true, message: 'No active task' }
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
out.done(`working on: ${currentTask.description}`)
|
|
168
|
-
return { success: true, task: currentTask.description, currentTask }
|
|
169
|
-
}
|
|
170
|
-
} catch (error) {
|
|
171
|
-
out.fail(getErrorMessage(error))
|
|
172
|
-
return { success: false, error: getErrorMessage(error) }
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* /p:done - Complete current task
|
|
178
|
-
* Optionally accepts structured feedback for the task-to-analysis feedback loop (PRJ-272)
|
|
179
|
-
*/
|
|
180
|
-
async done(
|
|
181
|
-
projectPath: string = process.cwd(),
|
|
182
|
-
options: { skipHooks?: boolean; feedback?: TaskFeedback } = {}
|
|
183
|
-
): Promise<CommandResult> {
|
|
184
|
-
try {
|
|
185
|
-
const initResult = await this.ensureProjectInit(projectPath)
|
|
186
|
-
if (!initResult.success) return initResult
|
|
187
|
-
|
|
188
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
189
|
-
if (!projectId) {
|
|
190
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
191
|
-
return { success: false, error: 'No project ID found' }
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Read from storage
|
|
195
|
-
const currentTask = await stateStorage.getCurrentTask(projectId)
|
|
196
|
-
|
|
197
|
-
if (!currentTask) {
|
|
198
|
-
out.warn('no active task')
|
|
199
|
-
return { success: true, message: 'No active task to complete' }
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Run before_done hooks (using memory-based preferences)
|
|
203
|
-
const beforeResult = await runWorkflowHooks(projectId, 'before', 'done', {
|
|
204
|
-
projectPath,
|
|
205
|
-
skipHooks: options.skipHooks,
|
|
206
|
-
})
|
|
207
|
-
if (!beforeResult.success) {
|
|
208
|
-
return { success: false, error: `Hook failed: ${beforeResult.failed}` }
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const task = currentTask.description
|
|
212
|
-
let duration = ''
|
|
213
|
-
let actualMinutes = 0
|
|
214
|
-
if (currentTask.startedAt) {
|
|
215
|
-
const started = new Date(currentTask.startedAt)
|
|
216
|
-
duration = dateHelper.calculateDuration(started)
|
|
217
|
-
actualMinutes = Math.round((Date.now() - started.getTime()) / 60_000)
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Record outcome with estimation data if available
|
|
221
|
-
const estimatedMinutes = (currentTask as { estimatedMinutes?: number }).estimatedMinutes
|
|
222
|
-
const estimatedPoints = (currentTask as { estimatedPoints?: number }).estimatedPoints
|
|
223
|
-
try {
|
|
224
|
-
await outcomeRecorder.record(projectId, {
|
|
225
|
-
sessionId: currentTask.sessionId,
|
|
226
|
-
command: 'done',
|
|
227
|
-
task,
|
|
228
|
-
startedAt: currentTask.startedAt,
|
|
229
|
-
completedAt: dateHelper.getTimestamp(),
|
|
230
|
-
estimatedDuration: estimatedMinutes ? formatMinutesToDuration(estimatedMinutes) : '0m',
|
|
231
|
-
actualDuration: duration || '0m',
|
|
232
|
-
variance: estimatedMinutes ? formatVariance(actualMinutes - estimatedMinutes) : '+0m',
|
|
233
|
-
completedAsPlanned: true,
|
|
234
|
-
qualityScore: 3,
|
|
235
|
-
tags: [(currentTask as { linearId?: string }).linearId].filter(Boolean) as string[],
|
|
236
|
-
})
|
|
237
|
-
} catch {
|
|
238
|
-
// Outcome recording failure should not block workflow
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Build variance display
|
|
242
|
-
let varianceDisplay = ''
|
|
243
|
-
if (estimatedPoints && estimatedMinutes) {
|
|
244
|
-
const diff = actualMinutes - estimatedMinutes
|
|
245
|
-
const pct =
|
|
246
|
-
estimatedMinutes > 0
|
|
247
|
-
? Math.round(((actualMinutes - estimatedMinutes) / estimatedMinutes) * 100)
|
|
248
|
-
: 0
|
|
249
|
-
const sign = diff >= 0 ? '+' : ''
|
|
250
|
-
varianceDisplay = ` | est: ${estimatedPoints}pt (${formatMinutesToDuration(estimatedMinutes)}) → ${sign}${pct}%`
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Write-through: Complete task (JSON → MD → Event)
|
|
254
|
-
// Pass feedback for the task-to-analysis feedback loop (PRJ-272)
|
|
255
|
-
await stateStorage.completeTask(projectId, options.feedback)
|
|
256
|
-
|
|
257
|
-
// Sync to Linear if task has linearId
|
|
258
|
-
const linearId = (currentTask as { linearId?: string }).linearId
|
|
259
|
-
if (linearId) {
|
|
260
|
-
try {
|
|
261
|
-
const creds = await getProjectCredentials(projectId)
|
|
262
|
-
const apiKey = await getLinearApiKey(projectId)
|
|
263
|
-
if (apiKey && creds.linear?.teamId) {
|
|
264
|
-
await linearService.initializeFromApiKey(apiKey, creds.linear.teamId)
|
|
265
|
-
await linearService.markDone(linearId)
|
|
266
|
-
out.done(`${task}${duration ? ` (${duration}${varianceDisplay})` : ''} → Linear ✓`)
|
|
267
|
-
} else {
|
|
268
|
-
out.done(`${task}${duration ? ` (${duration}${varianceDisplay})` : ''}`)
|
|
269
|
-
}
|
|
270
|
-
} catch {
|
|
271
|
-
// Linear sync failed silently - don't block the workflow
|
|
272
|
-
out.done(`${task}${duration ? ` (${duration}${varianceDisplay})` : ''}`)
|
|
273
|
-
}
|
|
274
|
-
} else {
|
|
275
|
-
out.done(`${task}${duration ? ` (${duration}${varianceDisplay})` : ''}`)
|
|
276
|
-
}
|
|
277
|
-
showStateInfo('completed')
|
|
278
|
-
showNextSteps('done')
|
|
279
|
-
|
|
280
|
-
await this.logToMemory(projectPath, 'task_completed', {
|
|
281
|
-
task,
|
|
282
|
-
duration,
|
|
283
|
-
estimatedPoints,
|
|
284
|
-
estimatedMinutes,
|
|
285
|
-
actualMinutes,
|
|
286
|
-
timestamp: dateHelper.getTimestamp(),
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
// Run after_done hooks
|
|
290
|
-
await runWorkflowHooks(projectId, 'after', 'done', {
|
|
291
|
-
projectPath,
|
|
292
|
-
skipHooks: options.skipHooks,
|
|
293
|
-
})
|
|
294
|
-
|
|
295
|
-
return { success: true, task, duration }
|
|
296
|
-
} catch (error) {
|
|
297
|
-
out.fail(getErrorMessage(error))
|
|
298
|
-
return { success: false, error: getErrorMessage(error) }
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* /p:next - Show priority queue
|
|
304
|
-
*/
|
|
305
|
-
async next(projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
306
|
-
try {
|
|
307
|
-
const initResult = await this.ensureProjectInit(projectPath)
|
|
308
|
-
if (!initResult.success) return initResult
|
|
309
|
-
|
|
310
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
311
|
-
if (!projectId) {
|
|
312
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
313
|
-
return { success: false, error: 'No project ID found' }
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// Read queue from storage
|
|
317
|
-
const tasks = await queueStorage.getActiveTasks(projectId)
|
|
318
|
-
|
|
319
|
-
if (tasks.length === 0) {
|
|
320
|
-
out.warn('queue empty')
|
|
321
|
-
return { success: true, message: 'Queue is empty' }
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
out.done(`${tasks.length} task${tasks.length !== 1 ? 's' : ''} queued`)
|
|
325
|
-
showNextSteps('next')
|
|
326
|
-
|
|
327
|
-
return { success: true, tasks, count: tasks.length }
|
|
328
|
-
} catch (error) {
|
|
329
|
-
out.fail(getErrorMessage(error))
|
|
330
|
-
return { success: false, error: getErrorMessage(error) }
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* /p:pause - Pause active task to handle interruption
|
|
336
|
-
*/
|
|
337
|
-
async pause(reason: string = '', projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
338
|
-
try {
|
|
339
|
-
const initResult = await this.ensureProjectInit(projectPath)
|
|
340
|
-
if (!initResult.success) return initResult
|
|
341
|
-
|
|
342
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
343
|
-
if (!projectId) {
|
|
344
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
345
|
-
return { success: false, error: 'No project ID found' }
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const currentTask = await stateStorage.getCurrentTask(projectId)
|
|
349
|
-
|
|
350
|
-
if (!currentTask) {
|
|
351
|
-
out.warn('no active task to pause')
|
|
352
|
-
return { success: false, message: 'No active task to pause' }
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
// Write-through: Pause task (JSON → MD → Event)
|
|
356
|
-
await stateStorage.pauseTask(projectId, reason)
|
|
357
|
-
|
|
358
|
-
const taskDesc = currentTask.description.slice(0, 40)
|
|
359
|
-
out.done(`paused: ${taskDesc}${reason ? ` (${reason})` : ''}`)
|
|
360
|
-
showStateInfo('paused')
|
|
361
|
-
showNextSteps('pause')
|
|
362
|
-
|
|
363
|
-
await this.logToMemory(projectPath, 'task_paused', {
|
|
364
|
-
task: currentTask.description,
|
|
365
|
-
reason,
|
|
366
|
-
timestamp: dateHelper.getTimestamp(),
|
|
367
|
-
})
|
|
368
|
-
|
|
369
|
-
return { success: true, task: currentTask.description, reason }
|
|
370
|
-
} catch (error) {
|
|
371
|
-
out.fail(getErrorMessage(error))
|
|
372
|
-
return { success: false, error: getErrorMessage(error) }
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* /p:resume - Resume most recently paused task
|
|
378
|
-
*/
|
|
379
|
-
async resume(
|
|
380
|
-
_taskId: string | null = null,
|
|
381
|
-
projectPath: string = process.cwd()
|
|
382
|
-
): Promise<CommandResult> {
|
|
383
|
-
try {
|
|
384
|
-
const initResult = await this.ensureProjectInit(projectPath)
|
|
385
|
-
if (!initResult.success) return initResult
|
|
386
|
-
|
|
387
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
388
|
-
if (!projectId) {
|
|
389
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
390
|
-
return { success: false, error: 'No project ID found' }
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// Check if already working on a task
|
|
394
|
-
const currentTask = await stateStorage.getCurrentTask(projectId)
|
|
395
|
-
if (currentTask) {
|
|
396
|
-
out.warn('already working on a task')
|
|
397
|
-
return { success: false, message: `Already working on: ${currentTask.description}` }
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// Write-through: Resume task (JSON → MD → Event)
|
|
401
|
-
const resumed = await stateStorage.resumeTask(projectId)
|
|
402
|
-
|
|
403
|
-
if (!resumed) {
|
|
404
|
-
out.warn('no paused task to resume')
|
|
405
|
-
return { success: false, message: 'No paused task found' }
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
out.done(`resumed: ${resumed.description.slice(0, 40)}`)
|
|
409
|
-
showStateInfo('working')
|
|
410
|
-
showNextSteps('resume')
|
|
411
|
-
|
|
412
|
-
await this.logToMemory(projectPath, 'task_resumed', {
|
|
413
|
-
task: resumed.description,
|
|
414
|
-
timestamp: dateHelper.getTimestamp(),
|
|
415
|
-
})
|
|
416
|
-
|
|
417
|
-
return { success: true, task: resumed.description }
|
|
418
|
-
} catch (error) {
|
|
419
|
-
out.fail(getErrorMessage(error))
|
|
420
|
-
return { success: false, error: getErrorMessage(error) }
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* /p:workflow - View and manage workflow preferences
|
|
426
|
-
*
|
|
427
|
-
* When called without arguments, shows current preferences.
|
|
428
|
-
* With arguments, parses natural language and updates preferences.
|
|
429
|
-
*/
|
|
430
|
-
async workflow(
|
|
431
|
-
input: string | null = null,
|
|
432
|
-
projectPath: string = process.cwd()
|
|
433
|
-
): Promise<CommandResult> {
|
|
434
|
-
try {
|
|
435
|
-
const initResult = await this.ensureProjectInit(projectPath)
|
|
436
|
-
if (!initResult.success) return initResult
|
|
437
|
-
|
|
438
|
-
const projectId = await configManager.getProjectId(projectPath)
|
|
439
|
-
if (!projectId) {
|
|
440
|
-
out.failWithHint('NO_PROJECT_ID')
|
|
441
|
-
return { success: false, error: 'No project ID found' }
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
if (!input) {
|
|
445
|
-
// Show current preferences
|
|
446
|
-
const preferences = await listWorkflowPreferences(projectId)
|
|
447
|
-
console.log(formatWorkflowPreferences(preferences))
|
|
448
|
-
return { success: true, preferences }
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Return info for template-based processing
|
|
452
|
-
// The template/LLM will parse the natural language and call the appropriate functions
|
|
453
|
-
return {
|
|
454
|
-
success: true,
|
|
455
|
-
projectId,
|
|
456
|
-
input,
|
|
457
|
-
// Export functions for template use
|
|
458
|
-
setWorkflowPreference: async (pref: {
|
|
459
|
-
hook: HookPhase
|
|
460
|
-
command: HookCommand
|
|
461
|
-
action: string
|
|
462
|
-
scope: PreferenceScope
|
|
463
|
-
}) => {
|
|
464
|
-
await setWorkflowPreference(projectId, {
|
|
465
|
-
...pref,
|
|
466
|
-
createdAt: dateHelper.getTimestamp(),
|
|
467
|
-
})
|
|
468
|
-
},
|
|
469
|
-
removeWorkflowPreference: async (hook: HookPhase, command: HookCommand) => {
|
|
470
|
-
await removeWorkflowPreference(projectId, hook, command)
|
|
471
|
-
},
|
|
472
|
-
listWorkflowPreferences: async () => {
|
|
473
|
-
return listWorkflowPreferences(projectId)
|
|
474
|
-
},
|
|
475
|
-
}
|
|
476
|
-
} catch (error) {
|
|
477
|
-
out.fail(getErrorMessage(error))
|
|
478
|
-
return { success: false, error: getErrorMessage(error) }
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
// =============================================================================
|
|
484
|
-
// Helpers
|
|
485
|
-
// =============================================================================
|
|
486
|
-
|
|
487
|
-
/** Format minutes to a human-readable duration string */
|
|
488
|
-
function formatMinutesToDuration(minutes: number): string {
|
|
489
|
-
if (minutes < 60) return `${minutes}m`
|
|
490
|
-
const hours = Math.floor(minutes / 60)
|
|
491
|
-
const mins = minutes % 60
|
|
492
|
-
return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/** Format a variance in minutes to a string like "+30m" or "-15m" */
|
|
496
|
-
function formatVariance(diffMinutes: number): string {
|
|
497
|
-
const sign = diffMinutes >= 0 ? '+' : '-'
|
|
498
|
-
const abs = Math.abs(diffMinutes)
|
|
499
|
-
if (abs >= 60) {
|
|
500
|
-
const hours = Math.floor(abs / 60)
|
|
501
|
-
const mins = abs % 60
|
|
502
|
-
return mins > 0 ? `${sign}${hours}h ${mins}m` : `${sign}${hours}h`
|
|
503
|
-
}
|
|
504
|
-
return `${sign}${abs}m`
|
|
505
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "1.0.0",
|
|
3
|
-
"description": "Maps commands to context sections for prompt injection. Wildcard * ensures new commands get sensible defaults instead of zero context.",
|
|
4
|
-
"commands": {
|
|
5
|
-
"now": { "agents": true, "patterns": true, "checklist": true, "modules": [] },
|
|
6
|
-
"build": { "agents": true, "patterns": true, "checklist": true, "modules": [] },
|
|
7
|
-
"feature": { "agents": true, "patterns": true, "checklist": true, "modules": [] },
|
|
8
|
-
"design": { "agents": true, "patterns": true, "checklist": true, "modules": [] },
|
|
9
|
-
"fix": { "agents": true, "patterns": true, "checklist": true, "modules": [] },
|
|
10
|
-
"bug": {
|
|
11
|
-
"agents": true,
|
|
12
|
-
"patterns": true,
|
|
13
|
-
"checklist": true,
|
|
14
|
-
"modules": ["CLAUDE-intelligence.md"]
|
|
15
|
-
},
|
|
16
|
-
"test": { "agents": true, "patterns": true, "checklist": false, "modules": [] },
|
|
17
|
-
"work": {
|
|
18
|
-
"agents": true,
|
|
19
|
-
"patterns": true,
|
|
20
|
-
"checklist": true,
|
|
21
|
-
"modules": ["CLAUDE-intelligence.md", "CLAUDE-storage.md"]
|
|
22
|
-
},
|
|
23
|
-
"cleanup": { "agents": true, "patterns": true, "checklist": true, "modules": [] },
|
|
24
|
-
"spec": {
|
|
25
|
-
"agents": true,
|
|
26
|
-
"patterns": true,
|
|
27
|
-
"checklist": true,
|
|
28
|
-
"modules": ["CLAUDE-intelligence.md"]
|
|
29
|
-
},
|
|
30
|
-
"init": { "agents": false, "patterns": true, "checklist": false, "modules": [] },
|
|
31
|
-
"task": {
|
|
32
|
-
"agents": false,
|
|
33
|
-
"patterns": false,
|
|
34
|
-
"checklist": false,
|
|
35
|
-
"modules": ["CLAUDE-intelligence.md", "CLAUDE-storage.md"]
|
|
36
|
-
},
|
|
37
|
-
"ship": {
|
|
38
|
-
"agents": false,
|
|
39
|
-
"patterns": true,
|
|
40
|
-
"checklist": true,
|
|
41
|
-
"modules": ["CLAUDE-intelligence.md", "CLAUDE-storage.md"]
|
|
42
|
-
},
|
|
43
|
-
"done": {
|
|
44
|
-
"agents": false,
|
|
45
|
-
"patterns": false,
|
|
46
|
-
"checklist": true,
|
|
47
|
-
"modules": ["CLAUDE-storage.md"]
|
|
48
|
-
},
|
|
49
|
-
"review": { "agents": true, "patterns": true, "checklist": true, "modules": [] },
|
|
50
|
-
"refactor": {
|
|
51
|
-
"agents": true,
|
|
52
|
-
"patterns": true,
|
|
53
|
-
"checklist": true,
|
|
54
|
-
"modules": ["CLAUDE-intelligence.md"]
|
|
55
|
-
},
|
|
56
|
-
"sync": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
57
|
-
"dash": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
58
|
-
"next": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
59
|
-
"pause": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
60
|
-
"resume": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
61
|
-
"idea": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
62
|
-
"history": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
63
|
-
"status": { "agents": false, "patterns": false, "checklist": false, "modules": [] },
|
|
64
|
-
"*": { "agents": true, "patterns": true, "checklist": false, "modules": [] }
|
|
65
|
-
}
|
|
66
|
-
}
|