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,291 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enriched Task Schema
|
|
3
|
-
* Defines the structure of a fully enriched task from PM Expert
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { z } from 'zod'
|
|
7
|
-
|
|
8
|
-
// =============================================================================
|
|
9
|
-
// Enums
|
|
10
|
-
// =============================================================================
|
|
11
|
-
|
|
12
|
-
export const TaskTypeSchema = z.enum([
|
|
13
|
-
'feature',
|
|
14
|
-
'bug',
|
|
15
|
-
'improvement',
|
|
16
|
-
'task',
|
|
17
|
-
'chore',
|
|
18
|
-
'spike',
|
|
19
|
-
'epic',
|
|
20
|
-
])
|
|
21
|
-
|
|
22
|
-
export const PrioritySchema = z.enum(['critical', 'high', 'medium', 'low', 'none'])
|
|
23
|
-
|
|
24
|
-
export const ComplexitySchema = z.enum([
|
|
25
|
-
'trivial', // < 1 hour
|
|
26
|
-
'small', // 1-4 hours
|
|
27
|
-
'medium', // 1-2 days
|
|
28
|
-
'large', // 3-5 days
|
|
29
|
-
'epic', // > 1 week
|
|
30
|
-
])
|
|
31
|
-
|
|
32
|
-
export const RiskLevelSchema = z.enum(['none', 'low', 'medium', 'high', 'critical'])
|
|
33
|
-
|
|
34
|
-
// =============================================================================
|
|
35
|
-
// User Story
|
|
36
|
-
// =============================================================================
|
|
37
|
-
|
|
38
|
-
export const UserStorySchema = z.object({
|
|
39
|
-
role: z.string().describe('The user role (e.g., "mobile user")'),
|
|
40
|
-
action: z.string().describe('What the user wants to do'),
|
|
41
|
-
benefit: z.string().describe('The benefit they get'),
|
|
42
|
-
formatted: z
|
|
43
|
-
.string()
|
|
44
|
-
.describe('Formatted user story: "As a [role], I want [action] so that [benefit]"'),
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
// =============================================================================
|
|
48
|
-
// Acceptance Criteria
|
|
49
|
-
// =============================================================================
|
|
50
|
-
|
|
51
|
-
export const AcceptanceCriterionSchema = z.object({
|
|
52
|
-
id: z.string().describe('Unique criterion ID (e.g., AC-1)'),
|
|
53
|
-
description: z.string().describe('Criterion description'),
|
|
54
|
-
type: z.enum(['functional', 'technical', 'ux', 'performance']).default('functional'),
|
|
55
|
-
testable: z.boolean().default(true).describe('Whether it is verifiable/testable'),
|
|
56
|
-
gherkin: z.string().optional().describe('Optional Given/When/Then format'),
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
// =============================================================================
|
|
60
|
-
// Dependencies
|
|
61
|
-
// =============================================================================
|
|
62
|
-
|
|
63
|
-
export const CodeDependencySchema = z.object({
|
|
64
|
-
file: z.string().describe('File path'),
|
|
65
|
-
reason: z.string().describe('Why it is relevant'),
|
|
66
|
-
risk: RiskLevelSchema.describe('Risk level of modifying'),
|
|
67
|
-
lines: z.string().optional().describe('Specific lines (e.g., "45-67")'),
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
export const ApiDependencySchema = z.object({
|
|
71
|
-
endpoint: z.string().describe('Endpoint (e.g., POST /api/auth/login)'),
|
|
72
|
-
method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).optional(),
|
|
73
|
-
status: z.enum(['stable', 'in_development', 'deprecated']).default('stable'),
|
|
74
|
-
risk: RiskLevelSchema,
|
|
75
|
-
notes: z.string().optional(),
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
export const TaskDependencySchema = z.object({
|
|
79
|
-
id: z.string().describe('Blocking task ID'),
|
|
80
|
-
title: z.string().describe('Task title'),
|
|
81
|
-
status: z.string().describe('Current status'),
|
|
82
|
-
blocking: z.boolean().default(false).describe('Whether it completely blocks'),
|
|
83
|
-
risk: RiskLevelSchema,
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
export const DependenciesSchema = z.object({
|
|
87
|
-
code: z.array(CodeDependencySchema).default([]),
|
|
88
|
-
api: z.array(ApiDependencySchema).default([]),
|
|
89
|
-
tasks: z.array(TaskDependencySchema).default([]),
|
|
90
|
-
infrastructure: z
|
|
91
|
-
.array(
|
|
92
|
-
z.object({
|
|
93
|
-
service: z.string(),
|
|
94
|
-
purpose: z.string(),
|
|
95
|
-
risk: RiskLevelSchema,
|
|
96
|
-
})
|
|
97
|
-
)
|
|
98
|
-
.default([]),
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
// =============================================================================
|
|
102
|
-
// Technical Analysis
|
|
103
|
-
// =============================================================================
|
|
104
|
-
|
|
105
|
-
export const TechnicalAnalysisSchema = z.object({
|
|
106
|
-
affectedFiles: z
|
|
107
|
-
.array(
|
|
108
|
-
z.object({
|
|
109
|
-
path: z.string(),
|
|
110
|
-
changes: z.string().describe('Expected changes'),
|
|
111
|
-
complexity: ComplexitySchema,
|
|
112
|
-
})
|
|
113
|
-
)
|
|
114
|
-
.default([]),
|
|
115
|
-
|
|
116
|
-
existingPatterns: z
|
|
117
|
-
.array(
|
|
118
|
-
z.object({
|
|
119
|
-
pattern: z.string().describe('Pattern name'),
|
|
120
|
-
file: z.string().describe('Reference file'),
|
|
121
|
-
relevance: z.string().describe('Why it is relevant'),
|
|
122
|
-
})
|
|
123
|
-
)
|
|
124
|
-
.default([]),
|
|
125
|
-
|
|
126
|
-
suggestedApproach: z.string().optional().describe('Recommended approach'),
|
|
127
|
-
|
|
128
|
-
potentialRisks: z
|
|
129
|
-
.array(
|
|
130
|
-
z.object({
|
|
131
|
-
risk: z.string(),
|
|
132
|
-
mitigation: z.string(),
|
|
133
|
-
severity: RiskLevelSchema,
|
|
134
|
-
})
|
|
135
|
-
)
|
|
136
|
-
.default([]),
|
|
137
|
-
|
|
138
|
-
testingStrategy: z
|
|
139
|
-
.object({
|
|
140
|
-
unit: z.array(z.string()).default([]),
|
|
141
|
-
integration: z.array(z.string()).default([]),
|
|
142
|
-
e2e: z.array(z.string()).default([]),
|
|
143
|
-
})
|
|
144
|
-
.optional(),
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
// =============================================================================
|
|
148
|
-
// LLM Prompt (AI-Agnostic)
|
|
149
|
-
// =============================================================================
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* LLM Prompt Schema
|
|
153
|
-
* Generates prompts compatible with any AI assistant:
|
|
154
|
-
* Claude, ChatGPT, Copilot, Gemini, Cursor, etc.
|
|
155
|
-
*/
|
|
156
|
-
export const LLMPromptSchema = z.object({
|
|
157
|
-
context: z.string().describe('Codebase context (stack, structure)'),
|
|
158
|
-
problem: z.string().describe('What problem needs to be solved'),
|
|
159
|
-
task: z.string().describe('Task description'),
|
|
160
|
-
instructions: z.array(z.string()).describe('Step-by-step instructions'),
|
|
161
|
-
files: z.array(z.string()).describe('Files to modify'),
|
|
162
|
-
patterns: z.array(z.string()).describe('Reference patterns to follow'),
|
|
163
|
-
acceptanceCriteria: z.array(z.string()).describe('How to know when done'),
|
|
164
|
-
verification: z.array(z.string()).describe('How to test/verify correctness'),
|
|
165
|
-
formatted: z.string().describe('Complete copy-paste ready prompt'),
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
// =============================================================================
|
|
169
|
-
// Main Enriched Task Schema
|
|
170
|
-
// =============================================================================
|
|
171
|
-
|
|
172
|
-
export const EnrichedTaskSchema = z.object({
|
|
173
|
-
// Identification
|
|
174
|
-
id: z.string().describe('Task UUID'),
|
|
175
|
-
externalId: z.string().optional().describe('External system ID (ENG-123)'),
|
|
176
|
-
provider: z.enum(['linear', 'jira', 'monday', 'github', 'internal']).optional(),
|
|
177
|
-
|
|
178
|
-
// Basic (original input)
|
|
179
|
-
originalTitle: z.string().describe('Original title from PO'),
|
|
180
|
-
originalDescription: z.string().optional().describe('Original description'),
|
|
181
|
-
|
|
182
|
-
// Classification
|
|
183
|
-
type: TaskTypeSchema,
|
|
184
|
-
priority: PrioritySchema,
|
|
185
|
-
complexity: ComplexitySchema,
|
|
186
|
-
labels: z.array(z.string()).default([]),
|
|
187
|
-
|
|
188
|
-
// Enrichment
|
|
189
|
-
userStory: UserStorySchema,
|
|
190
|
-
acceptanceCriteria: z.array(AcceptanceCriterionSchema).min(1),
|
|
191
|
-
definitionOfDone: z
|
|
192
|
-
.array(z.string())
|
|
193
|
-
.default(['Code reviewed', 'Tests pass', 'Documentation updated', 'Deployed to staging']),
|
|
194
|
-
|
|
195
|
-
// Technical analysis
|
|
196
|
-
technicalAnalysis: TechnicalAnalysisSchema,
|
|
197
|
-
dependencies: DependenciesSchema,
|
|
198
|
-
|
|
199
|
-
// For the LLM
|
|
200
|
-
llmPrompt: LLMPromptSchema,
|
|
201
|
-
|
|
202
|
-
// Metadata
|
|
203
|
-
enrichedAt: z.string().describe('ISO timestamp'),
|
|
204
|
-
enrichedBy: z.enum(['pm-expert', 'manual', 'imported']).default('pm-expert'),
|
|
205
|
-
confidence: z.number().min(0).max(1).describe('Analysis confidence (0-1)'),
|
|
206
|
-
|
|
207
|
-
// Status
|
|
208
|
-
readyForDev: z.boolean().default(false).describe('Whether ready for development'),
|
|
209
|
-
blockers: z.array(z.string()).default([]).describe('Active blockers'),
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
// =============================================================================
|
|
213
|
-
// Types
|
|
214
|
-
// =============================================================================
|
|
215
|
-
|
|
216
|
-
export type TaskType = z.infer<typeof TaskTypeSchema>
|
|
217
|
-
export type Priority = z.infer<typeof PrioritySchema>
|
|
218
|
-
export type Complexity = z.infer<typeof ComplexitySchema>
|
|
219
|
-
export type RiskLevel = z.infer<typeof RiskLevelSchema>
|
|
220
|
-
export type UserStory = z.infer<typeof UserStorySchema>
|
|
221
|
-
export type AcceptanceCriterion = z.infer<typeof AcceptanceCriterionSchema>
|
|
222
|
-
export type Dependencies = z.infer<typeof DependenciesSchema>
|
|
223
|
-
export type TechnicalAnalysis = z.infer<typeof TechnicalAnalysisSchema>
|
|
224
|
-
export type LLMPrompt = z.infer<typeof LLMPromptSchema>
|
|
225
|
-
export type EnrichedTask = z.infer<typeof EnrichedTaskSchema>
|
|
226
|
-
|
|
227
|
-
// =============================================================================
|
|
228
|
-
// Helpers
|
|
229
|
-
// =============================================================================
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Create formatted user story
|
|
233
|
-
*/
|
|
234
|
-
export function formatUserStory(role: string, action: string, benefit: string): UserStory {
|
|
235
|
-
return {
|
|
236
|
-
role,
|
|
237
|
-
action,
|
|
238
|
-
benefit,
|
|
239
|
-
formatted: `As a **${role}**, I want to **${action}** so that **${benefit}**.`,
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Check if task is ready for development
|
|
245
|
-
*/
|
|
246
|
-
export function isReadyForDev(task: EnrichedTask): { ready: boolean; reasons: string[] } {
|
|
247
|
-
const reasons: string[] = []
|
|
248
|
-
|
|
249
|
-
// Check acceptance criteria
|
|
250
|
-
if (task.acceptanceCriteria.length < 2) {
|
|
251
|
-
reasons.push('Needs at least 2 acceptance criteria')
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Check blockers
|
|
255
|
-
const blockingDeps = task.dependencies.tasks.filter((t) => t.blocking)
|
|
256
|
-
if (blockingDeps.length > 0) {
|
|
257
|
-
reasons.push(`Blocked by: ${blockingDeps.map((t) => t.id).join(', ')}`)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// Check critical risks
|
|
261
|
-
const criticalRisks = task.technicalAnalysis.potentialRisks.filter(
|
|
262
|
-
(r) => r.severity === 'critical'
|
|
263
|
-
)
|
|
264
|
-
if (criticalRisks.length > 0) {
|
|
265
|
-
reasons.push('Has unmitigated critical risks')
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Check analysis confidence
|
|
269
|
-
if (task.confidence < 0.6) {
|
|
270
|
-
reasons.push('Low confidence analysis - needs manual review')
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
ready: reasons.length === 0,
|
|
275
|
-
reasons,
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Estimate story points based on complexity
|
|
281
|
-
*/
|
|
282
|
-
export function estimateStoryPoints(complexity: Complexity): number {
|
|
283
|
-
const map: Record<Complexity, number> = {
|
|
284
|
-
trivial: 1,
|
|
285
|
-
small: 2,
|
|
286
|
-
medium: 3,
|
|
287
|
-
large: 5,
|
|
288
|
-
epic: 8,
|
|
289
|
-
}
|
|
290
|
-
return map[complexity]
|
|
291
|
-
}
|
package/core/schemas/ideas.ts
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ideas Schema
|
|
3
|
-
*
|
|
4
|
-
* Defines the structure for ideas.json - idea backlog.
|
|
5
|
-
* Uses Zod for runtime validation and TypeScript type inference.
|
|
6
|
-
*
|
|
7
|
-
* @version 2.0.0
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { z } from 'zod'
|
|
11
|
-
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// Zod Schemas - Source of Truth
|
|
14
|
-
// =============================================================================
|
|
15
|
-
|
|
16
|
-
export const IdeaPrioritySchema = z.enum(['low', 'medium', 'high'])
|
|
17
|
-
export const IdeaStatusSchema = z.enum(['pending', 'converted', 'completed', 'archived', 'dormant'])
|
|
18
|
-
export const ImpactLevelSchema = z.enum(['high', 'medium', 'low'])
|
|
19
|
-
|
|
20
|
-
export const ImpactEffortSchema = z.object({
|
|
21
|
-
impact: ImpactLevelSchema,
|
|
22
|
-
effort: ImpactLevelSchema,
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
export const TechStackSchema = z.object({
|
|
26
|
-
frontend: z.string().optional(), // "Next.js 14, HeroUI"
|
|
27
|
-
backend: z.string().optional(), // "Supabase (Auth, DB, RLS, Realtime)"
|
|
28
|
-
payments: z.string().optional(), // "Stripe Billing"
|
|
29
|
-
ai: z.string().optional(), // "Vercel AI SDK"
|
|
30
|
-
deploy: z.string().optional(), // "Vercel"
|
|
31
|
-
other: z.array(z.string()).optional(),
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
export const IdeaModuleSchema = z.object({
|
|
35
|
-
name: z.string(), // "Multi-tenant"
|
|
36
|
-
description: z.string(), // "Strict RLS for organizations"
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
export const IdeaRoleSchema = z.object({
|
|
40
|
-
name: z.string(), // "SUPER_ADMIN"
|
|
41
|
-
description: z.string().optional(),
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
export const IdeaItemSchema = z.object({
|
|
45
|
-
id: z.string(), // idea_xxxxxxxx
|
|
46
|
-
text: z.string(), // Title/summary
|
|
47
|
-
details: z.string().optional(),
|
|
48
|
-
priority: IdeaPrioritySchema,
|
|
49
|
-
status: IdeaStatusSchema,
|
|
50
|
-
tags: z.array(z.string()),
|
|
51
|
-
addedAt: z.string(), // ISO8601
|
|
52
|
-
completedAt: z.string().optional(),
|
|
53
|
-
convertedTo: z.string().optional(),
|
|
54
|
-
// Source documentation
|
|
55
|
-
source: z.string().optional(),
|
|
56
|
-
sourceFiles: z.array(z.string()).optional(),
|
|
57
|
-
// Enriched fields from MD
|
|
58
|
-
painPoints: z.array(z.string()).optional(),
|
|
59
|
-
solutions: z.array(z.string()).optional(),
|
|
60
|
-
filesAffected: z.array(z.string()).optional(),
|
|
61
|
-
impactEffort: ImpactEffortSchema.optional(),
|
|
62
|
-
implementationNotes: z.string().optional(),
|
|
63
|
-
// Technical spec fields for ZERO DATA LOSS
|
|
64
|
-
stack: TechStackSchema.optional(),
|
|
65
|
-
modules: z.array(IdeaModuleSchema).optional(),
|
|
66
|
-
roles: z.array(IdeaRoleSchema).optional(),
|
|
67
|
-
risks: z.array(z.string()).optional(),
|
|
68
|
-
risksCount: z.number().optional(),
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
export const IdeasJsonSchema = z.object({
|
|
72
|
-
ideas: z.array(IdeaItemSchema),
|
|
73
|
-
lastUpdated: z.string(),
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
// =============================================================================
|
|
77
|
-
// Inferred Types - Backward Compatible
|
|
78
|
-
// =============================================================================
|
|
79
|
-
|
|
80
|
-
export type IdeaPriority = z.infer<typeof IdeaPrioritySchema>
|
|
81
|
-
export type IdeaStatus = z.infer<typeof IdeaStatusSchema>
|
|
82
|
-
export type ImpactEffort = z.infer<typeof ImpactEffortSchema>
|
|
83
|
-
export type TechStack = z.infer<typeof TechStackSchema>
|
|
84
|
-
export type IdeaModule = z.infer<typeof IdeaModuleSchema>
|
|
85
|
-
export type IdeaRole = z.infer<typeof IdeaRoleSchema>
|
|
86
|
-
export type IdeaSchema = z.infer<typeof IdeaItemSchema>
|
|
87
|
-
export type IdeasJson = z.infer<typeof IdeasJsonSchema>
|
|
88
|
-
|
|
89
|
-
// Legacy type for backwards compatibility
|
|
90
|
-
export type IdeasSchema = IdeaSchema[]
|
|
91
|
-
|
|
92
|
-
// =============================================================================
|
|
93
|
-
// Validation Helpers
|
|
94
|
-
// =============================================================================
|
|
95
|
-
|
|
96
|
-
/** Parse and validate ideas.json content */
|
|
97
|
-
export const parseIdeas = (data: unknown): IdeasJson => IdeasJsonSchema.parse(data)
|
|
98
|
-
export const safeParseIdeas = (data: unknown) => IdeasJsonSchema.safeParse(data)
|
|
99
|
-
|
|
100
|
-
// =============================================================================
|
|
101
|
-
// Defaults
|
|
102
|
-
// =============================================================================
|
|
103
|
-
|
|
104
|
-
export const DEFAULT_IDEA: Omit<IdeaSchema, 'id' | 'text'> = {
|
|
105
|
-
priority: 'medium',
|
|
106
|
-
status: 'pending',
|
|
107
|
-
tags: [],
|
|
108
|
-
addedAt: new Date().toISOString(),
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export const DEFAULT_IDEAS: IdeasJson = {
|
|
112
|
-
ideas: [],
|
|
113
|
-
lastUpdated: '',
|
|
114
|
-
}
|
package/core/schemas/index.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schemas Module
|
|
3
|
-
*
|
|
4
|
-
* TypeScript types and defaults for all project data.
|
|
5
|
-
* MD-First Architecture: Markdown files are the source of truth.
|
|
6
|
-
*
|
|
7
|
-
* Structure: ~/.prjct-cli/projects/{projectId}/
|
|
8
|
-
* - core/ (now.md, next.md, context.md)
|
|
9
|
-
* - progress/ (shipped.md, metrics.md)
|
|
10
|
-
* - planning/ (ideas.md, roadmap.md, tasks/)
|
|
11
|
-
* - analysis/ (repo-summary.md)
|
|
12
|
-
* - memory/ (context.jsonl, patterns.json)
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
// Agents
|
|
16
|
-
export * from './agents'
|
|
17
|
-
// Analysis
|
|
18
|
-
export * from './analysis'
|
|
19
|
-
// Classification (LLM-based domain detection)
|
|
20
|
-
export * from './classification'
|
|
21
|
-
// Ideas
|
|
22
|
-
export * from './ideas'
|
|
23
|
-
// Issues (local cache of issue tracker issues)
|
|
24
|
-
export * from './issues'
|
|
25
|
-
// LLM output schemas (structured response validation)
|
|
26
|
-
export * from './llm-output'
|
|
27
|
-
// Model specification (AI provider model tracking)
|
|
28
|
-
export * from './model'
|
|
29
|
-
// Outcomes
|
|
30
|
-
export * from './outcomes'
|
|
31
|
-
// Permissions
|
|
32
|
-
export * from './permissions'
|
|
33
|
-
// Project metadata
|
|
34
|
-
export * from './project'
|
|
35
|
-
// Roadmap (features)
|
|
36
|
-
export * from './roadmap'
|
|
37
|
-
// Utilities (ID generators and path helpers)
|
|
38
|
-
export {
|
|
39
|
-
GLOBAL_STORAGE,
|
|
40
|
-
generateFeatureId,
|
|
41
|
-
generateIdeaId,
|
|
42
|
-
generateSessionId,
|
|
43
|
-
generateShipId,
|
|
44
|
-
generateTaskId,
|
|
45
|
-
generateUUID,
|
|
46
|
-
getProjectPath,
|
|
47
|
-
} from './schemas'
|
|
48
|
-
// Shipped items
|
|
49
|
-
export * from './shipped'
|
|
50
|
-
// State (current task + queue)
|
|
51
|
-
export * from './state'
|
|
52
|
-
// Velocity (sprint-based tracking)
|
|
53
|
-
export * from './velocity'
|
package/core/schemas/issues.ts
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Issues Schema
|
|
3
|
-
*
|
|
4
|
-
* Defines the structure for issues.json - local cache of issue tracker issues.
|
|
5
|
-
* Used for bidirectional sync with Linear/JIRA/etc.
|
|
6
|
-
*
|
|
7
|
-
* Location: ~/.prjct-cli/projects/{projectId}/storage/issues.json
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { z } from 'zod'
|
|
11
|
-
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// Issue Provider Types
|
|
14
|
-
// =============================================================================
|
|
15
|
-
|
|
16
|
-
export const IssueProviderSchema = z.enum(['linear', 'jira', 'github', 'monday', 'asana', 'none'])
|
|
17
|
-
export const IssueStatusSchema = z.enum([
|
|
18
|
-
'backlog',
|
|
19
|
-
'todo',
|
|
20
|
-
'in_progress',
|
|
21
|
-
'in_review',
|
|
22
|
-
'done',
|
|
23
|
-
'cancelled',
|
|
24
|
-
])
|
|
25
|
-
export const IssuePrioritySchema = z.enum(['none', 'urgent', 'high', 'medium', 'low'])
|
|
26
|
-
export const IssueTypeSchema = z.enum(['feature', 'bug', 'improvement', 'task', 'chore', 'epic'])
|
|
27
|
-
|
|
28
|
-
// =============================================================================
|
|
29
|
-
// Cached Issue Schema
|
|
30
|
-
// =============================================================================
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Single cached issue from provider
|
|
34
|
-
*/
|
|
35
|
-
export const CachedIssueSchema = z.object({
|
|
36
|
-
// Core identifiers
|
|
37
|
-
id: z.string(), // Provider UUID
|
|
38
|
-
identifier: z.string(), // Human-readable ID (e.g., "PRJ-123")
|
|
39
|
-
|
|
40
|
-
// Issue content
|
|
41
|
-
title: z.string(),
|
|
42
|
-
description: z.string().optional(),
|
|
43
|
-
|
|
44
|
-
// State
|
|
45
|
-
status: IssueStatusSchema,
|
|
46
|
-
priority: IssuePrioritySchema,
|
|
47
|
-
type: IssueTypeSchema.optional(),
|
|
48
|
-
|
|
49
|
-
// Metadata
|
|
50
|
-
assignee: z
|
|
51
|
-
.object({
|
|
52
|
-
id: z.string(),
|
|
53
|
-
name: z.string(),
|
|
54
|
-
email: z.string().optional(),
|
|
55
|
-
})
|
|
56
|
-
.optional(),
|
|
57
|
-
labels: z.array(z.string()).default([]),
|
|
58
|
-
team: z
|
|
59
|
-
.object({
|
|
60
|
-
id: z.string(),
|
|
61
|
-
name: z.string(),
|
|
62
|
-
key: z.string().optional(),
|
|
63
|
-
})
|
|
64
|
-
.optional(),
|
|
65
|
-
project: z
|
|
66
|
-
.object({
|
|
67
|
-
id: z.string(),
|
|
68
|
-
name: z.string(),
|
|
69
|
-
})
|
|
70
|
-
.optional(),
|
|
71
|
-
|
|
72
|
-
// URLs and timestamps
|
|
73
|
-
url: z.string(),
|
|
74
|
-
createdAt: z.string(), // ISO8601 from provider
|
|
75
|
-
updatedAt: z.string(), // ISO8601 from provider
|
|
76
|
-
fetchedAt: z.string(), // ISO8601 when we cached it
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
// =============================================================================
|
|
80
|
-
// Issues JSON Schema (Root)
|
|
81
|
-
// =============================================================================
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Root schema for issues.json
|
|
85
|
-
* Maps identifier -> CachedIssue for quick lookup
|
|
86
|
-
*/
|
|
87
|
-
export const IssuesJsonSchema = z.object({
|
|
88
|
-
// Provider info
|
|
89
|
-
provider: IssueProviderSchema,
|
|
90
|
-
|
|
91
|
-
// Sync metadata
|
|
92
|
-
lastSync: z.string(), // ISO8601 of last full sync
|
|
93
|
-
staleAfter: z.number().default(1800000), // 30 minutes in ms
|
|
94
|
-
|
|
95
|
-
// Issues map: identifier -> issue
|
|
96
|
-
issues: z.record(z.string(), CachedIssueSchema),
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
// =============================================================================
|
|
100
|
-
// Sync Result Schema
|
|
101
|
-
// =============================================================================
|
|
102
|
-
|
|
103
|
-
export const SyncResultSchema = z.object({
|
|
104
|
-
provider: IssueProviderSchema,
|
|
105
|
-
fetched: z.number(),
|
|
106
|
-
updated: z.number(),
|
|
107
|
-
errors: z.array(
|
|
108
|
-
z.object({
|
|
109
|
-
issueId: z.string(),
|
|
110
|
-
error: z.string(),
|
|
111
|
-
})
|
|
112
|
-
),
|
|
113
|
-
timestamp: z.string(),
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
// =============================================================================
|
|
117
|
-
// Inferred Types
|
|
118
|
-
// =============================================================================
|
|
119
|
-
|
|
120
|
-
export type IssueProvider = z.infer<typeof IssueProviderSchema>
|
|
121
|
-
export type IssueStatus = z.infer<typeof IssueStatusSchema>
|
|
122
|
-
export type IssuePriority = z.infer<typeof IssuePrioritySchema>
|
|
123
|
-
export type IssueType = z.infer<typeof IssueTypeSchema>
|
|
124
|
-
export type CachedIssue = z.infer<typeof CachedIssueSchema>
|
|
125
|
-
export type IssuesJson = z.infer<typeof IssuesJsonSchema>
|
|
126
|
-
export type SyncResult = z.infer<typeof SyncResultSchema>
|
|
127
|
-
|
|
128
|
-
// =============================================================================
|
|
129
|
-
// Validation Helpers
|
|
130
|
-
// =============================================================================
|
|
131
|
-
|
|
132
|
-
/** Parse and validate issues.json content */
|
|
133
|
-
export const parseIssues = (data: unknown): IssuesJson => IssuesJsonSchema.parse(data)
|
|
134
|
-
|
|
135
|
-
/** Safe parse with error result */
|
|
136
|
-
export const safeParseIssues = (data: unknown) => IssuesJsonSchema.safeParse(data)
|
|
137
|
-
|
|
138
|
-
// =============================================================================
|
|
139
|
-
// Defaults
|
|
140
|
-
// =============================================================================
|
|
141
|
-
|
|
142
|
-
export const DEFAULT_ISSUES: IssuesJson = {
|
|
143
|
-
provider: 'none',
|
|
144
|
-
lastSync: '',
|
|
145
|
-
staleAfter: 1800000, // 30 minutes
|
|
146
|
-
issues: {},
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Create empty issues.json for a provider
|
|
151
|
-
*/
|
|
152
|
-
export function createEmptyIssues(provider: IssueProvider): IssuesJson {
|
|
153
|
-
return {
|
|
154
|
-
provider,
|
|
155
|
-
lastSync: '',
|
|
156
|
-
staleAfter: 1800000,
|
|
157
|
-
issues: {},
|
|
158
|
-
}
|
|
159
|
-
}
|