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
package/core/utils/keychain.ts
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Keychain Helper - Secure credential storage
|
|
3
|
-
*
|
|
4
|
-
* Uses macOS Keychain for secure storage of API keys and tokens.
|
|
5
|
-
* Falls back to environment variables if keychain is not available.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { exec } from 'node:child_process'
|
|
9
|
-
import { promisify } from 'node:util'
|
|
10
|
-
import { getErrorMessage } from '../types/fs'
|
|
11
|
-
|
|
12
|
-
const execAsync = promisify(exec)
|
|
13
|
-
|
|
14
|
-
const SERVICE_NAME = 'prjct-cli'
|
|
15
|
-
|
|
16
|
-
export type CredentialKey = 'linear-api-key' | 'jira-api-token'
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Store a credential in the keychain
|
|
20
|
-
*/
|
|
21
|
-
export async function setCredential(key: CredentialKey, value: string): Promise<boolean> {
|
|
22
|
-
if (process.platform !== 'darwin') {
|
|
23
|
-
console.warn('[keychain] macOS Keychain only available on macOS')
|
|
24
|
-
return false
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
try {
|
|
28
|
-
// Delete existing entry first (ignore errors if it doesn't exist)
|
|
29
|
-
await execAsync(
|
|
30
|
-
`security delete-generic-password -s "${SERVICE_NAME}" -a "${key}" 2>/dev/null || true`
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
// Add new entry
|
|
34
|
-
await execAsync(`security add-generic-password -s "${SERVICE_NAME}" -a "${key}" -w "${value}"`)
|
|
35
|
-
|
|
36
|
-
return true
|
|
37
|
-
} catch (error) {
|
|
38
|
-
console.error('[keychain] Failed to store credential:', getErrorMessage(error))
|
|
39
|
-
return false
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Get a credential from the keychain
|
|
45
|
-
*/
|
|
46
|
-
export async function getCredential(key: CredentialKey): Promise<string | null> {
|
|
47
|
-
if (process.platform !== 'darwin') {
|
|
48
|
-
// Fallback to environment variables on non-macOS
|
|
49
|
-
return getEnvFallback(key)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
const { stdout } = await execAsync(
|
|
54
|
-
`security find-generic-password -s "${SERVICE_NAME}" -a "${key}" -w 2>/dev/null`
|
|
55
|
-
)
|
|
56
|
-
return stdout.trim() || null
|
|
57
|
-
} catch (_error) {
|
|
58
|
-
// Not found in keychain - expected, try environment variable
|
|
59
|
-
return getEnvFallback(key)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Delete a credential from the keychain
|
|
65
|
-
*/
|
|
66
|
-
export async function deleteCredential(key: CredentialKey): Promise<boolean> {
|
|
67
|
-
if (process.platform !== 'darwin') {
|
|
68
|
-
return false
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
await execAsync(`security delete-generic-password -s "${SERVICE_NAME}" -a "${key}" 2>/dev/null`)
|
|
73
|
-
return true
|
|
74
|
-
} catch (_error) {
|
|
75
|
-
// Not found in keychain - expected
|
|
76
|
-
return false
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Check if a credential exists
|
|
82
|
-
*/
|
|
83
|
-
export async function hasCredential(key: CredentialKey): Promise<boolean> {
|
|
84
|
-
const value = await getCredential(key)
|
|
85
|
-
return value !== null && value.length > 0
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Get environment variable fallback for a credential key
|
|
90
|
-
*/
|
|
91
|
-
function getEnvFallback(key: CredentialKey): string | null {
|
|
92
|
-
const envMap: Record<CredentialKey, string> = {
|
|
93
|
-
'linear-api-key': 'LINEAR_API_KEY',
|
|
94
|
-
'jira-api-token': 'JIRA_API_TOKEN',
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const envVar = envMap[key]
|
|
98
|
-
return process.env[envVar] || null
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Get credential with source information
|
|
103
|
-
*/
|
|
104
|
-
export async function getCredentialWithSource(
|
|
105
|
-
key: CredentialKey
|
|
106
|
-
): Promise<{ value: string | null; source: 'keychain' | 'env' | 'none' }> {
|
|
107
|
-
if (process.platform === 'darwin') {
|
|
108
|
-
try {
|
|
109
|
-
const { stdout } = await execAsync(
|
|
110
|
-
`security find-generic-password -s "${SERVICE_NAME}" -a "${key}" -w 2>/dev/null`
|
|
111
|
-
)
|
|
112
|
-
const value = stdout.trim()
|
|
113
|
-
if (value) {
|
|
114
|
-
return { value, source: 'keychain' }
|
|
115
|
-
}
|
|
116
|
-
} catch (_error) {
|
|
117
|
-
// Not in keychain - expected, check env
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const envValue = getEnvFallback(key)
|
|
122
|
-
if (envValue) {
|
|
123
|
-
return { value: envValue, source: 'env' }
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return { value: null, source: 'none' }
|
|
127
|
-
}
|
package/core/utils/logger.ts
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger - Centralized logging with levels
|
|
3
|
-
*
|
|
4
|
-
* Silent by default. Enable with:
|
|
5
|
-
* PRJCT_DEBUG=1 (all logs)
|
|
6
|
-
* PRJCT_DEBUG=error (errors only)
|
|
7
|
-
* PRJCT_DEBUG=warn (errors + warnings)
|
|
8
|
-
* PRJCT_DEBUG=info (errors + warnings + info)
|
|
9
|
-
* PRJCT_DEBUG=debug (everything)
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* import log from './utils/logger'
|
|
13
|
-
* log.debug('Processing files...')
|
|
14
|
-
* log.info('Task started')
|
|
15
|
-
* log.warn('Cache miss')
|
|
16
|
-
* log.error('Failed to load', error.message)
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import type { LogFunction, Logger, LogLevel } from '../types/logger'
|
|
20
|
-
|
|
21
|
-
const LEVELS: Record<LogLevel, number> = { error: 0, warn: 1, info: 2, debug: 3 }
|
|
22
|
-
const TRUTHY_VALUES = new Set(['1', 'true', '*'])
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Determine log level from environment variables
|
|
26
|
-
* Returns -1 (disabled) or a level from LEVELS
|
|
27
|
-
*/
|
|
28
|
-
function getLogLevel(): { level: number; name: LogLevel | 'disabled' } {
|
|
29
|
-
// PRJCT_DEBUG (primary) or DEBUG (fallback): Enable debug logging
|
|
30
|
-
// Values: '1', 'true', a log level name, or 'prjct' to match
|
|
31
|
-
const debugEnv = process.env.PRJCT_DEBUG || process.env.DEBUG || ''
|
|
32
|
-
|
|
33
|
-
// Disabled if empty
|
|
34
|
-
if (!debugEnv) return { level: -1, name: 'disabled' }
|
|
35
|
-
|
|
36
|
-
// Enable all logs for common truthy values or prjct-related patterns
|
|
37
|
-
if (TRUTHY_VALUES.has(debugEnv) || debugEnv.includes('prjct')) {
|
|
38
|
-
return { level: LEVELS.debug, name: 'debug' }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Check for specific level name (error, warn, info, debug)
|
|
42
|
-
const levelValue = LEVELS[debugEnv as LogLevel] ?? -1
|
|
43
|
-
const levelName = levelValue >= 0 ? (debugEnv as LogLevel) : 'disabled'
|
|
44
|
-
return { level: levelValue, name: levelName }
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const { level: currentLevel, name: currentLevelName } = getLogLevel()
|
|
48
|
-
|
|
49
|
-
// No-op function for disabled logs
|
|
50
|
-
const noop: LogFunction = () => {}
|
|
51
|
-
|
|
52
|
-
// Factory for creating log methods
|
|
53
|
-
function createLogMethod(
|
|
54
|
-
levelThreshold: number,
|
|
55
|
-
prefix: string,
|
|
56
|
-
method: 'log' | 'warn' | 'error'
|
|
57
|
-
): LogFunction {
|
|
58
|
-
return currentLevel >= levelThreshold
|
|
59
|
-
? (...args: unknown[]) => console[method](prefix, ...args)
|
|
60
|
-
: noop
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Create logger methods
|
|
64
|
-
const logger: Logger = {
|
|
65
|
-
error: createLogMethod(LEVELS.error, '[prjct:error]', 'error'),
|
|
66
|
-
warn: createLogMethod(LEVELS.warn, '[prjct:warn]', 'warn'),
|
|
67
|
-
info: createLogMethod(LEVELS.info, '[prjct:info]', 'log'),
|
|
68
|
-
debug: createLogMethod(LEVELS.debug, '[prjct:debug]', 'log'),
|
|
69
|
-
|
|
70
|
-
// Check if logging is enabled (useful for expensive log prep)
|
|
71
|
-
isEnabled: () => currentLevel >= 0,
|
|
72
|
-
|
|
73
|
-
// Get current level name (pre-computed, no runtime lookup)
|
|
74
|
-
level: () => currentLevelName,
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export default logger
|
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MarkdownBuilder - Fluent API for constructing markdown documents
|
|
3
|
-
*
|
|
4
|
-
* Eliminates duplicated markdown generation across:
|
|
5
|
-
* - state-storage.ts (~35 lines)
|
|
6
|
-
* - queue-storage.ts (~45 lines)
|
|
7
|
-
* - ideas-storage.ts (~40 lines)
|
|
8
|
-
* - shipped-storage.ts (~25 lines)
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const content = md()
|
|
13
|
-
* .h1('Title')
|
|
14
|
-
* .p('Description')
|
|
15
|
-
* .when(hasItems, m => m.list(items))
|
|
16
|
-
* .build()
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
export class MarkdownBuilder {
|
|
21
|
-
private lines: string[] = []
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Add H1 heading
|
|
25
|
-
*/
|
|
26
|
-
h1(text: string): this {
|
|
27
|
-
this.lines.push(`# ${text}`, '')
|
|
28
|
-
return this
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Add H2 heading
|
|
33
|
-
*/
|
|
34
|
-
h2(text: string): this {
|
|
35
|
-
this.lines.push(`## ${text}`, '')
|
|
36
|
-
return this
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Add H3 heading
|
|
41
|
-
*/
|
|
42
|
-
h3(text: string): this {
|
|
43
|
-
this.lines.push(`### ${text}`)
|
|
44
|
-
return this
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Add H4 heading
|
|
49
|
-
*/
|
|
50
|
-
h4(text: string): this {
|
|
51
|
-
this.lines.push(`#### ${text}`)
|
|
52
|
-
return this
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Add paragraph
|
|
57
|
-
*/
|
|
58
|
-
p(text: string): this {
|
|
59
|
-
this.lines.push(text, '')
|
|
60
|
-
return this
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Add bold text on its own line
|
|
65
|
-
*/
|
|
66
|
-
bold(text: string): this {
|
|
67
|
-
this.lines.push(`**${text}**`)
|
|
68
|
-
return this
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Add italic text on its own line
|
|
73
|
-
*/
|
|
74
|
-
italic(text: string): this {
|
|
75
|
-
this.lines.push(`*${text}*`)
|
|
76
|
-
return this
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Add inline code
|
|
81
|
-
*/
|
|
82
|
-
code(text: string): this {
|
|
83
|
-
this.lines.push(`\`${text}\``)
|
|
84
|
-
return this
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Add code block
|
|
89
|
-
*/
|
|
90
|
-
codeBlock(code: string, lang = ''): this {
|
|
91
|
-
this.lines.push(`\`\`\`${lang}`, code, '```', '')
|
|
92
|
-
return this
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Add list item with optional checkbox
|
|
97
|
-
*/
|
|
98
|
-
li(text: string, options?: { checked?: boolean; indent?: number }): this {
|
|
99
|
-
const indent = ' '.repeat(options?.indent ?? 0)
|
|
100
|
-
if (options?.checked !== undefined) {
|
|
101
|
-
this.lines.push(`${indent}- [${options.checked ? 'x' : ' '}] ${text}`)
|
|
102
|
-
} else {
|
|
103
|
-
this.lines.push(`${indent}- ${text}`)
|
|
104
|
-
}
|
|
105
|
-
return this
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Add numbered list item
|
|
110
|
-
*/
|
|
111
|
-
oli(text: string, number: number): this {
|
|
112
|
-
this.lines.push(`${number}. ${text}`)
|
|
113
|
-
return this
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Add multiple list items
|
|
118
|
-
*/
|
|
119
|
-
list(items: string[], options?: { checked?: boolean }): this {
|
|
120
|
-
for (const item of items) {
|
|
121
|
-
this.li(item, options)
|
|
122
|
-
}
|
|
123
|
-
return this
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Add multiple numbered list items
|
|
128
|
-
*/
|
|
129
|
-
orderedList(items: string[]): this {
|
|
130
|
-
for (let i = 0; i < items.length; i++) {
|
|
131
|
-
this.oli(items[i], i + 1)
|
|
132
|
-
}
|
|
133
|
-
return this
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Add horizontal rule
|
|
138
|
-
*/
|
|
139
|
-
hr(): this {
|
|
140
|
-
this.lines.push('', '---', '')
|
|
141
|
-
return this
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Add blank line
|
|
146
|
-
*/
|
|
147
|
-
blank(): this {
|
|
148
|
-
this.lines.push('')
|
|
149
|
-
return this
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Add raw line(s)
|
|
154
|
-
*/
|
|
155
|
-
raw(text: string): this {
|
|
156
|
-
this.lines.push(text)
|
|
157
|
-
return this
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Add multiple raw lines
|
|
162
|
-
*/
|
|
163
|
-
rawLines(lines: string[]): this {
|
|
164
|
-
this.lines.push(...lines)
|
|
165
|
-
return this
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Add blockquote
|
|
170
|
-
*/
|
|
171
|
-
quote(text: string): this {
|
|
172
|
-
this.lines.push(`> ${text}`)
|
|
173
|
-
return this
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Add link
|
|
178
|
-
*/
|
|
179
|
-
link(text: string, url: string): this {
|
|
180
|
-
this.lines.push(`[${text}](${url})`)
|
|
181
|
-
return this
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Add key-value pair (bold key)
|
|
186
|
-
*/
|
|
187
|
-
kv(key: string, value: string): this {
|
|
188
|
-
this.lines.push(`**${key}:** ${value}`)
|
|
189
|
-
return this
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Add table from data
|
|
194
|
-
*/
|
|
195
|
-
table(headers: string[], rows: string[][]): this {
|
|
196
|
-
// Header row
|
|
197
|
-
this.lines.push(`| ${headers.join(' | ')} |`)
|
|
198
|
-
// Separator
|
|
199
|
-
this.lines.push(`| ${headers.map(() => '---').join(' | ')} |`)
|
|
200
|
-
// Data rows
|
|
201
|
-
rows.forEach((row) => {
|
|
202
|
-
this.lines.push(`| ${row.join(' | ')} |`)
|
|
203
|
-
})
|
|
204
|
-
this.blank()
|
|
205
|
-
return this
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Conditional block - only adds content if condition is true
|
|
210
|
-
*/
|
|
211
|
-
when(condition: boolean, builder: (md: MarkdownBuilder) => void): this {
|
|
212
|
-
if (condition) {
|
|
213
|
-
builder(this)
|
|
214
|
-
}
|
|
215
|
-
return this
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Optional block - only adds content if value exists
|
|
220
|
-
*/
|
|
221
|
-
maybe<T>(value: T | null | undefined, builder: (md: MarkdownBuilder, val: T) => void): this {
|
|
222
|
-
if (value != null) {
|
|
223
|
-
builder(this, value)
|
|
224
|
-
}
|
|
225
|
-
return this
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Iterate and build for each item
|
|
230
|
-
*/
|
|
231
|
-
each<T>(items: T[], builder: (md: MarkdownBuilder, item: T, index: number) => void): this {
|
|
232
|
-
for (let i = 0; i < items.length; i++) {
|
|
233
|
-
builder(this, items[i], i)
|
|
234
|
-
}
|
|
235
|
-
return this
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Add section with heading and content
|
|
240
|
-
*/
|
|
241
|
-
section(heading: string, level: 1 | 2 | 3 | 4, builder: (md: MarkdownBuilder) => void): this {
|
|
242
|
-
switch (level) {
|
|
243
|
-
case 1:
|
|
244
|
-
this.h1(heading)
|
|
245
|
-
break
|
|
246
|
-
case 2:
|
|
247
|
-
this.h2(heading)
|
|
248
|
-
break
|
|
249
|
-
case 3:
|
|
250
|
-
this.h3(heading)
|
|
251
|
-
break
|
|
252
|
-
case 4:
|
|
253
|
-
this.h4(heading)
|
|
254
|
-
break
|
|
255
|
-
}
|
|
256
|
-
builder(this)
|
|
257
|
-
return this
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Build final markdown string
|
|
262
|
-
*/
|
|
263
|
-
build(): string {
|
|
264
|
-
return this.lines.join('\n')
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Get current line count
|
|
269
|
-
*/
|
|
270
|
-
get length(): number {
|
|
271
|
-
return this.lines.length
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Factory function for fluent API
|
|
277
|
-
*/
|
|
278
|
-
export function md(): MarkdownBuilder {
|
|
279
|
-
return new MarkdownBuilder()
|
|
280
|
-
}
|
package/core/utils/next-steps.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Next Steps - Show explicit guidance after each command
|
|
3
|
-
*
|
|
4
|
-
* Uses the workflow state machine to show valid commands
|
|
5
|
-
* for the current state.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import chalk from 'chalk'
|
|
9
|
-
import { type WorkflowState, workflowStateMachine } from '../workflow/state-machine'
|
|
10
|
-
|
|
11
|
-
interface NextStep {
|
|
12
|
-
cmd: string
|
|
13
|
-
desc: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Command descriptions for display
|
|
18
|
-
*/
|
|
19
|
-
const CMD_DESCRIPTIONS: Record<string, string> = {
|
|
20
|
-
task: 'Start new task',
|
|
21
|
-
done: 'Complete current task',
|
|
22
|
-
pause: 'Pause and switch context',
|
|
23
|
-
resume: 'Continue paused task',
|
|
24
|
-
ship: 'Ship the feature',
|
|
25
|
-
reopen: 'Reopen for rework',
|
|
26
|
-
next: 'View task queue',
|
|
27
|
-
sync: 'Analyze project',
|
|
28
|
-
bug: 'Report a bug',
|
|
29
|
-
idea: 'Capture an idea',
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Map command to resulting workflow state
|
|
34
|
-
*/
|
|
35
|
-
const COMMAND_TO_STATE: Record<string, WorkflowState> = {
|
|
36
|
-
task: 'working',
|
|
37
|
-
done: 'completed',
|
|
38
|
-
'done-subtask': 'working', // Still working on subtasks
|
|
39
|
-
pause: 'paused',
|
|
40
|
-
resume: 'working',
|
|
41
|
-
ship: 'shipped',
|
|
42
|
-
reopen: 'working',
|
|
43
|
-
next: 'idle',
|
|
44
|
-
sync: 'idle',
|
|
45
|
-
init: 'idle',
|
|
46
|
-
bug: 'working',
|
|
47
|
-
idea: 'idle',
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Show next steps after a command
|
|
52
|
-
*/
|
|
53
|
-
export function showNextSteps(command: string, options: { quiet?: boolean } = {}): void {
|
|
54
|
-
if (options.quiet) return
|
|
55
|
-
|
|
56
|
-
// Get the state after this command
|
|
57
|
-
const resultingState = COMMAND_TO_STATE[command] || 'idle'
|
|
58
|
-
|
|
59
|
-
// Get valid commands for that state
|
|
60
|
-
const validCommands = workflowStateMachine.getValidCommands(resultingState)
|
|
61
|
-
|
|
62
|
-
if (validCommands.length === 0) return
|
|
63
|
-
|
|
64
|
-
const steps: NextStep[] = validCommands.map((cmd) => ({
|
|
65
|
-
cmd: `p. ${cmd}`,
|
|
66
|
-
desc: CMD_DESCRIPTIONS[cmd] || cmd,
|
|
67
|
-
}))
|
|
68
|
-
|
|
69
|
-
console.log(chalk.dim('\nNext:'))
|
|
70
|
-
for (const step of steps) {
|
|
71
|
-
const cmd = chalk.cyan(step.cmd.padEnd(12))
|
|
72
|
-
console.log(chalk.dim(` ${cmd} → ${step.desc}`))
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Get next steps for a command (for programmatic use)
|
|
78
|
-
*/
|
|
79
|
-
export function getNextSteps(command: string): NextStep[] {
|
|
80
|
-
const resultingState = COMMAND_TO_STATE[command] || 'idle'
|
|
81
|
-
const validCommands = workflowStateMachine.getValidCommands(resultingState)
|
|
82
|
-
|
|
83
|
-
return validCommands.map((cmd) => ({
|
|
84
|
-
cmd: `p. ${cmd}`,
|
|
85
|
-
desc: CMD_DESCRIPTIONS[cmd] || cmd,
|
|
86
|
-
}))
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Show current state info
|
|
91
|
-
*/
|
|
92
|
-
export function showStateInfo(state: WorkflowState): void {
|
|
93
|
-
const info = workflowStateMachine.getStateInfo(state)
|
|
94
|
-
console.log(chalk.dim(`📍 State: ${chalk.white(state.toUpperCase())} - ${info.description}`))
|
|
95
|
-
}
|