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/schemas/outcomes.ts
DELETED
|
@@ -1,487 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Outcomes Schema
|
|
3
|
-
*
|
|
4
|
-
* Defines the structure for outcomes.json - feature completion metrics and learnings.
|
|
5
|
-
* Uses Zod for runtime validation and TypeScript type inference.
|
|
6
|
-
*
|
|
7
|
-
* Enhanced for AI Orchestration Layer (v0.29.0):
|
|
8
|
-
* - PRD/Feature linking
|
|
9
|
-
* - Effort comparison (estimated vs actual)
|
|
10
|
-
* - Success metrics tracking
|
|
11
|
-
* - Learnings capture
|
|
12
|
-
* - ROI calculation
|
|
13
|
-
*
|
|
14
|
-
* @version 2.0.0
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { z } from 'zod'
|
|
18
|
-
|
|
19
|
-
// =============================================================================
|
|
20
|
-
// Zod Schemas - Source of Truth
|
|
21
|
-
// =============================================================================
|
|
22
|
-
|
|
23
|
-
export const QualityScoreSchema = z.number().min(1).max(5)
|
|
24
|
-
export const SuccessLevelSchema = z.enum(['exceeded', 'met', 'partial', 'failed'])
|
|
25
|
-
export const WorthAssessmentSchema = z.enum(['definitely', 'probably', 'maybe', 'no'])
|
|
26
|
-
export const VarianceReasonSchema = z.enum([
|
|
27
|
-
'scope_creep',
|
|
28
|
-
'underestimated_complexity',
|
|
29
|
-
'technical_debt',
|
|
30
|
-
'external_blockers',
|
|
31
|
-
'learning_curve',
|
|
32
|
-
'requirements_changed',
|
|
33
|
-
'optimistic_estimate',
|
|
34
|
-
'team_changes',
|
|
35
|
-
'other',
|
|
36
|
-
])
|
|
37
|
-
|
|
38
|
-
// -----------------------------------------------------------------------------
|
|
39
|
-
// Effort Tracking
|
|
40
|
-
// -----------------------------------------------------------------------------
|
|
41
|
-
|
|
42
|
-
export const EffortComparisonSchema = z.object({
|
|
43
|
-
estimated: z.object({
|
|
44
|
-
hours: z.number(),
|
|
45
|
-
confidence: z.enum(['low', 'medium', 'high']).optional(),
|
|
46
|
-
source: z.enum(['prd', 'manual', 'historical']).optional(),
|
|
47
|
-
}),
|
|
48
|
-
actual: z.object({
|
|
49
|
-
hours: z.number(),
|
|
50
|
-
commits: z.number().optional(),
|
|
51
|
-
linesAdded: z.number().optional(),
|
|
52
|
-
linesRemoved: z.number().optional(),
|
|
53
|
-
sessions: z.number().optional(), // Number of work sessions
|
|
54
|
-
}),
|
|
55
|
-
variance: z.object({
|
|
56
|
-
hours: z.number(), // actual - estimated
|
|
57
|
-
percentage: z.number(), // ((actual - estimated) / estimated) * 100
|
|
58
|
-
reason: VarianceReasonSchema.optional(),
|
|
59
|
-
explanation: z.string().optional(),
|
|
60
|
-
}),
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
// -----------------------------------------------------------------------------
|
|
64
|
-
// Success Metrics (from PRD)
|
|
65
|
-
// -----------------------------------------------------------------------------
|
|
66
|
-
|
|
67
|
-
export const MetricResultSchema = z.object({
|
|
68
|
-
name: z.string(),
|
|
69
|
-
baseline: z.number().nullable(),
|
|
70
|
-
target: z.number(),
|
|
71
|
-
actual: z.number(),
|
|
72
|
-
unit: z.string(),
|
|
73
|
-
achieved: z.boolean(), // actual >= target (or <= for decrease metrics)
|
|
74
|
-
percentOfTarget: z.number(), // (actual / target) * 100
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
export const AcceptanceCriteriaResultSchema = z.object({
|
|
78
|
-
criteria: z.string(),
|
|
79
|
-
met: z.boolean(),
|
|
80
|
-
notes: z.string().optional(),
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
export const SuccessTrackingSchema = z.object({
|
|
84
|
-
metrics: z.array(MetricResultSchema),
|
|
85
|
-
acceptanceCriteria: z.array(AcceptanceCriteriaResultSchema),
|
|
86
|
-
overallSuccess: SuccessLevelSchema,
|
|
87
|
-
successScore: z.number().min(0).max(100), // Percentage of metrics/criteria met
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
// -----------------------------------------------------------------------------
|
|
91
|
-
// Learnings
|
|
92
|
-
// -----------------------------------------------------------------------------
|
|
93
|
-
|
|
94
|
-
export const LearningSchema = z.object({
|
|
95
|
-
category: z.enum([
|
|
96
|
-
'estimation',
|
|
97
|
-
'technical',
|
|
98
|
-
'process',
|
|
99
|
-
'communication',
|
|
100
|
-
'tooling',
|
|
101
|
-
'architecture',
|
|
102
|
-
'testing',
|
|
103
|
-
'other',
|
|
104
|
-
]),
|
|
105
|
-
insight: z.string(),
|
|
106
|
-
actionable: z.boolean(),
|
|
107
|
-
action: z.string().optional(), // What to do differently next time
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
export const LearningsSchema = z.object({
|
|
111
|
-
whatWorked: z.array(z.string()),
|
|
112
|
-
whatDidnt: z.array(z.string()),
|
|
113
|
-
surprises: z.array(z.string()),
|
|
114
|
-
recommendations: z.array(LearningSchema),
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
// -----------------------------------------------------------------------------
|
|
118
|
-
// ROI Assessment
|
|
119
|
-
// -----------------------------------------------------------------------------
|
|
120
|
-
|
|
121
|
-
export const ROIAssessmentSchema = z.object({
|
|
122
|
-
valueDelivered: z.number().min(1).max(10), // Subjective 1-10 score
|
|
123
|
-
userImpact: z.enum(['none', 'low', 'medium', 'high', 'critical']),
|
|
124
|
-
businessImpact: z.enum(['none', 'low', 'medium', 'high', 'critical']),
|
|
125
|
-
|
|
126
|
-
// Calculated: (valueDelivered * 10) / (actual hours)
|
|
127
|
-
roiScore: z.number(),
|
|
128
|
-
|
|
129
|
-
// Would you build this again knowing what you know now?
|
|
130
|
-
worthIt: WorthAssessmentSchema,
|
|
131
|
-
worthItReason: z.string().optional(),
|
|
132
|
-
|
|
133
|
-
// Comparison to alternatives
|
|
134
|
-
alternativeConsidered: z.string().optional(),
|
|
135
|
-
betterAlternativeExists: z.boolean().optional(),
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
// -----------------------------------------------------------------------------
|
|
139
|
-
// Task-Level Outcome (granular)
|
|
140
|
-
// -----------------------------------------------------------------------------
|
|
141
|
-
|
|
142
|
-
export const TaskOutcomeSchema = z.object({
|
|
143
|
-
id: z.string(), // out_task_xxxxxxxx
|
|
144
|
-
taskId: z.string(),
|
|
145
|
-
description: z.string(),
|
|
146
|
-
|
|
147
|
-
// Time tracking
|
|
148
|
-
estimatedMinutes: z.number().optional(),
|
|
149
|
-
actualMinutes: z.number(),
|
|
150
|
-
|
|
151
|
-
// Quality
|
|
152
|
-
completedAsPlanned: z.boolean(),
|
|
153
|
-
qualityScore: QualityScoreSchema,
|
|
154
|
-
|
|
155
|
-
// Context
|
|
156
|
-
blockers: z.array(z.string()),
|
|
157
|
-
agentUsed: z.string().optional(),
|
|
158
|
-
skillsUsed: z.array(z.string()).optional(),
|
|
159
|
-
|
|
160
|
-
// Timestamps
|
|
161
|
-
startedAt: z.string(),
|
|
162
|
-
completedAt: z.string(),
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
// -----------------------------------------------------------------------------
|
|
166
|
-
// Feature-Level Outcome (comprehensive)
|
|
167
|
-
// -----------------------------------------------------------------------------
|
|
168
|
-
|
|
169
|
-
export const FeatureOutcomeSchema = z.object({
|
|
170
|
-
id: z.string(), // out_feat_xxxxxxxx
|
|
171
|
-
|
|
172
|
-
// Links
|
|
173
|
-
featureId: z.string(),
|
|
174
|
-
featureName: z.string(),
|
|
175
|
-
prdId: z.string().nullable(), // null for legacy features
|
|
176
|
-
|
|
177
|
-
// Version info
|
|
178
|
-
version: z.string().optional(),
|
|
179
|
-
branch: z.string().optional(),
|
|
180
|
-
prUrl: z.string().optional(),
|
|
181
|
-
|
|
182
|
-
// Effort
|
|
183
|
-
effort: EffortComparisonSchema,
|
|
184
|
-
|
|
185
|
-
// Success (only if PRD exists)
|
|
186
|
-
success: SuccessTrackingSchema.optional(),
|
|
187
|
-
|
|
188
|
-
// Learnings
|
|
189
|
-
learnings: LearningsSchema,
|
|
190
|
-
|
|
191
|
-
// ROI
|
|
192
|
-
roi: ROIAssessmentSchema,
|
|
193
|
-
|
|
194
|
-
// Overall rating
|
|
195
|
-
rating: QualityScoreSchema,
|
|
196
|
-
|
|
197
|
-
// Task outcomes (sub-tasks)
|
|
198
|
-
taskOutcomes: z.array(TaskOutcomeSchema).optional(),
|
|
199
|
-
|
|
200
|
-
// Timestamps
|
|
201
|
-
startedAt: z.string(),
|
|
202
|
-
shippedAt: z.string(),
|
|
203
|
-
reviewedAt: z.string().optional(), // When impact was captured
|
|
204
|
-
|
|
205
|
-
// Metadata
|
|
206
|
-
reviewedBy: z.string().optional(), // Who filled out the impact review
|
|
207
|
-
legacy: z.boolean().optional(), // Legacy feature (no PRD)
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
// -----------------------------------------------------------------------------
|
|
211
|
-
// Aggregate Metrics (for dashboard)
|
|
212
|
-
// -----------------------------------------------------------------------------
|
|
213
|
-
|
|
214
|
-
export const AggregateMetricsSchema = z.object({
|
|
215
|
-
totalFeatures: z.number(),
|
|
216
|
-
averageEstimationAccuracy: z.number(), // Percentage
|
|
217
|
-
averageSuccessRate: z.number(), // Percentage
|
|
218
|
-
averageROI: z.number(),
|
|
219
|
-
|
|
220
|
-
// By category
|
|
221
|
-
bySuccessLevel: z.object({
|
|
222
|
-
exceeded: z.number(),
|
|
223
|
-
met: z.number(),
|
|
224
|
-
partial: z.number(),
|
|
225
|
-
failed: z.number(),
|
|
226
|
-
}),
|
|
227
|
-
|
|
228
|
-
// Variance patterns
|
|
229
|
-
variancePatterns: z.array(
|
|
230
|
-
z.object({
|
|
231
|
-
reason: VarianceReasonSchema,
|
|
232
|
-
count: z.number(),
|
|
233
|
-
averageVariance: z.number(),
|
|
234
|
-
})
|
|
235
|
-
),
|
|
236
|
-
|
|
237
|
-
// Top learnings (aggregated)
|
|
238
|
-
topLearnings: z.array(
|
|
239
|
-
z.object({
|
|
240
|
-
insight: z.string(),
|
|
241
|
-
frequency: z.number(),
|
|
242
|
-
})
|
|
243
|
-
),
|
|
244
|
-
})
|
|
245
|
-
|
|
246
|
-
// -----------------------------------------------------------------------------
|
|
247
|
-
// Outcomes JSON (storage file)
|
|
248
|
-
// -----------------------------------------------------------------------------
|
|
249
|
-
|
|
250
|
-
export const OutcomesJsonSchema = z.object({
|
|
251
|
-
outcomes: z.array(FeatureOutcomeSchema),
|
|
252
|
-
taskOutcomes: z.array(TaskOutcomeSchema).optional(), // Standalone task outcomes
|
|
253
|
-
aggregates: AggregateMetricsSchema.optional(),
|
|
254
|
-
lastUpdated: z.string(),
|
|
255
|
-
lastAggregated: z.string().optional(),
|
|
256
|
-
})
|
|
257
|
-
|
|
258
|
-
// =============================================================================
|
|
259
|
-
// Inferred Types
|
|
260
|
-
// =============================================================================
|
|
261
|
-
|
|
262
|
-
export type QualityScore = z.infer<typeof QualityScoreSchema>
|
|
263
|
-
export type SuccessLevel = z.infer<typeof SuccessLevelSchema>
|
|
264
|
-
export type WorthAssessment = z.infer<typeof WorthAssessmentSchema>
|
|
265
|
-
export type VarianceReason = z.infer<typeof VarianceReasonSchema>
|
|
266
|
-
|
|
267
|
-
export type EffortComparison = z.infer<typeof EffortComparisonSchema>
|
|
268
|
-
export type MetricResult = z.infer<typeof MetricResultSchema>
|
|
269
|
-
export type AcceptanceCriteriaResult = z.infer<typeof AcceptanceCriteriaResultSchema>
|
|
270
|
-
export type SuccessTracking = z.infer<typeof SuccessTrackingSchema>
|
|
271
|
-
export type Learning = z.infer<typeof LearningSchema>
|
|
272
|
-
export type Learnings = z.infer<typeof LearningsSchema>
|
|
273
|
-
export type ROIAssessment = z.infer<typeof ROIAssessmentSchema>
|
|
274
|
-
|
|
275
|
-
export type TaskOutcome = z.infer<typeof TaskOutcomeSchema>
|
|
276
|
-
export type FeatureOutcome = z.infer<typeof FeatureOutcomeSchema>
|
|
277
|
-
export type AggregateMetrics = z.infer<typeof AggregateMetricsSchema>
|
|
278
|
-
export type OutcomesJson = z.infer<typeof OutcomesJsonSchema>
|
|
279
|
-
|
|
280
|
-
// Legacy type for backwards compatibility
|
|
281
|
-
export type OutcomeSchema = TaskOutcome
|
|
282
|
-
export type OutcomesSchema = TaskOutcome[]
|
|
283
|
-
|
|
284
|
-
// =============================================================================
|
|
285
|
-
// Validation Helpers
|
|
286
|
-
// =============================================================================
|
|
287
|
-
|
|
288
|
-
/** Parse and validate outcomes.json content */
|
|
289
|
-
export const parseOutcomes = (data: unknown): OutcomesJson => OutcomesJsonSchema.parse(data)
|
|
290
|
-
export const safeParseOutcomes = (data: unknown) => OutcomesJsonSchema.safeParse(data)
|
|
291
|
-
|
|
292
|
-
/** Parse a single feature outcome */
|
|
293
|
-
export const parseFeatureOutcome = (data: unknown): FeatureOutcome =>
|
|
294
|
-
FeatureOutcomeSchema.parse(data)
|
|
295
|
-
export const safeParseFeatureOutcome = (data: unknown) => FeatureOutcomeSchema.safeParse(data)
|
|
296
|
-
|
|
297
|
-
// =============================================================================
|
|
298
|
-
// Defaults
|
|
299
|
-
// =============================================================================
|
|
300
|
-
|
|
301
|
-
export const DEFAULT_OUTCOMES: OutcomesJson = {
|
|
302
|
-
outcomes: [],
|
|
303
|
-
taskOutcomes: [],
|
|
304
|
-
lastUpdated: '',
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
export const DEFAULT_LEARNINGS: Learnings = {
|
|
308
|
-
whatWorked: [],
|
|
309
|
-
whatDidnt: [],
|
|
310
|
-
surprises: [],
|
|
311
|
-
recommendations: [],
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
export const DEFAULT_ROI: Omit<ROIAssessment, 'roiScore'> = {
|
|
315
|
-
valueDelivered: 5,
|
|
316
|
-
userImpact: 'medium',
|
|
317
|
-
businessImpact: 'medium',
|
|
318
|
-
worthIt: 'probably',
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// =============================================================================
|
|
322
|
-
// Calculation Helpers
|
|
323
|
-
// =============================================================================
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Calculate variance between estimated and actual effort
|
|
327
|
-
*/
|
|
328
|
-
export const calculateVariance = (
|
|
329
|
-
estimated: number,
|
|
330
|
-
actual: number
|
|
331
|
-
): { hours: number; percentage: number } => {
|
|
332
|
-
const hours = actual - estimated
|
|
333
|
-
const percentage = estimated > 0 ? ((actual - estimated) / estimated) * 100 : 0
|
|
334
|
-
return { hours, percentage: Math.round(percentage * 10) / 10 }
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Calculate ROI score: (value * 10) / actual hours
|
|
339
|
-
* Higher is better - more value per hour spent
|
|
340
|
-
*/
|
|
341
|
-
export const calculateROIScore = (valueDelivered: number, actualHours: number): number => {
|
|
342
|
-
if (actualHours <= 0) return valueDelivered * 10
|
|
343
|
-
return Math.round(((valueDelivered * 10) / actualHours) * 100) / 100
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Calculate success score from metrics and acceptance criteria
|
|
348
|
-
*/
|
|
349
|
-
export const calculateSuccessScore = (
|
|
350
|
-
metrics: MetricResult[],
|
|
351
|
-
acceptanceCriteria: AcceptanceCriteriaResult[]
|
|
352
|
-
): number => {
|
|
353
|
-
const totalItems = metrics.length + acceptanceCriteria.length
|
|
354
|
-
if (totalItems === 0) return 100
|
|
355
|
-
|
|
356
|
-
const metMetrics = metrics.filter((m) => m.achieved).length
|
|
357
|
-
const metCriteria = acceptanceCriteria.filter((ac) => ac.met).length
|
|
358
|
-
|
|
359
|
-
return Math.round(((metMetrics + metCriteria) / totalItems) * 100)
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Determine overall success level from score
|
|
364
|
-
*/
|
|
365
|
-
export const determineSuccessLevel = (score: number): SuccessLevel => {
|
|
366
|
-
if (score >= 100) return 'exceeded'
|
|
367
|
-
if (score >= 80) return 'met'
|
|
368
|
-
if (score >= 50) return 'partial'
|
|
369
|
-
return 'failed'
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Calculate estimation accuracy (100% = perfect estimate)
|
|
374
|
-
* Formula: 100 - abs(variance percentage)
|
|
375
|
-
*/
|
|
376
|
-
export const calculateEstimationAccuracy = (variancePercentage: number): number => {
|
|
377
|
-
return Math.max(0, 100 - Math.abs(variancePercentage))
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
* Aggregate outcomes for dashboard
|
|
382
|
-
*/
|
|
383
|
-
export const aggregateOutcomes = (outcomes: FeatureOutcome[]): AggregateMetrics => {
|
|
384
|
-
if (outcomes.length === 0) {
|
|
385
|
-
return {
|
|
386
|
-
totalFeatures: 0,
|
|
387
|
-
averageEstimationAccuracy: 0,
|
|
388
|
-
averageSuccessRate: 0,
|
|
389
|
-
averageROI: 0,
|
|
390
|
-
bySuccessLevel: { exceeded: 0, met: 0, partial: 0, failed: 0 },
|
|
391
|
-
variancePatterns: [],
|
|
392
|
-
topLearnings: [],
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Calculate averages
|
|
397
|
-
const accuracies = outcomes.map((o) => calculateEstimationAccuracy(o.effort.variance.percentage))
|
|
398
|
-
const successRates = outcomes.filter((o) => o.success).map((o) => o.success!.successScore)
|
|
399
|
-
const rois = outcomes.map((o) => o.roi.roiScore)
|
|
400
|
-
|
|
401
|
-
// Count by success level
|
|
402
|
-
const bySuccessLevel = {
|
|
403
|
-
exceeded: outcomes.filter((o) => o.success?.overallSuccess === 'exceeded').length,
|
|
404
|
-
met: outcomes.filter((o) => o.success?.overallSuccess === 'met').length,
|
|
405
|
-
partial: outcomes.filter((o) => o.success?.overallSuccess === 'partial').length,
|
|
406
|
-
failed: outcomes.filter((o) => o.success?.overallSuccess === 'failed').length,
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Variance patterns
|
|
410
|
-
const varianceReasons = outcomes
|
|
411
|
-
.filter((o) => o.effort.variance.reason)
|
|
412
|
-
.reduce(
|
|
413
|
-
(acc, o) => {
|
|
414
|
-
const reason = o.effort.variance.reason!
|
|
415
|
-
if (!acc[reason]) {
|
|
416
|
-
acc[reason] = { count: 0, totalVariance: 0 }
|
|
417
|
-
}
|
|
418
|
-
acc[reason].count++
|
|
419
|
-
acc[reason].totalVariance += o.effort.variance.percentage
|
|
420
|
-
return acc
|
|
421
|
-
},
|
|
422
|
-
{} as Record<VarianceReason, { count: number; totalVariance: number }>
|
|
423
|
-
)
|
|
424
|
-
|
|
425
|
-
const variancePatterns = Object.entries(varianceReasons).map(([reason, data]) => ({
|
|
426
|
-
reason: reason as VarianceReason,
|
|
427
|
-
count: data.count,
|
|
428
|
-
averageVariance: Math.round(data.totalVariance / data.count),
|
|
429
|
-
}))
|
|
430
|
-
|
|
431
|
-
// Top learnings
|
|
432
|
-
const allLearnings = outcomes.flatMap((o) => [
|
|
433
|
-
...o.learnings.whatWorked,
|
|
434
|
-
...o.learnings.whatDidnt,
|
|
435
|
-
])
|
|
436
|
-
const learningCounts = allLearnings.reduce(
|
|
437
|
-
(acc, learning) => {
|
|
438
|
-
acc[learning] = (acc[learning] || 0) + 1
|
|
439
|
-
return acc
|
|
440
|
-
},
|
|
441
|
-
{} as Record<string, number>
|
|
442
|
-
)
|
|
443
|
-
|
|
444
|
-
const topLearnings = Object.entries(learningCounts)
|
|
445
|
-
.sort((a, b) => b[1] - a[1])
|
|
446
|
-
.slice(0, 10)
|
|
447
|
-
.map(([insight, frequency]) => ({ insight, frequency }))
|
|
448
|
-
|
|
449
|
-
return {
|
|
450
|
-
totalFeatures: outcomes.length,
|
|
451
|
-
averageEstimationAccuracy: Math.round(
|
|
452
|
-
accuracies.reduce((a, b) => a + b, 0) / accuracies.length
|
|
453
|
-
),
|
|
454
|
-
averageSuccessRate:
|
|
455
|
-
successRates.length > 0
|
|
456
|
-
? Math.round(successRates.reduce((a, b) => a + b, 0) / successRates.length)
|
|
457
|
-
: 0,
|
|
458
|
-
averageROI: Math.round((rois.reduce((a, b) => a + b, 0) / rois.length) * 100) / 100,
|
|
459
|
-
bySuccessLevel,
|
|
460
|
-
variancePatterns,
|
|
461
|
-
topLearnings,
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
// =============================================================================
|
|
466
|
-
// Linear/Jira/Monday Mapping Helpers
|
|
467
|
-
// =============================================================================
|
|
468
|
-
|
|
469
|
-
/**
|
|
470
|
-
* Maps success level to PM tool status
|
|
471
|
-
*/
|
|
472
|
-
export const successLevelToStatus: Record<SuccessLevel, string> = {
|
|
473
|
-
exceeded: 'Exceeded Goals',
|
|
474
|
-
met: 'Completed',
|
|
475
|
-
partial: 'Partially Completed',
|
|
476
|
-
failed: 'Did Not Meet Goals',
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* Maps worth assessment to follow-up action
|
|
481
|
-
*/
|
|
482
|
-
export const worthToAction: Record<WorthAssessment, string> = {
|
|
483
|
-
definitely: 'Replicate pattern',
|
|
484
|
-
probably: 'Document learnings',
|
|
485
|
-
maybe: 'Review approach',
|
|
486
|
-
no: 'Post-mortem required',
|
|
487
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Performance Schema
|
|
3
|
-
*
|
|
4
|
-
* Defines metric types for the PerformanceTracker service.
|
|
5
|
-
* Uses JSONL storage (append-only) with rotation at 5MB.
|
|
6
|
-
*
|
|
7
|
-
* @see PRJ-297
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { z } from 'zod'
|
|
11
|
-
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// Metric Schemas
|
|
14
|
-
// =============================================================================
|
|
15
|
-
|
|
16
|
-
export const MetricNameSchema = z.enum([
|
|
17
|
-
'startup_time',
|
|
18
|
-
'heap_used',
|
|
19
|
-
'heap_total',
|
|
20
|
-
'rss',
|
|
21
|
-
'external_memory',
|
|
22
|
-
'context_correctness',
|
|
23
|
-
'subtask_handoff',
|
|
24
|
-
'analysis_state',
|
|
25
|
-
'token_usage',
|
|
26
|
-
'command_duration',
|
|
27
|
-
])
|
|
28
|
-
|
|
29
|
-
export const MemorySnapshotSchema = z.object({
|
|
30
|
-
heapUsed: z.number(),
|
|
31
|
-
heapTotal: z.number(),
|
|
32
|
-
rss: z.number(),
|
|
33
|
-
external: z.number(),
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
export const PerformanceMetricSchema = z.object({
|
|
37
|
-
timestamp: z.string(),
|
|
38
|
-
metric: MetricNameSchema,
|
|
39
|
-
value: z.number(),
|
|
40
|
-
unit: z.string(),
|
|
41
|
-
context: z.record(z.string(), z.unknown()).optional(),
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
export const ContextCorrectnessSchema = z.object({
|
|
45
|
-
timestamp: z.string(),
|
|
46
|
-
metric: z.literal('context_correctness'),
|
|
47
|
-
taskId: z.string(),
|
|
48
|
-
receivedSync: z.boolean(),
|
|
49
|
-
syncFieldsInjected: z.array(z.string()).optional(),
|
|
50
|
-
tokensBudgetUsed: z.number().optional(),
|
|
51
|
-
tokensBudgetTotal: z.number().optional(),
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
export const SubtaskHandoffSchema = z.object({
|
|
55
|
-
timestamp: z.string(),
|
|
56
|
-
metric: z.literal('subtask_handoff'),
|
|
57
|
-
taskId: z.string(),
|
|
58
|
-
subtaskId: z.string(),
|
|
59
|
-
outputPopulated: z.boolean(),
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
export const AnalysisStateSchema = z.object({
|
|
63
|
-
timestamp: z.string(),
|
|
64
|
-
metric: z.literal('analysis_state'),
|
|
65
|
-
state: z.enum(['draft', 'verified', 'sealed']),
|
|
66
|
-
commitHash: z.string(),
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
/** Union of all metric entry types stored in performance.jsonl */
|
|
70
|
-
export const PerformanceEntrySchema = z.union([
|
|
71
|
-
PerformanceMetricSchema,
|
|
72
|
-
ContextCorrectnessSchema,
|
|
73
|
-
SubtaskHandoffSchema,
|
|
74
|
-
AnalysisStateSchema,
|
|
75
|
-
])
|
|
76
|
-
|
|
77
|
-
// =============================================================================
|
|
78
|
-
// Report Schemas
|
|
79
|
-
// =============================================================================
|
|
80
|
-
|
|
81
|
-
export const MetricSummarySchema = z.object({
|
|
82
|
-
avg: z.number(),
|
|
83
|
-
min: z.number(),
|
|
84
|
-
max: z.number(),
|
|
85
|
-
count: z.number(),
|
|
86
|
-
unit: z.string(),
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
export const PerformanceReportSchema = z.object({
|
|
90
|
-
period: z.string(),
|
|
91
|
-
startup: MetricSummarySchema.optional(),
|
|
92
|
-
memory: z
|
|
93
|
-
.object({
|
|
94
|
-
avgHeapMB: z.number(),
|
|
95
|
-
peakHeapMB: z.number(),
|
|
96
|
-
avgRssMB: z.number(),
|
|
97
|
-
})
|
|
98
|
-
.optional(),
|
|
99
|
-
contextCorrectness: z
|
|
100
|
-
.object({
|
|
101
|
-
total: z.number(),
|
|
102
|
-
receivedSync: z.number(),
|
|
103
|
-
rate: z.number(),
|
|
104
|
-
})
|
|
105
|
-
.optional(),
|
|
106
|
-
subtaskHandoff: z
|
|
107
|
-
.object({
|
|
108
|
-
total: z.number(),
|
|
109
|
-
outputPopulated: z.number(),
|
|
110
|
-
rate: z.number(),
|
|
111
|
-
})
|
|
112
|
-
.optional(),
|
|
113
|
-
commandDurations: z.record(z.string(), MetricSummarySchema).optional(),
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
// =============================================================================
|
|
117
|
-
// Inferred Types
|
|
118
|
-
// =============================================================================
|
|
119
|
-
|
|
120
|
-
export type MetricName = z.infer<typeof MetricNameSchema>
|
|
121
|
-
export type MemorySnapshot = z.infer<typeof MemorySnapshotSchema>
|
|
122
|
-
export type PerformanceMetric = z.infer<typeof PerformanceMetricSchema>
|
|
123
|
-
export type ContextCorrectness = z.infer<typeof ContextCorrectnessSchema>
|
|
124
|
-
export type SubtaskHandoff = z.infer<typeof SubtaskHandoffSchema>
|
|
125
|
-
export type AnalysisState = z.infer<typeof AnalysisStateSchema>
|
|
126
|
-
export type PerformanceEntry = z.infer<typeof PerformanceEntrySchema>
|
|
127
|
-
export type MetricSummary = z.infer<typeof MetricSummarySchema>
|
|
128
|
-
export type PerformanceReport = z.infer<typeof PerformanceReportSchema>
|